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ć?

Author: pocketfullofcheese, 2012-03-23

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 )
 81
Author: Nathan Musoke,
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')
 31
Author: Ben Usman,
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()
 14
Author: carla,
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()

 13
Author: Saullo G. P. Castro,
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()
 2
Author: gigo318,
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)).

Opis tight_layout() parametry .

 0
Author: laven_qa,
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