Jeśli dodam podtytuł do mojej figury matplotlib, zostanie on nałożony na tytuły podplotu. Czy ktoś wie, jak łatwo się tym zająć? Próbowałem tej tight_layout()
funkcji, ale to tylko pogarsza sytuację.
Przykład:
import numpy as np
import matplotlib.pyplot as plt
f = np.random.random(100)
g = np.random.random(100)
fig = plt.figure()
fig.suptitle('Long Suptitle', fontsize=24)
plt.subplot(121)
plt.plot(f)
plt.title('Very Long Title 1', fontsize=20)
plt.subplot(122)
plt.plot(g)
plt.title('Very Long Title 2', fontsize=20)
plt.tight_layout()
plt.show()
python
matplotlib
katrasnikj
źródło
źródło
tight_layout
: docs:[left, bottom, right, top] in normalized (0, 1) figure coordinates
tight_layout(rect=[0, 0.03, 1, 0.9])
zamiast0.95
jak w odpowiedzi.Możesz ręcznie dostosować odstępy za pomocą
plt.subplots_adjust(top=0.85)
:źródło
subplots_adjust
subplots_adjust
należy go wywoływać po każdym połączeniutight_layout
, inaczej nie będzie efektu wywołaniasubplots_adjust
.Jedną rzeczą, którą możesz bardzo łatwo zmienić w kodzie, jest to,
fontsize
którego używasz do tytułów. Zakładam jednak, że nie tylko chcesz to zrobić!Niektóre alternatywy dla używania
fig.subplots_adjust(top=0.85)
:Zwykle
tight_layout()
wykonuje dobrą robotę, umieszczając wszystko w dobrych lokalizacjach, aby się nie nakładały. Przyczynatight_layout()
nie pomaga w tym przypadku, ponieważtight_layout()
nie uwzględnia fig.suptitle (). W GitHub istnieje otwarty problem: https://github.com/matplotlib/matplotlib/issues/829 [zamknięty w 2014 r. Ze względu na wymaganie pełnego menedżera geometrii - przeniesiony do https://github.com/matplotlib/matplotlib / Issues / 1109 ].Jeśli czytasz wątek, możesz rozwiązać problem
GridSpec
. Kluczem jest pozostawienie miejsca na górze figury podczas dzwonieniatight_layout
za pomocąrect
kwarg. W przypadku Twojego problemu kod staje się:Korzystanie z GridSpec
Wynik:
Może
GridSpec
to dla ciebie trochę przesada, albo twój prawdziwy problem będzie wiązał się z wieloma dodatkowymi wątkami na znacznie większym obszarze roboczym lub innymi komplikacjami. Prostym hakiem jest po prostu użycieannotate()
i zablokowanie współrzędnych'figure fraction'
do naśladowaniasuptitle
. Być może jednak będziesz musiał dokonać drobniejszych korekt, gdy spojrzysz na wynik. Zauważ, że to drugie rozwiązanie ma nie wykorzystaniatight_layout()
.Prostsze rozwiązanie (choć może wymagać dopracowania)
Wynik:
[Korzystanie z wersji
Python
2.7.3 (64-bitowej) imatplotlib
1.2.0]źródło
GridSpec
), jak mogę utworzyć podploty, które współużytkują osie? Zwykle używam doplt.subplots(N,1, sharex=<>, sharey=<>)
tworzenia podplotów, aleadd_subplot
zamiast tego używa kodu, który opublikowałeśfig.tight_layout(rect=[0, 0.03, 1, 0.95])
również działa.Alternatywnym i prostym w użyciu rozwiązaniem jest dostosowanie współrzędnych tekstu napisów na rysunku za pomocą argumentu y w wywołaniu napisów (patrz dokumentacja ):
źródło
Ciasny układ nie działa z napisami, ale
constrained_layout
działa. Zobacz to pytanie Popraw rozmiar / odstępy podplota dzięki wielu podplotom w matplotlibOdkryłem, że dodanie podplotów od razu wyglądało lepiej, tj
Ale można go również dodać w momencie tworzenia rysunku:
Uwaga: aby zbliżyć do siebie moje wątki, również używałem
i constrained_layout nie działa z tym :(
źródło
Mam kłopoty z matplotlib przycinania metod, więc już teraz po prostu się funkcję, aby to zrobić poprzez
bash
wywołanieImageMagick
„s mogrify polecenia , który działa dobrze i pobiera wszystkie dodatkowe spacje poza krawędź figurki. Wymaga to używania systemu UNIX / Linux,bash
powłoki iImageMagick
zainstalowania.Po prostu zadzwoń po to
savefig()
.źródło
Jak wspomnieli inni, domyślnie ciasny układ nie bierze pod uwagę napisów. Odkryłem jednak, że można użyć
bbox_extra_artists
argumentu do przekazania napisu jako ramki granicznej, którą należy wziąć pod uwagę:Wymusza to uwzględnienie obliczeń ścisłego układu
suptitle
i wygląda tak, jak można się spodziewać.źródło
Jedyną rzeczą, która działała dla mnie, była modyfikacja wezwania do napisów:
źródło
Miałem podobny problem, który pojawił się podczas używania
tight_layout
bardzo dużej siatki wykresów (ponad 200 podplotów) i renderowania w notatniku jupyter. Zrobiłem szybkie rozwiązanie, które zawsze umieszcza cięsuptitle
w pewnej odległości nad twoim górnym wątkiem:W przypadku podplotów o zmiennej wielkości nadal można użyć tej metody, aby uzyskać najwyższą pozycję podplotu, a następnie ręcznie zdefiniować dodatkową ilość do dodania do napisów.
źródło