¿Cómo hacer un diagtwig de dispersión con círculos vacíos en Python?

En Python, con Matplotlib, ¿cómo se puede trazar un diagtwig de dispersión con círculos vacíos ? El objective es dibujar círculos vacíos alrededor de algunos de los discos coloreados ya trazados por scatter() , para resaltarlos, idealmente sin tener que volver a dibujar los círculos coloreados.

Intenté facecolors=None , en vano.

De la documentación para dispersión:

 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 

Intente lo siguiente:

 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() 

imagen de ejemplo

Nota: para otros tipos de gráficos, consulte esta publicación sobre el uso de markeredgecolor y markerfacecolor .

¿Funcionarían?

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

imagen de ejemplo

o utilizando plot ()

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

imagen de ejemplo

Aquí hay otra manera: esto agrega un círculo a los ejes actuales, el gráfico o la imagen o lo que sea:

 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 ) 

texto alternativo

(Los círculos en la imagen se imshow aspect="auto" a puntos suspensivos porque imshow aspect="auto" ).

En matplotlib 2.0 hay un parámetro llamado estilo de fillstyle que permite un mejor control sobre la forma en que se llenan los marcadores. En mi caso lo he usado con barras de errores pero funciona para los marcadores en general http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyle acepta los siguientes valores: [‘full’ | ‘izquierda’ | ‘derecho’ | ‘abajo’ | ‘top’ | ‘ninguna’]

Hay dos cosas importantes a tener en cuenta cuando se utiliza el estilo de fillstyle ,

1) Si mfc se establece en cualquier tipo de valor, tendrá prioridad, por lo tanto, si establece el estilo de relleno en “ninguno” no tendrá efecto. Así que evite usar mfc en combinación con fillstyle

2) Es posible que desee controlar el ancho del borde del marcador (utilizando markeredgewidth o mew ) porque si el marcador es relativamente pequeño y el ancho del borde es grueso, los marcadores se verán rellenos aunque no lo estén.

A continuación se muestra un ejemplo utilizando barras de errores:

 myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue', mec='blue') 

Así que supongo que desea resaltar algunos puntos que se ajustan a ciertos criterios. Puede usar el comando de Prelude para hacer un segundo diagtwig de dispersión de los puntos resaltados con un círculo vacío y una primera llamada para trazar todos los puntos. Asegúrese de que el parámetro s sea lo suficientemente pequeño para que los círculos vacíos más grandes encierren los rellenos más pequeños.

La otra opción es no usar la dispersión y dibujar los parches individualmente usando el comando círculo / elipse. Estos están en matplotlib.patches, aquí hay un código de ejemplo sobre cómo dibujar círculos, rectangularjs, etc.