2009-09-16 3 views
10

Sono un po 'novizio e sto provando a creare un grafico a dispersione con dimensioni e colori delle bolle personalizzati. Il grafico viene visualizzato correttamente ma come faccio a ottenere una legenda che dice a cosa si riferiscono i colori. Questo è quanto ho:Matplotlib Legend per Scatter con colori personalizzati

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) 

Questo thread è stato utile, ma non poteva farlo per risolvere il mio problema: Matplotlib: Legend not displayed properly

risposta

9

Forse questo example è utile.

In generale, gli elementi nella legenda sono correlati a qualche tipo di oggetto . Il/metodo scatter funzione tratta tutti i cerchi come un unico oggetto, vedi:

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

Quindi la soluzione è quella di creare più oggetti. Quindi, chiamando scatter più volte.

Sfortunatamente, la versione più recente di matplotlib sembra non utilizzare un rettangolo nella legenda. Pertanto, la legenda conterrà cerchi molto grandi, dal momento che hai aumentato le dimensioni degli oggetti grafici a dispersione.

La funzione di legenda come argomento di parola markerscale per controllare la dimensione dei marcatori di legenda, ma sembra essere interrotta.

Aggiornamento:

Il Legend guide raccomanda utilizzando Proxy Artist in casi simili. Il Color API spiega i valori validi 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')) 

Per ottenere i colori utilizzati in precedenza in una trama, utilizzare l'esempio precedente come:

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

Questo esempio farà una trama simile:

Matplotlib with custom legend

+0

Buona soluzione, anche se non funziona a causa della rottura del piano. – tom10

+0

Questo esempio è molto utile. Devo andare a fare il lavoro giusto per un po ', ma tornerò su questa sera. – PhoebeB