jak utworzyć jedną legendę dla wielu podpowiedzi za pomocą matplotlib?
Kreślę ten sam rodzaj informacji, ale dla różnych krajów, z wieloma podpunktami z matplotlib. Oznacza to, że mam 9 wykresów na siatce 3x3, wszystkie z tym samym dla linii (oczywiście różne wartości na linię).
Jednak nie wymyśliłem, jak umieścić jedną legendę (ponieważ wszystkie 9 wątków ma te same linie) na rysunku tylko raz.
Jak to zrobić?
6 answers
Figlegend może być tym, czego szukasz: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend
Przykład tutaj: http://matplotlib.org/examples/pylab_examples/figlegend_demo.html
Inny przykład:
plt.figlegend( lines, labels, loc = 'lower center', ncol=5, labelspacing=0. )
Lub:
fig.legend( lines, labels, loc = (0.5, 0), ncol=5 )
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 02:05:19
Istnieje również funkcja get_legend_handles_labels()
, którą możesz wywołać na ostatniej osi (Jeśli nad nią iterujesz), która zbierze wszystko, czego potrzebujesz z label=
argumentów:
handles, labels = ax.get_legend_handles_labels()
fig.legend(handles, labels, loc='upper center')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 23:36:18
Musisz tylko raz poprosić o legendę, poza swoją pętlą.
Na przykład, w tym przypadku mam 4 podprogramy, z tymi samymi liniami, i jedną legendę.
from matplotlib.pyplot import *
ficheiros = ['120318.nc', '120319.nc', '120320.nc', '120321.nc']
fig = figure()
fig.suptitle('concentration profile analysis')
for a in range(len(ficheiros)):
# dados is here defined
level = dados.variables['level'][:]
ax = fig.add_subplot(2,2,a+1)
xticks(range(8), ['0h','3h','6h','9h','12h','15h','18h','21h'])
ax.set_xlabel('time (hours)')
ax.set_ylabel('CONC ($\mu g. m^{-3}$)')
for index in range(len(level)):
conc = dados.variables['CONC'][4:12,index] * 1e9
ax.plot(conc,label=str(level[index])+'m')
dados.close()
ax.legend(bbox_to_anchor=(1.05, 0), loc='lower left', borderaxespad=0.)
# it will place the legend on the outer right-hand side of the last axes
show()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-23 11:14:31
Do automatycznego pozycjonowania pojedynczej legendy w {[1] } z wieloma osiami, jak te uzyskane z subplots()
, następujące rozwiązanie działa naprawdę dobrze:
plt.legend( lines, labels, loc = 'lower center', bbox_to_anchor = (0,-0.1,1,1),
bbox_transform = plt.gcf().transFigure )
Za pomocą bbox_to_anchor
i bbox_transform=plt.gcf().transFigure
definiujesz nową obwiednię o rozmiarze figure
jako odniesienie dla loc
. Użycie (0,-0.1,1,1)
przesuwa tę budkę lekko w dół, aby nie dopuścić do umieszczenia legendy nad innymi artystami.
OBS: użyj tego roztworu po użyciu fig.set_size_inches()
i przed użyciem fig.tight_layout()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 18:54:50
Choć dość późno do gry, podam inne rozwiązanie tutaj, ponieważ jest to nadal jeden z pierwszych linków, które pojawiają się w google. Za pomocą matplotlib 2.2.2 można to osiągnąć za pomocą funkcji gridspec. W poniższym przykładzie celem jest stworzenie czterech podprogramów ułożonych w sposób 2x2 z legendą pokazaną na dole. Na dole tworzona jest oś "sztuczna", aby umieścić legendę w ustalonym miejscu. Oś "sztuczna" jest następnie wyłączana, więc pokazuje to tylko legenda. Wynik: https://i.stack.imgur.com/5LUWM.png .
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
#Gridspec demo
fig = plt.figure()
fig.set_size_inches(8,9)
fig.set_dpi(100)
rows = 17 #the larger the number here, the smaller the spacing around the legend
start1 = 0
end1 = int((rows-1)/2)
start2 = end1
end2 = int(rows-1)
gspec = gridspec.GridSpec(ncols=4, nrows=rows)
axes = []
axes.append(fig.add_subplot(gspec[start1:end1,0:2]))
axes.append(fig.add_subplot(gspec[start2:end2,0:2]))
axes.append(fig.add_subplot(gspec[start1:end1,2:4]))
axes.append(fig.add_subplot(gspec[start2:end2,2:4]))
axes.append(fig.add_subplot(gspec[end2,0:4]))
line, = axes[0].plot([0,1],[0,1],'b') #add some data
axes[-1].legend((line,),('Test',),loc='center') #create legend on bottommost axis
axes[-1].set_axis_off() #don't show bottommost axis
fig.tight_layout()
plt.show()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 18:31:48
Ta odpowiedź jest uzupełnieniem @Evert ' s na pozycji legendy.
Moja pierwsza próba rozwiązania @ Evert nie powiodła się z powodu nakładania się legendy i tytułu fabuły.
W rzeczywistości nakładanie się jest spowodowane przez fig.tight_layout()
, co zmienia układ podplotów bez uwzględnienia legendy rysunku. Jednak fig.tight_layout()
jest konieczne.
Aby uniknąć nakładania się, możemy powiedzieć fig.tight_layout()
, aby pozostawić spacje dla legendy figury przez fig.tight_layout(rect=(0,0,1,0.9))
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-07 18:11:56