2009-09-16 16 views
10

Soy un poco novato en esto y estoy tratando de crear una tabla de dispersión con tamaños y colores de burbuja personalizados. El gráfico se muestra bien, pero ¿cómo obtengo una leyenda que dice a qué se refieren los colores? Esto es por lo que yo tengo:Matplotlib Legend for Scatter con colores personalizados

inc = [] 
out = [] 
bal = [] 
col = [] 

fig=Figure() 
ax=fig.add_subplot(111) 

inc = (30000,20000,70000) 
out = (80000,30000,40000) 
bal = (12000,10000,6000) 
col = (1,2,3) 
leg = ('proj1','proj2','proj3') 

ax.scatter(inc, out, s=bal, c=col) 
ax.axis([0, 100000, 0, 100000]) 

ax.set_xlabel('income', fontsize=20) 
ax.set_ylabel('Expenditure', fontsize=20) 
ax.set_title('Project FInancial Positions %s' % dt) 
ax.grid(True) 
canvas=FigureCanvas(fig) 
response=HttpResponse(content_type='image/png') 
canvas.print_png(response) 

Este hilo ha sido útil, pero no pudo conseguirlo para resolver mi problema: Matplotlib: Legend not displayed properly

Respuesta

9

Quizás esto example es útil.

En general, los elementos de la leyenda están relacionados con algún tipo de objeto trazado. El scatter función/método trata a todos los círculos como un solo objeto, ver:

print type(ax.scatter(...)) 

Así, la solución es crear varios objetos. Por lo tanto, llamando al scatter varias veces.

Desafortunadamente, la versión más reciente de matplotlib parece no usar un rectángulo en la leyenda. Por lo tanto, la leyenda contendrá círculos muy grandes, ya que aumentó el tamaño de los objetos de la gráfica de dispersión.

La leyenda funciona como un argumento de palabra clave markerscale para controlar el tamaño de los marcadores de leyenda, pero parece estar roto.

Actualización:

El Legend guide recomienda el uso de Proxy Artist en casos similares. El Color API explica los valores válidos fc.

p1 = Rectangle((0, 0), 1, 1, fc="b") 
p2 = Rectangle((0, 0), 1, 1, fc="g") 
p3 = Rectangle((0, 0), 1, 1, fc="r") 
legend((p1, p2, p3), ('proj1','proj2','proj3')) 

Para obtener los colores utilizados previamente en una parcela, utilice el ejemplo anterior como:

pl1, = plot(x1, y1, '.', alpha=0.1, label='plot1') 
pl2, = plot(x2, y2, '.', alpha=0.1, label='plot2') 
p1 = Rectangle((0, 0), 1, 1, fc=pl1.get_color()) 
p2 = Rectangle((0, 0), 1, 1, fc=pl2.get_color()) 
legend((p1, p2), (pl1.get_label(), pl2.get_label()), loc='best') 

En este ejemplo se va a hacer una gráfica como:

Matplotlib with custom legend

+0

Buena solución, incluso si no funciona debido a la escala de marcado rota. – tom10

+0

Ese ejemplo es muy útil. Tengo que ir y hacer un buen trabajo por un tiempo, pero volveré a hacerlo esta noche. – PhoebeB

Cuestiones relacionadas