2015-08-09 16 views
5

vorrei fare una voce di legenda in un qualcosa di matplotlib simile a questa:Python Matplotlib multicolore Leggenda Entry

enter image description here

Ha più colori per un determinato elemento leggenda. Il codice è mostrato sotto che emette un rettangolo rosso. Mi chiedo che cosa devo fare per sovrapporre un colore ontop di un altro? O c'è una soluzione migliore?

risposta

0

Probabilmente non è esattamente quello che stai cercando, ma puoi farlo (molto) manualmente posizionando le patch e testo sulla trama. Per esempio:

import matplotlib.patches as mpatches 
import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 

red_patch = mpatches.Patch(color='red', label='Foo') 
plt.legend(handles=[red_patch]) 

r1 = mpatches.Rectangle((0.1, 0.1), 0.18, 0.1, fill=False) 
r2 = mpatches.Rectangle((0.12, 0.12), 0.03, 0.06, fill=True, color='red') 
r3 = mpatches.Rectangle((0.15, 0.12), 0.03, 0.06, fill=True, color='blue') 
ax.add_patch(r1) 
ax.add_patch(r2) 
ax.add_patch(r3) 
ax.annotate('Foo', (0.2, 0.13), fontsize='x-large') 

plt.show() 
1

La soluzione che propongo è quello di combinare due diversi proxy-artists per una leggenda ingresso, come descritto qui: Combine two Pyplot patches for legend.

La strategia è quindi di impostare la fillstyle del primo marcatore piazza per left mentre l'altro è impostato su right (vedi http://matplotlib.org/1.3.0/examples/pylab_examples/filledmarker_demo.html). Due colori diversi possono quindi essere attribuiti a ciascun marcatore per produrre la voce della legenda dei due colori desiderata.

Il codice seguente mostra come questo può essere fatto. Si noti che l'argomento in plt.legend è importante per visualizzare solo un marcatore per ciascuna voce.

import matplotlib.pyplot as plt 

plt.close('all') 

#---- Generate a Figure ---- 

fig = plt.figure(figsize=(4, 4)) 
ax = fig.add_axes([0.15, 0.15, 0.75, 0.75]) 
ax.axis([0, 1, 0, 1]) 

#---- Define First Legend Entry ---- 

m1, = ax.plot([], [], c='red' , marker='s', markersize=20, 
       fillstyle='left', linestyle='none') 

m2, = ax.plot([], [], c='blue' , marker='s', markersize=20, 
       fillstyle='right', linestyle='none') 

#---- Define Second Legend Entry ---- 

m3, = ax.plot([], [], c='cyan' , marker='s', markersize=20, 
       fillstyle='left', linestyle='none') 

m4, = ax.plot([], [], c='magenta' , marker='s', markersize=20, 
       fillstyle='right', linestyle='none') 

#---- Plot Legend ---- 

ax.legend(((m2, m1), (m3, m4)), ('Foo', 'Foo2'), numpoints=1, labelspacing=2, 
      loc='center', fontsize=16) 

plt.show(block=False) 

che si traduce in:

enter image description here

responsabilità: questo funziona solo per una voce di legenda a due colori. Se si desidera più di due colori, non riesco a pensare ad altro modo per farlo a parte l'approccio descritto da @jwinterm (Python Matplotlib Multi-color Legend Entry)