2011-09-23 21 views
60

zacząłem z matplot i udało kilka podstawowych działek, ale teraz trudno dowiedzieć się, jak zrobić kilka rzeczy muszę teraz :(matplotlib - globalny legenda i tytuł bok wątków

Moje pytanie brzmi, jak rzeczywista umieścić globalny tytuł i globalną legendę na rysunku z subplots

Robię spiski 2x3, gdzie mam wiele różnych wykresów w różnych kolorach (około 200) .Aby odróżnić (większość) z nich napisałem coś lubię:

def style(i, total): 
    return dict(color=jet(i/total), 
       linestyle=["-", "--", "-.", ":"][i%4], 
       marker=["+", "*", "1", "2", "3", "4", "s"][i%7]) 

fig=plt.figure() 
p0=fig.add_subplot(321) 
for i, y in enumerate(data): 
    p0.plot(x, trans0(y), "-", label=i, **style(i, total)) 
# and more subplots with other transN functions 

(jakiekolwiek myśli na ten temat? :)) Każdy wątek ma tę samą funkcję stylu.

Teraz próbuję uzyskać globalny tytuł dla wszystkich wątków, a także globalną legendę, która wyjaśnia wszystkie style. Muszę również zrobić małą czcionkę, aby pasowała do wszystkich 200 stylów (nie potrzebuję zupełnie unikalnych stylów, ale przynajmniej niektóre próby).

Czy ktoś może mi pomóc rozwiązać to zadanie?

+1

Globalny tytuł: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html –

Odpowiedz

112

Globalny tytuł: W nowszych wydaniach matplotlib można użyć Figure.suptitle().

from pylab import * 
fig = gcf() 
fig.suptitle("Title centered above all subplots", fontsize=14) 
+33

Dla tych importowania tak : 'import matplotlib.pyplot as plt', polecenie można wprowadzić po prostu jako' plt.figure(); plt.suptitle ("Tytuł wyśrodkowany powyżej wszystkich podpól"); plt.subplot (231); plt.plot (dane [:, 0], dane [:, 1]); 'etc ... –

+0

Dzięki. Powinna to być rzeczywista wybrana odpowiedź. – gustafbstrom

7

W przypadku etykiet legendy można użyć czegoś podobnego do poniższego. Legendlabels to zapisane linie działek. modFreq to nazwa rzeczywistych etykiet odpowiadających liniom wykresów. Następnie trzecim parametrem jest lokalizacja legendy. Na koniec możesz przekazać jakiekolwiek argumenty, tak jak ja tutaj, ale głównie potrzebuję pierwszych trzech. Powinieneś także, jeśli poprawnie ustawisz etykiety w komendzie fabuły. Aby po prostu wywołać legendę za pomocą parametru lokalizacji, znajdzie etykiety w każdym z wierszy. Mam więcej szczęścia, tworząc własną legendę, jak poniżej. Wydaje się, że działa we wszystkich przypadkach, w których nigdy nie wydawało się, że działa w inny sposób. Jeśli nie rozumiesz, daj mi znać:

legendLabels = [] 
for i in range(modSize): 
    legendLabels.append(ax.plot(x,hstack((array([0]),actSum[j,semi,i,semi])), color=plotColor[i%8], dashes=dashes[i%4])[0]) #linestyle=dashs[i%4]  
legArgs = dict(title='AM Templates (Hz)',bbox_to_anchor=[.4,1.05],borderpad=0.1,labelspacing=0,handlelength=1.8,handletextpad=0.05,frameon=False,ncol=4, columnspacing=0.02) #ncol,numpoints,columnspacing,title,bbox_transform,prop 
leg = ax.legend(tuple(legendLabels),tuple(modFreq),'upper center',**legArgs) 
leg.get_title().set_fontsize(tick_size) 

Możesz także użyć nogi, aby zmienić rozmiar czcionki lub prawie dowolny parametr legendy.

Globalny tytuł jak wskazano w powyższym komentarzu można zrobić z dodawanie tekstu na podany link: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html

f.text(0.5,0.975,'The new formatter, default settings',horizontalalignment='center', 
     verticalalignment='top') 
3

suptitle wydaje się droga, ale za to, co warte The figure ma właściwość transFigure które można użyć:

fig=figure(1) 
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center') 
20

Oprócz orbeckst answer jeden kupili także przesunąć subplots w dół. Oto MWE w stylu OOP:

import matplotlib.pyplot as plt 

fig = plt.figure() 
st = fig.suptitle("suptitle", fontsize="x-large") 

ax1 = fig.add_subplot(311) 
ax1.plot([1,2,3]) 
ax1.set_title("ax1") 

ax2 = fig.add_subplot(312) 
ax2.plot([1,2,3]) 
ax2.set_title("ax2") 

ax3 = fig.add_subplot(313) 
ax3.plot([1,2,3]) 
ax3.set_title("ax3") 

fig.tight_layout() 

# shift subplots down: 
st.set_y(0.95) 
fig.subplots_adjust(top=0.85) 

fig.savefig("test.png") 

daje:

enter image description here

Powiązane problemy