Kreślę ten sam typ informacji, ale dla różnych krajów, z wieloma podplotami z matplotlib. Oznacza to, że mam 9 działek 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.
W jaki sposób mogę to zrobić?
python
matplotlib
pocketfullofcheese
źródło
źródło
handles, labels = [(a + b) for a, b in zip(ax1.get_legend_handles_labels(), ax2.get_legend_handles_labels())]
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:
lub:
źródło
lines
ustawić zmienną jako argumentlegend
?lines
to lista wyników, które są zwracane przezaxes.plot()
(tj. każdaaxes.plot
lub podobna procedura zwraca „wiersz”). Zobacz także połączony przykład.W przypadku automatycznego pozycjonowania pojedynczej legendy w a
figure
z wieloma osiami, jak te uzyskane za pomocąsubplots()
, następujące rozwiązanie działa naprawdę dobrze:Za pomocą
bbox_to_anchor
ibbox_transform=plt.gcf().transFigure
definiujesz nową obwiednię o swoim rozmiarze,figure
do której ma być odniesienieloc
. Użycie(0,-0.1,1,1)
przesuwa tę kostkę w dół, aby zapobiec umieszczeniu legendy nad innymi artystami.OBS: użyj tego rozwiązania PO
fig.set_size_inches()
i PRZED użyciemfig.tight_layout()
źródło
loc='upper center', bbox_to_anchor=(0.5, 0), bbox_transform=plt.gcf().transFigure
i na pewno się nie pokryje.Wystarczy tylko raz zapytać o legendę, poza swoją pętlą.
Na przykład w tym przypadku mam 4 wykresy podrzędne z tymi samymi liniami i jedną legendą.
źródło
figlegend
Jak sugested przez Evert, wydaje się być o wiele lepsze rozwiązanie;)fig.legend()
polega na tym, że wymaga identyfikacji dla wszystkich linii (działek) ... ponieważ dla każdego wykresu cząstkowego używam pętli do generowania linii, jedynym rozwiązaniem, które wymyśliłem, aby to przezwyciężyć, jest utworzenie pustej listy przed druga pętla, a następnie dołączam wiersze podczas ich tworzenia ... Następnie używam tej listy jako argumentufig.legend()
funkcji.dados
tam jest ?dados
był to zbiór danych z pliku netCDF4 (dla każdego z plików zdefiniowanych na liścieficheiros
). W każdej pętli odczytywany jest inny plik i do figury dodawany jest wykres cząstkowy.Zauważyłem, że żadna odpowiedź nie wyświetla obrazu z pojedynczą legendą odwołującą się do wielu krzywych na różnych wykresach cząstkowych, więc muszę ci pokazać jedną ... żeby zaciekawić ...
Teraz chcesz spojrzeć na kod, prawda?
Dwie linie
zasługuję na wyjaśnienie - w tym celu zawarłem trudną część w funkcji, tylko 4 linie kodu, ale mocno skomentowałem
PS Zdaję sobie sprawę, że
sum(list_of_lists, [])
jest to naprawdę nieefektywna metoda spłaszczania listy list, ale ① Uwielbiam jego zwartość ② zwykle jest kilka krzywych w kilku podplotach i ③ Matplotlib i wydajność? ;-)źródło
Chociaż dość późno w grze, podam tutaj inne rozwiązanie, ponieważ jest to nadal jeden z pierwszych linków, które pojawiają się w Google. Korzystając z matplotlib 2.2.2, można to osiągnąć za pomocą funkcji gridspec. W poniższym przykładzie celem jest utworzenie czterech wykresów cząstkowych ułożonych w układzie 2x2 z legendą pokazaną na dole. U dołu tworzona jest „fałszywa” oś, aby umieścić legendę w ustalonym miejscu. „Faux” oś jest następnie wyłączana, więc widać tylko legendę. Wynik: https://i.stack.imgur.com/5LUWM.png .
źródło
jeśli używasz wykresów podrzędnych z wykresami słupkowymi, z różnymi kolorami dla każdego słupka. samodzielne tworzenie artefaktów może być szybsze
mpatches
Powiedzmy, że masz cztery paski w różnych kolorach, ponieważ
r
m
c
k
możesz ustawić legendę w następujący sposóbźródło
plt.legend
jednej legendy dla wszystkich moich wątków pobocznychhandles, _ = plt.gca().get_legend_handles_labels()
fig.legend(handles, labels)
Ta odpowiedź jest uzupełnieniem @ Evert na pozycji legendy.
Moja pierwsza próba rozwiązania @ Evert nie powiodła się z powodu nakładania się legendy i tytułu wątku cząstkowego.
W rzeczywistości nakładanie się jest spowodowane przez
fig.tight_layout()
, co zmienia układ wykresów podrzędnych bez uwzględnienia legendy rysunku. Jednakfig.tight_layout()
jest to konieczne.Aby uniknąć nakładania się, możemy
fig.tight_layout()
zostawić spacje na legendę postaci przezfig.tight_layout(rect=(0,0,1,0.9))
.Opis parametrów tight_layout () .
źródło
Aby zbudować na podstawie odpowiedzi @ gboffi i Bena Usmana:
W sytuacji, gdy ktoś ma różne linie na różnych działkach o tym samym kolorze i etykiecie, można zrobić coś na wzór linii
źródło