Znam następujące pytania:
Savepl Matplotlib z legendą poza fabułą
Jak wykluczyć legendę z fabuły
Wydaje się, że odpowiedzi na te pytania mają luksus polegający na tym, że mogą bawić się dokładnie skurczeniem osi, aby legenda pasowała.
Zmniejszenie osi nie jest jednak idealnym rozwiązaniem, ponieważ powoduje zmniejszenie danych i utrudnienie interpretacji; szczególnie gdy jest złożony i dzieje się wiele rzeczy ... dlatego potrzebna jest duża legenda
Przykład złożonej legendy w dokumentacji pokazuje, że jest to konieczne, ponieważ legenda na ich wykresie faktycznie całkowicie zasłania wiele punktów danych.
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
To, co chciałbym móc zrobić, to dynamicznie powiększać rozmiar pudełka z figurkami, aby uwzględnić legendę rozwijających się figur.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')
Zwróć uwagę, że końcowa etykieta „Inverse tan” faktycznie znajduje się poza ramką z rysunkami (i wygląda na źle odciętą - nie jakość publikacji!)
W końcu powiedziano mi, że jest to normalne zachowanie w R i LaTeX, więc jestem trochę zdezorientowany, dlaczego jest to tak trudne w pythonie ... Czy istnieje powód historyczny? Czy Matlab jest równie słaby w tej sprawie?
Mam (tylko nieznacznie) dłuższą wersję tego kodu na pastebin http://pastebin.com/grVjc007
źródło
tight_layout()
należy zmienić, aby uwzględnić legendy.Odpowiedzi:
Przepraszam EMS, ale właściwie otrzymałem kolejną odpowiedź z listy mailling Matbliblib (dzięki dla Benjamina Roota).
Kod, którego szukam, dostosowuje wywołanie savefig do:
Jest to podobno podobne do wywoływania tight_layout, ale zamiast tego pozwalasz savefig na uwzględnienie dodatkowych wykonawców w obliczeniach. To faktycznie zmieniło rozmiar ramki rysunku według potrzeb.
Daje to:
[edytuj] Celem tego pytania było całkowite uniknięcie stosowania arbitralnego umieszczania współrzędnych dowolnego tekstu, podobnie jak tradycyjne rozwiązanie tych problemów. Mimo to ostatnio wiele edycji nalegało na ich wprowadzenie, często w sposób, który doprowadził do błędu w kodzie. Naprawiłem teraz problemy i uporządkowałem dowolny tekst, aby pokazać, w jaki sposób są one uwzględniane w algorytmie bbox_extra_artists.
źródło
plt.show()
. Masz jakieś rozwiązanie?fig.legend()
metody , naprawdę dziwne.Dodano: Znalazłem coś, co powinno załatwić sprawę od razu, ale reszta kodu poniżej oferuje również alternatywę.
Użyj
subplots_adjust()
funkcji, aby przesunąć dolną część wykresu w górę:Następnie zagraj z przesunięciem w
bbox_to_anchor
części legendy polecenia legendy, aby uzyskać pole legendy tam, gdzie chcesz. Pewna kombinacja ustawieniafigsize
i używaniasubplots_adjust(bottom=...)
powinna dać ci wykres jakości.Alternatywnie: po prostu zmieniłem linię:
do:
i zmienił się
do
i pokazuje się dobrze na moim ekranie (24-calowy monitor CRT).
Tutaj
figsize=(M,N)
ustawia okno figury na M cali na N cali. Po prostu baw się tym, aż będzie to odpowiednie dla Ciebie. Przekształć go na bardziej skalowalny format obrazu i użyj GIMP do edycji, jeśli to konieczne, lub po prostu przytnij za pomocąviewport
opcji LaTeX , jeśli dołączasz grafikę.źródło
Oto kolejne, bardzo ręczne rozwiązanie. Można zdefiniować rozmiar osi, a wypełnienia są odpowiednio uwzględniane (w tym legenda i znaczniki). Mam nadzieję, że komuś się przyda.
Przykład (rozmiar osi jest taki sam!):
Kod:
źródło
plt.draw()
naax.figure.canvas.draw()
. Nie jestem pewien, dlaczego, ale przed tą zmianą rozmiar legendy nie był aktualizowany.fig.set_size_inches(widthTot,heightTot)
nafig.set_size_inches(widthTot,heightTot, forward=True)
.