Muszę zrobić zdjęcie i zapisać je po jakimś procesie. Rysunek wygląda dobrze, gdy go wyświetlam, ale po zapisaniu rysunku wokół zapisanego obrazu mam trochę pustej przestrzeni. Wypróbowałem 'tight'
opcję savefig
metody, też nie działała. Kod:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
fig = plt.figure(1)
img = mpimg.imread(path)
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)
plt.axis('off')
plt.show()
Próbuję narysować podstawowy wykres za pomocą NetworkX na rysunku i zapisać go. Zdałem sobie sprawę, że bez wykresu to działa, ale po dodaniu wykresu wokół zapisanego obrazu pojawia się biała przestrzeń;
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}
fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
nx.draw(G, pos=pos)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)
plt.axis('off')
plt.show()
python
matplotlib
Ahmet Tuğrul Bayrak
źródło
źródło
Odpowiedzi:
Nie mogę twierdzić, że wiem dokładnie, dlaczego i jak działa moje „rozwiązanie”, ale to właśnie musiałem zrobić, gdy chciałem nakreślić zarys kilku sekcji płata - bez białych marginesów - do pliku PDF. (Zauważ, że użyłem matplotlib wewnątrz notebooka IPython z flagą -pylab.)
Próbowałem dezaktywować różne części tego, ale zawsze prowadzi to gdzieś do białego marginesu. Możesz nawet zmodyfikować to, aby zapobiec goleniu linii tłuszczu w pobliżu granic sylwetki z powodu braku marginesów.
źródło
set_major_locator
potrzebne były tylko dwie linie .pad_inches=0
której inne odpowiedzi nie wspominają.set_major_locator
był dla mnie kluczowy.pad_inches
pomogło mi.Można usunąć białą przestrzeń dopełnienie przez ustawienie
bbox_inches="tight"
wsavefig
:Będziesz musiał wstawić argument
bbox_inches
jako ciąg, być może dlatego wcześniej nie zadziałał.Możliwe duplikaty:
Wykresy Matplotlib: usuwanie osi, legend i spacji
Jak ustawić marginesy dla figury matplotlib?
Zmniejsz lewy i prawy margines na wykresie matplotlib
źródło
fig.savefig()
również z . (plt.savefig()
nie zadziała w tym przypadku.)bbox_inches
opcji, jest inna wartość domyślna, która pozostawia trochę miejsca. Jeśli naprawdę chcesz się wszystkiego pozbyć, musisz również użyćpad_inches=0.0
. Oczywiście takie ciasne obicie często odcina, np. Wykładniki ...pad_inches=-0.1
Po wypróbowaniu powyższych odpowiedzi bez powodzenia (i mnóstwa innych postów na stosie), co w końcu zadziałało dla mnie, było po prostu
Co ważne, nie obejmuje to pola bbox ani argumentów wypełniających.
źródło
set_axis_off
. Nie ma to wpływu na zapisany obraz, ponieważ posubplots_adjust
osi leży poza zasięgiem figury, a kura i tak nie zostanie zapisana. W notatnikach Jupyter musisz jednak jawnie wyłączyć oś, ponieważ wbudowane zaplecze zastępuje te ustawienia.Znalazłem coś od Arvinda Pereiry ( http://robotics.usc.edu/~ampereir/wordpress/?p=626 ) i wydawało się, że działa dla mnie:
źródło
transparent=True
sprawi, że będzie się wydawało, że nie ma problemu, ale po prostu ukryje białą przestrzeń, wymiary obrazu nie będą w porządku.pad_inches
! Żałuję, że nie wiedziałem o tej opcji wcześniej!pad_inches=.25
Poniższa funkcja zawiera powyższą odpowiedź Johanna. Przetestowałem to z wieloma osiami
plt.figure
iplt.subplots()
z wieloma osiami i działa dobrze.źródło
Zauważyłem, że poniższe kody działają idealnie do tego zadania.
źródło
Śledziłem tę sekwencję i zadziałało to jak urok.
źródło
Dla każdego, kto chce pracować w pikselach, a nie w calach, to zadziała.
Plus to, co zwykle będziesz potrzebować
Następnie możesz użyć następujących:
źródło
fig.dpi
zamiast tego użyć domyślnejO wiele prostsze podejście, które znalazłem, polega na użyciu
plt.imsave
:źródło
plt.savefig()
.Możesz tego spróbować. To rozwiązało mój problem.
źródło
Jeśli chcesz wyświetlić to, co ma zostać zapisane, polecam użycie
plt.tight_layout
transformacji, która jest w rzeczywistości lepsza, ponieważ nie powoduje niepotrzebnego przycinania podczas używaniaplt.savefig
źródło
Działa to dla mnie, zapisując tablicę numpy wykreśloną za pomocą imshow do pliku
źródło