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.
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()
Note: pour les autres types de parcelles, voir cet article sur l'utilisation de markeredgecolor
et markerfacecolor
.
ça marcherait?
plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none')
ou en utilisant plot ()
plt.plot(np.random.randn(100), np.random.randn(100), 'o', mfc='none')
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 )
(les cercles dans l'image sont écrasés aux ellipses parce que imshow aspect="auto"
).
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')
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.