Mam wykres z dwiema osiami Y, używając twinx()
. Daję również etykiety do linii i chcę je pokazać legend()
, ale udało mi się uzyskać etykiety tylko jednej osi w legendzie:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('mathtext', default='regular')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(time, Swdown, '-', label = 'Swdown')
ax.plot(time, Rn, '-', label = 'Rn')
ax2 = ax.twinx()
ax2.plot(time, temp, '-r', label = 'temp')
ax.legend(loc=0)
ax.grid()
ax.set_xlabel("Time (h)")
ax.set_ylabel(r"Radiation ($MJ\,m^{-2}\,d^{-1}$)")
ax2.set_ylabel(r"Temperature ($^\circ$C)")
ax2.set_ylim(0, 35)
ax.set_ylim(-20,100)
plt.show()
Dostaję więc tylko etykiety pierwszej osi w legendzie, a nie etykietę „temp” drugiej osi. Jak mogę dodać tę trzecią etykietę do legendy?
python
matplotlib
axis
legend
joris
źródło
źródło
ax
stylu, w którym używamax2
: w Twoja sprawa,ax.plot([], [], '-r', label = 'temp')
. Jest to znacznie szybsze i prostsze niż robienie tego poprawnie ...Odpowiedzi:
Możesz łatwo dodać drugą legendę, dodając wiersz:
Dostaniesz to:
Ale jeśli chcesz mieć wszystkie etykiety w jednej legendzie, powinieneś zrobić coś takiego:
Co da ci to:
źródło
errorbar
działkami. Aby uzyskać rozwiązanie, które poprawnie je obsługuje, zobacz poniżej: stackoverflow.com/a/10129461/1319447ax1
. W takim przypadku użyj,lns1=ax1.lines
a następnie dołączlns2
do tej listy.loc
są wyjaśnione tutajNie jestem pewien, czy ta funkcja jest nowa, ale możesz także użyć metody get_legend_handles_labels () zamiast samodzielnie śledzić linie i etykiety:
źródło
errorbar
wykresami, podczas gdy zaakceptowane nie powiedzie się (osobne wyświetlanie linii i jej pasków błędów, a żadne z nich nie ma właściwej etykiety). Plus jest prostsze.ax2
i nie ma jednego zestawu od samego początkuPocząwszy od wersji 2.1 Matplotlib, możesz używać legendy figur . Zamiast
ax.legend()
, który tworzy legendę z uchwytami z osiax
, można stworzyć legendę figurktóry zgromadzi wszystkie uchwyty ze wszystkich podplotów na rysunku. Ponieważ jest to legenda figury, zostanie umieszczona w rogu figury, a
loc
argument dotyczy figury.Aby umieścić legendę z powrotem w osiach, należy podać a
bbox_to_anchor
i abbox_transform
. Ta ostatnia byłaby transformacją osi osi, w której legenda powinna się znajdować. Pierwszą mogą być współrzędne krawędzi określone przezloc
podane we współrzędnych osi.źródło
conda upgrade matplotlib
znaleźć nowszych wersji, nadal używam v.2.0.2Możesz łatwo uzyskać to, co chcesz, dodając linię w axe:
lub
Nie wykreśliłoby to nic oprócz dodania etykiety do legendy topora.
Myślę, że jest to o wiele łatwiejszy sposób. Nie jest konieczne automatyczne śledzenie linii, gdy masz tylko kilka linii w drugiej osi, ponieważ ręczne mocowanie tak jak powyżej byłoby dość łatwe. W każdym razie zależy to od tego, czego potrzebujesz.
Cały kod jest jak poniżej:
Fabuła jest jak poniżej:
Aktualizacja: dodaj lepszą wersję:
To nic nie zrobi, a
plot(0, 0)
może zmienić zakres osi.Dodatkowy przykład rozproszenia
źródło
Szybki hack, który może odpowiadać Twoim potrzebom ...
Zdejmij ramkę pudełka i ręcznie ustaw dwie legendy obok siebie. Coś takiego..
Gdzie krotka loc jest procentem od lewej do prawej i od dołu do góry, które reprezentują lokalizację na wykresie.
źródło
Znalazłem następujący oficjalny przykład matplotlib, który używa host_subplot do wyświetlania wielu osi Y i wszystkich różnych etykiet w jednej legendzie. Nie jest konieczne obejście tego problemu. Najlepsze rozwiązanie, jakie do tej pory znalazłem. http://matplotlib.org/examples/axes_grid/demo_parasite_axes2.html
źródło