Pregunta

En Python, con Matplotlib, ¿cómo puede un gráfico de dispersión con vacío trazar círculos? El objetivo es dibujar círculos vacíos alrededor de algunos de los discos de colores ya trazados por scatter(), con el fin de resaltar que, a ser posible sin tener que volver a dibujar los círculos de colores.

Me trató facecolors=None, sin ningún resultado.

¿Fue útil?

Solución

Desde el documentación para la 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

Trate 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 parcelas ver este post sobre el uso de markeredgecolor y markerfacecolor.

Otros consejos

¿Estos trabajos?

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

imagen de ejemplo

o usando plot ()

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

imagen de ejemplo

Aquí hay otra manera: se añade un círculo a los ejes actual, la trama o 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 )

text alt

(Los círculos en la imagen obtener aplastó a elipses porque imshow aspect="auto").

En matplotlib 2,0 hay un parámetro llamado fillstyle lo que permite un mejor control en el camino marcadores están llenos. En mi caso he utilizado con errorbars pero funciona para los marcadores en general http://matplotlib.org/api/_as_gen/matplotlib.axes. Axes.errorbar.html

fillstyle acepta los valores siguientes: [ ‘completo’ | ‘Izquierda’ | ‘Derecho’ | ‘Inferior’ | ‘Superior’ | ‘Ninguno’]

Hay dos cosas importantes a tener en cuenta al utilizar fillstyle,

1) Si MFC está configurado en cualquier tipo de valor que tendrá prioridad, por lo tanto, si lo hiciera conjunto FillStyle 'none' no tendría efecto. Por lo tanto evitar el uso de MFC en conjunción con FillStyle

2) Es posible que desee controlar el ancho del borde del marcador (usando markeredgewidth o mew) porque si el marcador es relativamente pequeño y el borde ancho es gruesa, los marcadores se parecerán llenos a pesar de que no lo son.

siguiente es un ejemplo usando errorbars:

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

Así que supongo que quiere resaltar algunos puntos que se ajustan a determinados criterios. Puede utilizar el comando de preludio a hacer un segundo gráfico de dispersión de los puntos hightlighted con un círculo vacío y una primera llamada para trazar todos los puntos. Asegúrese de que el parametro s es lo suficientemente pequeño para los círculos vacíos más grandes que encierran los rellenos más pequeños.

La otra opción es no utilizar la dispersión y sacar los parches de forma individual utilizando el comando círculo / elipse. Estos son en matplotlib.patches, aquí es un código de ejemplo sobre cómo dibujar círculos rectángulos, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top