2012-02-13 18 views
8

Aquí es una representación gráfica simplificada de la situación:Matplotlib, leyenda con múltiples marcadores diferentes con una etiqueta

plot example

En lugar de tener cada marcador punto de datos tiene una etiqueta separada, Quiero ser capaz de tener una etiqueta para un conjunto de marcadores diferentes. Me gustaría ser capaz de tener una leyenda como:

<triangle> <square> <hexagon> <diamond> <circle> Shotcrete strength data points 
<green line> 10 minute strength 
<blue line> 60 minute strength 
<yellow line> 1 day strength 
<orange line> 7 day strength 
<red line> 28 day strength 

quiero hacer esto porque en la trama final que tendrá tres conjuntos de puntos de datos y mostrando 18 (3 series * 6 puntos/set) marcador/las combinaciones de etiquetas serán desordenadas.

Estoy usando Matplotlib con Python 2.7.

Respuesta

3

Nota: Esta respuesta se mantiene como una guía para la respuesta correcta, pero no resuelve el problema establecido. Consulte la edición a continuación para conocer el problema de las colecciones de parches que no son compatibles en matplotlib.


Una forma de hacer esto, si desea una personalización completa es utilizar una llamada Proxy Artista:

from pylab import * 

p1 = Rectangle((0, 0), 1, 1, fc="r") 
p2 = Circle((0, 0), fc="b") 
p3 = plot([10,20],'g--') 
legend([p1,p2,p3], ["Red Rectangle","Blue Circle","Green-dash"]) 

show() 

Aquí puede especificar exactamente lo desea la leyenda para parecer, e incluso utilizar formas de parcela no estándar (parches).

Editar: Hay algunas dificultades con este método, matplotlib only supports these Artists in a legend sin ajustar. Para matplotlib v1.0 y versiones anteriores, los artistas compatibles son los siguientes.

Line2D 
Patch 
LineCollection 
RegularPolyCollection 
CircleCollection 

Su solicitud de múltiples puntos de dispersión se realiza con un Patch Collection, que no está soportada por encima. En teoría con v1.1, esto es posible, pero no veo cómo.

+1

Actualmente estoy usando líneas de psuedo para hacer mi leyenda. Creo que podría usar algo como esto (http://matplotlib.sourceforge.net/users/legend_guide.html#legend-handler): 'código' z = np.random.randn (10) p1a, = plt.plot (z, "ro", ms = 10, mfc = "r", mew = 2, mec = "r") # círculo lleno de rojo p1b, = plt.plot (z [: 5 ], "w +", ms = 10, mec = "w", mew = 2) # cruz blanca plt.legend ([p1a, (p1a, p1b)], ["Attr A", "Attr A + B "]) ' código' para combinar múltiples marcadores en una línea. – CrazyArm

+0

@CrazyArm por lo que yo entiendo, que tendrá que definir una forma personalizada para el '' por lo que me dio la solución que yo. Puede extraer la forma del símbolo de la fuente de la gráfica de dispersión (o de la propia dispersión) y usarla con la forma personalizada como entrada a 'legend'. – Hooked

+0

Gracias. Creo que entiendo cómo hacer un marcador personalizado individual en la leyenda (un rectángulo o círculo como usted mencionó), pero no sé cómo combinar dos de ellos. Esto (http://matplotlib.sourceforge.net/examples/api/scatter_piecharts.html) lo hace mediante la superposición de varios símbolos, pero no sé cómo lo mostrarían en una leyenda. – CrazyArm

Cuestiones relacionadas