jestem zaznajomiony z następującymi pytaniami:Moving matplotlib legenda zewnątrz osi sprawia, że odcięcie przez pole figury
Matplotlib savefig with a legend outside the plot
How to put the legend out of the plot
Wydaje się, że odpowiedzi na te pytania mają luksus bycia na skrzypcach z dokładnym kurczeniem się osi, tak aby legenda pasowała.
Zmniejszenie osi nie jest jednak rozwiązaniem idealnym, ponieważ powoduje, że dane są mniejsze, co utrudnia interpretację; szczególnie, gdy jest to skomplikowane i wiele się dzieje ... dlatego potrzeba dużej legendy.
Przykład złożonej legendy w dokumentacji pokazuje, że jest to potrzebne, 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
Co chciałbym być w stanie zrobić to dynamicznie rozwijać rozmiaru okna rysunku, aby pomieścić rozszerzający postać legendy.
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')
Wskazówki jak Ostateczna etykieta „Inverse tan” jest rzeczywiście poza pole figury (i wygląda źle odcięcia - nie jakość publikacji)
W końcu powiedziano mi, że jest to normalne zachowanie w R i LaTeX, więc jestem trochę zdezorientowany, dlaczego to jest tak trudne w python ... Czy istnieje historyczny powód? Czy Matlab jest równie biedny w tej sprawie?
Mam (tylko nieznacznie) już wersję tego kodu na pastebin http://pastebin.com/grVjc007
Jeśli chodzi o to dlaczego to dlatego matplotlib jest ukierunkowany interaktywnych wykresów, natomiast R, etc, nie są. (I tak, Matlab jest "tak samo biedny" w tym konkretnym przypadku.) Aby zrobić to poprawnie, musisz martwić się o zmianę rozmiaru osi za każdym razem, gdy figura jest zmieniana, powiększana lub pozycja legendy jest aktualizowana. (Skutecznie oznacza to sprawdzanie za każdym razem, gdy narysowany jest wykres, co prowadzi do spowolnień.) Ggplot itp. Są statyczne, dlatego zazwyczaj robią to domyślnie, podczas gdy matplotlib i matlab nie. To powiedziawszy, 'tight_layout()' należy zmienić, aby uwzględnić legendy. –
Omawiam również to pytanie na liście dyskusyjnej użytkowników matplotlib. Mam więc sugestie dotyczące dostosowania linii savefig do: fig.savefig ('samplefigure', bbox_extra_artists = (lgd,), bbox = 'tight') – jbbiomed
Wiem, że matplotlib lubi twierdzić, że wszystko jest pod kontrolą użytkownik, ale cała ta historia z legendami jest zbyt dobra. Jeśli odłożę legendę na zewnątrz, oczywiście chcę, aby nadal była widoczna. Okno powinno po prostu skalować się tak, aby pasowało, zamiast tworzyć ten ogromny problem z przesuwaniem.Przynajmniej powinna istnieć domyślna opcja True kontrolująca to zachowanie autoskalowania. Zmuszanie użytkowników do przejścia przez absurdalną liczbę ponownych renderowań, aby spróbować uzyskać numery skali w imieniu kontroli, działa odwrotnie. – Elliot