Comment faire un diagramme de dispersion avec des cercles vides en Python?
-
30-09-2019 - |
Question
En Python, avec Matplotlib, comment un nuage de points avec vide cercles tracer? 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.
La solution
De documentation pour la diffusion:
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()
Remarque: Pour les autres types de parcelles voir ce poste sur l'utilisation de markeredgecolor
et markerfacecolor
.
Autres conseils
Would ces travaux?
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 en cours, parcelle ou image ou 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 de l'image s'écrasa à des 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 les marqueurs chemin sont remplis.
Dans mon cas, je l'ai utilisé avec errorbars mais il fonctionne pour les marqueurs en général
http://matplotlib.org/api/_as_gen/matplotlib.axes. Axes.errorbar.html
fillstyle
accepte les valeurs suivantes: [ « full » | « Left » | « Droit » | « Bottom » | « Top » | « None »]
Il y a deux choses importantes à garder à l'esprit lorsque vous utilisez fillstyle
,
1) Si mfc est réglé sur une sorte de valeur, il est prioritaire, donc, si vous avez fait ensemble FillStyle « none » il ne serait pas en vigueur. Donc, évitez d'utiliser mfc conjuntion avec FillStyle
2) Vous pouvez contrôler la largeur du bord de marqueur (en utilisant markeredgewidth
ou mew
) parce que si le marqueur est relativement faible et le bord de largeur est épaisse, les marqueurs ressembleront remplis, même si elles ne sont pas.
Voici un exemple en utilisant errorbars:
myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue', mec='blue')
Je suppose que vous voulez mettre en évidence quelques points qui correspondent à certains critères. Vous pouvez utiliser la commande de Prélude à faire une deuxième diagramme de dispersion des points hightlighted avec un cercle vide et un premier appel à tracer tous les points. Assurez-vous que le paramter s est suffisamment petit pour les grands cercles vides pour entourer les plus petits remplis.
L'autre option consiste à ne pas utiliser la dispersion et en tirer les plaques individuellement à l'aide de la commande cercle / ellipse. Ceux-ci sont en matplotlib.patches, ici est un code exemple sur la façon de dessiner des cercles rectangles etc.