2013-01-15 21 views
20

Mam następujący przykładowy kod:pojedyncze legenda dla wielu osi

fig1.suptitle('Test') 
ax1 = fig1.add_subplot(221) 
ax1.plot(x,y1,color='b',label='aVal') 
ax2 = ax1.twinx() 
ax2.plot(x,y2,color='g',label='bVal') 
ax2.grid(ls='--', color='black') 
legend([ax1,ax2], loc=2) 

poletko ma dwie osie o różnych skalach na tej samej poletko i chcę tylko jedną legendę dla obu osi. Próbowałem powyższego kodu i to nie działa i produkuje tylko dane z ax2. Jakieś pomysły?

+0

Zobacz http://stackoverflow.com/questions/5484922/secondary- ax-with-twinx-how-to-to-legenda dla tego samego pytania. I daje również to samo rozwiązanie. – joris

+1

Tak, robi. Moje poszukiwania na SO nie podniosły tego. Ponadto, pytanie nie mówi, że potrzebuje jednej legendy na tytule. Ale dzięki, że mnie powiadomiłeś. Zastanawiałem się, czy było coś bardziej eleganckiego niż to, co wymyśliłem. Może powinniśmy dodać metodę ax1.combine_legends (ax2), która to robi? – arun

Odpowiedz

43

Pomyślałem, że to rozwiązanie działa! Czy istnieje lepszy sposób niż to?

fig1.suptitle('Test') 
ax1 = fig1.add_subplot(221) 
ax1.plot(x,y1,color='b',label='aVal') 
ax2 = ax1.twinx() 
ax2.plot(x,y2,color='g',label='bVal') 
ax2.grid(ls='--', color='black') 
h1, l1 = ax1.get_legend_handles_labels() 
h2, l2 = ax2.get_legend_handles_labels() 
ax1.legend(h1+h2, l1+l2, loc=2) 
+0

to działa dla mnie! – gnr

1

To rzeczywiście jest stary post, ale myślę, że znalazłem łatwiejszy sposób pozwalający na większą kontrolę.

Oto ona (matplotlib wersja '1.5.3'.) Na python3.5:

import matplotlib.pyplot as plt 
fig, ax1 = plt.subplots() 
plt.suptitle('Test') 
ax2 = ax1.twinx() 
a, = ax1.plot([1, 2, 3], [4, 5, 6], color= 'blue', label= 'plt1') 
b, = ax2.plot([7, 8, 9],[10, 11, 12], color= 'green', label= 'plt2') 
p = [a, b] 
ax1.legend(p, [p_.get_label() for p_ in p], 
      loc= 'upper center', fontsize= 'small') 

show()

Powiązane problemy