Comment faire un scatter plot avec des cercles vides en Python?

en Python, avec Matplotlib, comment tracer un nuage de points avec cercles vides ? Le but est de dessiner des cercles vides autour de certains des disques colorés déjà tracés par scatter() , afin de les mettre en évidence, idéalement sans avoir à redessiner les cercles colorés.

j'ai essayé facecolors=None , en vain.

105
demandé sur Eric Lebigot 2010-11-10 13:34:09

5 réponses

De la documentation scatter:

Optional kwargs control the Collection properties; in particular:

    edgecolors:
        The string ‘none’ to plot faces with no outlines
    facecolors:
        The string ‘none’ to plot unfilled outlines

essayez ce qui suit:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.random.randn(60) 
y = np.random.randn(60)

plt.scatter(x, y, s=80, facecolors='none', edgecolors='r')
plt.show()

example image

Note: pour les autres types de parcelles, voir cet article sur l'utilisation de markeredgecolor et markerfacecolor .

159
répondu Gary Kerr 2017-05-23 12:10:41

ça marcherait?

plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none')

example image

ou en utilisant plot ()

plt.plot(np.random.randn(100), np.random.randn(100), 'o', mfc='none')

example image

46
répondu Gökhan Sever 2012-08-31 00:29:12

Voici une autre façon: cela ajoute un cercle aux axes actuels, parcelle ou image ou quoi que ce soit:

from matplotlib.patches import Circle  # $matplotlib/patches.py

def circle( xy, radius, color="lightsteelblue", facecolor="none", alpha=1, ax=None ):
    """ add a circle to ax= or current axes
    """
        # from .../pylab_examples/ellipse_demo.py
    e = Circle( xy=xy, radius=radius )
    if ax is None:
        ax = pl.gca()  # ax = subplot( 1,1,1 )
    ax.add_artist(e)
    e.set_clip_box(ax.bbox)
    e.set_edgecolor( color )
    e.set_facecolor( facecolor )  # "none" not None
    e.set_alpha( alpha )

alt text

(les cercles dans l'image sont écrasés aux ellipses parce que imshow aspect="auto" ).

13
répondu denis 2010-11-23 12:20:06

dans matplotlib 2.0 Il y a un paramètre appelé fillstyle ce qui permet un meilleur contrôle sur la manière dont les marqueurs sont remplis. Dans mon cas, je l'ai utilisé avec errorbars, mais il fonctionne pour les marques en général http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyle accepte les valeurs suivantes: ["full" | "gauche" | "droite" | ‘bas’ | ‘haut’ | ‘none’]

Il y a deux choses importantes à garder à l'esprit lors de l'utilisation de fillstyle ,

1) Si mfc est défini à n'importe quelle valeur, il aura la priorité, donc, si vous avez défini fillstyle à 'none' Il n'aurait pas d'effet. Donc, éviter d'utiliser mfc en conjonction avec fillstyle

2 ) vous pourriez vouloir contrôler la largeur du bord du marqueur (en utilisant markeredgewidth ou mew ) parce que si le marqueur est relativement petit et la largeur du bord est épaisse, les marqueurs ressembleront remplis même s'ils ne le sont pas.

exemple d'errorbars:

myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue',  mec='blue')
2
répondu Salvatore Cosentino 2017-09-11 06:32:04

donc je suppose que vous voulez mettre en évidence certains points qui correspondent à un certain critère. Vous pouvez utiliser la commande de Prelude pour faire un deuxième scatterplot des points éclairés avec un cercle vide et un premier appel pour tracer tous les points. Assurez-vous que le paramétreur s est suffisamment petit pour que les grands cercles vides contiennent les petits cercles pleins.

l'autre option est de ne pas utiliser scatter et de dessiner les patches individuellement en utilisant la commande cercle/ellipse. Ceux-ci sont en matplotlib.patches, ici est un exemple de code sur la façon de dessiner des cercles rectangles, etc.

1
répondu whatnick 2010-11-10 16:35:45