2015-08-09 5 views
5

würde Ich mag eine Legende Eintrag in einem matplotlib Blick, so etwas machen:Python Matplotlib Multi-color Legende Eintrag

enter image description here

Es mehrere Farben für eine bestimmte Legende Element hat. Der Code wird unten angezeigt, der ein rotes Rechteck ausgibt. Ich frage mich, was ich tun muss, um eine Farbe übereinander zu legen? Oder gibt es eine bessere Lösung?

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

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

plt.show() 

Antwort

0

Wahrscheinlich nicht genau, was Sie suchen, aber Sie können es (sehr) manuell tun, indem Sie Patches und Text selbst auf der Handlung platzieren. Zum Beispiel:

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

Die Lösung, die ich vorschlage, ist, zwei verschiedene proxy-artists für einen Eintrag Legende zu kombinieren, wie es hier beschrieben: Combine two Pyplot patches for legend.

Die Strategie ist dann die fillstyle des ersten quadratischen Markierung left einzustellen, während der andere auf right eingestellt ist (siehe http://matplotlib.org/1.3.0/examples/pylab_examples/filledmarker_demo.html). Zwei verschiedene Farben können dann jeder Markierung zugeordnet werden, um den gewünschten zweifarbigen Legendeneintrag zu erzeugen.

Der folgende Code zeigt, wie dies durchgeführt werden kann. Beachten Sie, dass das Argument numpoints=1 in plt.legend wichtig ist, um nur einen Marker für jeden Eintrag anzuzeigen.

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) 

was zur Folge hat:

enter image description here

Haftungsausschluss: Dies wird nur für einen Zweifarben-Legende Eintrag arbeiten. Wenn mehr als zwei Farben erwünscht sind, kann ich mir keine andere Möglichkeit vorstellen, dies zu tun als die von @jwinterm (Python Matplotlib Multi-color Legend Entry)

beschriebene Methode