2012-11-09 23 views
38

Io attualmente generare la mia leggenda con matplotlib questo modo:Come rendere leggenda personalizzato in matplotlib

if t==25: 
    l1,l2 = ax2.plot(x320,vTemp320,'or',x320,vAnaTemp320,'-r') 
elif t==50: 
    l3,l4 = ax2.plot(x320,vTemp320,'ob',x320,vAnaTemp320,'-b') 
else: 
    l5,l6 = ax2.plot(x320,vTemp320,'og',x320,vAnaTemp320,'-g') 
plt.legend((l1,l2,l3,l4,l5,l6), ('t=25 Simulation', 't=25 Analytical','t=50 Simulation', 't=50 Analytical','t=500 Simulation', 't=500 Analytical'), 
    bbox_to_anchor=(-.25, 1), loc=2, borderaxespad=0.,prop={'size':12}) 

Quali opere in qualche modo vedere 1. Ma ho duplicato le informazioni nella mia leggenda.

Preferirei separare la legenda. In modo che ho diverse linee colorate corrispondenti al tempo t. E una linea normale come soluzione analitica e punti per i risultati della mia simulazione.

Qualcosa del genere

- t (linea rossa) = 25

- (linea blu) t = 50

- t (linea verde) = 500

o Simulaton

- soluzione analitica

qualcuno ora come ho potuto realizzare questo con Matplotlib?

The current image

risposta

79

è possibile scegliere gli artisti e le etichette da visualizzare nella legenda come segue. Avrai bisogno di creare artisti personalizzati per gli elementi nella legenda che non sono effettivamente tracciati.

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0,10,31) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 

#Plot analytic solution 
ax.plot(x,1*x**2, color='r', label="t = 25") 
ax.plot(x,2*x**2, color='b', label="t = 50") 
ax.plot(x,3*x**2, color='g', label="t = 500") 

#Plot simulation 
ax.plot(x,1*x**2, color='r', linestyle='', marker='o') 
ax.plot(x,2*x**2, color='b', linestyle='', marker='o') 
ax.plot(x,3*x**2, color='g', linestyle='', marker='o') 

#Get artists and labels for legend and chose which ones to display 
handles, labels = ax.get_legend_handles_labels() 
display = (0,1,2) 

#Create custom artists 
simArtist = plt.Line2D((0,1),(0,0), color='k', marker='o', linestyle='') 
anyArtist = plt.Line2D((0,1),(0,0), color='k') 

#Create legend from custom artist/label lists 
ax.legend([handle for i,handle in enumerate(handles) if i in display]+[simArtist,anyArtist], 
      [label for i,label in enumerate(labels) if i in display]+['Simulation', 'Analytic']) 

plt.show() 

Example plot

+0

Grazie che funziona perfettamente – tune2fs

+1

Questa può essere una questione di lingua inglese, ma che cosa si intende per "artista"? – LWZ

+4

Intendo la classe matplotlib [artista] (http://matplotlib.org/api/artist_api.html) –

Problemi correlati