Piszę szybki i brudny skrypt do generowania fabuł w locie. Korzystam z poniższego kodu (z dokumentacji Matplotlib ) jako punktu wyjścia:
from pylab import figure, axes, pie, title, show
# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})
show() # Actually, don't show, just save to foo.png
Nie chcę wyświetlać wykresu w GUI, zamiast tego chcę zapisać wykres do pliku (powiedzmy foo.png), aby na przykład można go było użyć w skryptach wsadowych. Jak mogę to zrobić?
python
matplotlib
plot
Homunculus Reticulli
źródło
źródło
savefig
metodę. Więc można nazwaćfig = plt.figure()
potemfig.savefig(...)
.plt.close(fig)
co jest szczególnie ważne w dużych pętlach. W przeciwnym razie liczby pozostaną otwarte i czekają w pamięci, a wszystkie otwarte liczby zostaną wyświetlone po wykonaniuplt.show()
Odpowiedzi:
Chociaż pytanie zostało udzielone, chciałbym dodać kilka użytecznych wskazówek podczas korzystania z matplotlib.pyplot.savefig . Format pliku można określić przez rozszerzenie:
Daje odpowiednio zrasteryzowane lub wektoryzowane wyjście, które mogą być przydatne. Ponadto zauważysz, że
pylab
pozostawia hojny, często niepożądane, białe znaki wokół obrazu. Usuń za pomocą:źródło
plt.savefig
można zmienić dpi, patrz link w odpowiedzi. Te wymiary mogą być sterowane podczas tworzenia postać, patrzfigsize
na matplotlib.org/api/figure_api.html#matplotlib.figure.Figureplt.ioff()
co powinno wyłączyć interaktywnośćmatplotlib.pyplot
poleceń.foo.png
to ścieżka. Możesz na przykład umieścić go w takim katalogusavefig("mydir/foo.png")
.Jak powiedzieli inni,
plt.savefig()
lubfig1.savefig()
rzeczywiście jest to sposób na zapisanie obrazu.Przekonałem się jednak, że w niektórych przypadkach liczba jest zawsze wyświetlana . (np. z Spyderem posiadającym
plt.ion()
: tryb interaktywny = Wł.) Obejdę ten problem, wymuszając zamknięcie okna figury w mojej gigantycznej pętli za pomocąplt.close(figure_object)
(patrz dokumentacja ), więc nie mam miliona otwartych liczb podczas pętli:W razie potrzeby powinieneś być w stanie ponownie otworzyć tę postać
fig.show()
(nie testowałem siebie).źródło
plt.ioff() # turn of interactive plotting mode
, ale może to uniemożliwić zachowanie, którego należy użyć, jeśli kod zakończy działanie z błędem.plt.close(fig)
rozwiązanyRozwiązaniem jest:
źródło
Właśnie znalazłem ten link w dokumentacji MatPlotLib dotyczący dokładnie tego problemu: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Mówią, że najłatwiejszym sposobem, aby zapobiec wyskakiwaniu figury, jest użycie nieinteraktywnego zaplecza (np. Agg), poprzez
matplotib.use(<backend>)
np .:Nadal osobiście wolę używać
plt.close( fig )
, ponieważ odtąd masz opcję ukrywania niektórych liczb (podczas pętli), ale nadal wyświetlasz liczby do przetwarzania danych po pętli. Jest to prawdopodobnie wolniejsze niż wybór nieinteraktywnego zaplecza - byłoby interesujące, gdyby ktoś to przetestował.AKTUALIZACJA : w przypadku Spyder zwykle nie można ustawić backendu w ten sposób (ponieważ Spyder zwykle ładuje matplotlib wcześnie, uniemożliwiając korzystanie
matplotlib.use()
).Zamiast tego użyj
plt.switch_backend('Agg')
lub Wyłącz „ włącz obsługę ” w prefiksach Spyder i uruchommatplotlib.use('Agg')
polecenie samodzielnie.Z tych dwóch wskazówek: raz , dwa
źródło
.plot()
spowoduje błąd, jeślios.environ['DISPLAY']
nie zostanie poprawnie ustawiony.Jeśli nie podoba Ci się koncepcja „aktualnej” liczby, wykonaj:
źródło
src.png
doout.png
?img
), możesz zapisać go do pliku za pomocą.imsave()
metody.Pozostałe odpowiedzi są poprawne. Czasami jednak okazuje się, że chcę później otworzyć obiekt figury . Na przykład mógłbym chcieć zmienić rozmiary etykiet, dodać siatkę lub wykonać inne przetwarzanie. W idealnym świecie po prostu uruchomiłbym ponownie kod generujący fabułę i dostosowałem ustawienia. Niestety świat nie jest idealny. Dlatego oprócz zapisywania w formacie PDF lub PNG dodaję:
W ten sposób mogę później załadować obiekt figury i dowolnie modyfikować ustawienia.
Zapisuję również stos z kodem źródłowym i
locals()
słownikiem dla każdej funkcji / metody na stosie, dzięki czemu mogę później dokładnie powiedzieć, co wygenerowało liczbę.Uwaga: bądź ostrożny, ponieważ czasami ta metoda generuje ogromne pliki.
źródło
źródło
Po użyciu plot () i innych funkcji do stworzenia pożądanej zawartości, możesz użyć takiej klauzuli, aby wybrać między drukowaniem na ekranie a plikiem:
źródło
fig = plt.figure(figuresize=4, 5)
może byćfig = plt.figure(figsize=(4, 5)) #figure sizes in inches
Użyłem następujących:
Uważam, że bardzo ważne jest użycie plt.show po zapisaniu figury, w przeciwnym razie to nie zadziała. postać wyeksportowana w png
źródło
f= plt.savefig('data.png')
Możesz albo:
i pamiętaj, aby savefig skończył się przed zamknięciem wykresu GUI. W ten sposób możesz wcześniej zobaczyć obraz.
Alternatywnie, można spojrzeć na to z
plt.show()
czym zamknij GUI i ponownie uruchomić skrypt, ale tym razem zastąpićplt.show()
zplt.savefig()
.Alternatywnie możesz użyć
źródło
Jeśli, podobnie jak ja, używasz Spyder IDE, musisz wyłączyć tryb interaktywny za pomocą:
plt.ioff()
(to polecenie jest uruchamiane automatycznie wraz ze startem naukowym)
Jeśli chcesz go ponownie włączyć, użyj:
plt.ion()
źródło
Rozwiązanie :
Jeśli chcesz wyświetlić obraz, a także zapisać obraz, użyj:
po
import matplotlib
źródło
Zgodnie z pytaniem Matplotlib (pyplot) savefig wyświetla pusty obraz .
Należy zwrócić uwagę na jedną rzecz: jeśli użyjesz
plt.show
i powinno być późniejplt.savefig
, lub otrzymasz pusty obraz.Szczegółowy przykład:
źródło
W Jupyter Notebook musisz usunąć
plt.show()
i dodaćplt.savefig()
wraz z resztą kodu plt w jednej komórce. Obraz nadal będzie wyświetlany w twoim notatniku.źródło
Biorąc pod uwagę, że dziś (nie było dostępne, kiedy zadawano to pytanie) wiele osób używa Jupyter Notebook jako konsoli Pythona, istnieje niezwykle łatwy sposób na zapisanie wykresów, ponieważ
.png
wystarczy wywołaćmatplotlib
„pylab
klasę z Jupyter Notebook, narysować rysunek” 'komórki jupyter, a następnie przeciągnij tę figurę / obraz do lokalnego katalogu. Nie zapomnij%matplotlib inline
w pierwszej linii!źródło
Oprócz powyższych, dodałem
__file__
nazwę, aby zdjęcie i plik Python otrzymywały te same nazwy. Dodałem również kilka argumentów, aby wyglądało to lepiej:źródło
Podczas używania
matplotlib.pyplot
musisz najpierw zapisać działkę, a następnie zamknąć ją za pomocą tych 2 wierszy:źródło
Jak sugerowano wcześniej, możesz użyć:
Do zapisywania dowolnego wyświetlanego obrazu IPhython. Lub z innej nuty (patrząc pod innym kątem), jeśli kiedykolwiek zaczniesz pracować z otwartym cv lub jeśli masz otwarte cv zaimportowane, możesz wybrać:
import cv2
cv2.imwrite („myfig.png”, obraz)
Ale tak jest na wszelki wypadek, jeśli chcesz pracować z Open CV. W przeciwnym razie wystarczy plt.savefig ().
źródło
Możesz zapisać swój obraz z dowolnym rozszerzeniem (png, jpg itp.) I z odpowiednią rozdzielczością. Oto funkcja zapisywania twojej figury.
„fig_id” to nazwa, pod którą chcesz zapisać swoją figurę. Mam nadzieję, że to pomoże:)
źródło
Możesz to zrobić w następujący sposób:
źródło