Am scris-o rapid și-murdar script pentru a genera parcele pe zbor. Eu sunt, folosind codul de mai jos (de la Matplotlib documentație) ca un punct de plecare:
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
Eu nu't doriți să afișați teren pe un GUI, în schimb, vreau să salvez complot într-un fișier (spun foo.png), astfel încât, de exemplu, acesta poate fi utilizat în script-uri lot. Cum fac asta?
În timp ce întrebare s-a răspuns, am'd dori să adăugați câteva sfaturi utile atunci când se utilizează matplotlib.pyplot.savefig. Formatul de fișier poate fi specificat prin extensie:
from matplotlib import pyplot as plt
plt.savefig('foo.png')
plt.savefig('foo.pdf')
Va dau un raster sau vectorizate de ieșire, respectiv, ambele care ar putea fi utile. În plus, ai'll găsi că pylab
lasă un spațiu generos, de multe ori nedorite, spațiu în jurul imaginii. Scoateți-l cu:
savefig('foo.png', bbox_inches='tight')
Cum au spus si altii, plt.savefig () " sau " fig1.savefig()
este într-adevăr modalitate de a salva o imagine.
Cu toate acestea am'am constatat că, în anumite cazuri cifra este întotdeauna afișată. (de exemplu. cu Spyder cu plt.ion(): modul interactiv = On.) Am lucrat în jurul valorii de acest lucru prin forțând închiderea figura fereastră în bucla gigant cu plt.aproape(figure_object)
(vezi documentația), așa că am don't avea un milion deschide cifre în buclă:
import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 ) # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png') # save the figure to file
plt.close(fig) # close the figure window
Tu ar trebui să fie în măsură să re-deschide figura de mai târziu, dacă este necesar să cu fig.show()
(n't de testare eu).
Doar gasit acest link pe MatPlotLib documentare care abordează exact aceasta problema: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Se spune că cel mai simplu mod de a preveni figura de la popping sus este de a utiliza un non-interactive backend (de exemplu. Agg), prin matplotib.utilizare(<backend>)
, de exemplu:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
Eu încă personal prefer folosind plt.aproape( fig )
, atunci aveți opțiunea de a ascunde anumite cifre (în buclă), dar încă afișa cifrele pentru post-bucla de prelucrare a datelor. Acesta este, probabil, mai lent decât a alege un non-interactive backend, deși - ar fi interesant daca cineva a testat asta.
**** UPDATE: pentru Spyder, de obicei, poate't set backend în acest fel (Pentru că Spyder, de obicei, sarcini matplotlib devreme, vă împiedică să utilizați matplotlib.utilizarea()
).
În schimb, utilizați plt.switch_backend('Agrav'), sau opriți "*permite suport*" în Spyder prefs și a alerga
matplotlib.utilizare('Agrav')` comanda te.
Celelalte răspunsuri sunt corecte. Cu toate acestea, uneori mi se pare că vreau să deschid figura obiect mai târziu. De exemplu, am putea dori să modificați eticheta dimensiuni, se adaugă o grilă, sau alt tip de prelucrare. Într-o lume perfectă, mi-ar pur și simplu rulați codul generatoare de complot, și să se adapteze setările. Din păcate, lumea nu este perfectă. Prin urmare, în plus față de salvarea în format PDF sau PNG, am adăuga:
with open('some_file.pkl', "wb") as fp:
pickle.dump(fig, fp, protocol=4)
Astfel, pot încărca mai târziu cifra obiect și manipula setările după cum vreau eu.
Am, de asemenea, scrie stiva cu codul sursă și localnici()` dicționar pentru fiecare funcție/metodă în stivă, astfel încât să pot spune mai târziu, exact ceea ce a generat figura.
NB: Fii atent, ca, uneori, această metodă generează fișiere mari.
După utilizarea parcelei() și alte funcții pentru a crea conținut pe care doriți, ai putea folosi o clauza de genul asta pentru a selecta între trasarea pe ecran sau în fișier:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4, 5)) # size in inches
# use plot(), etc. to create your plot.
# Pick one of the following lines to uncomment
# save_file = None
# save_file = os.path.join(your_directory, your_file_name)
if save_file:
plt.savefig(save_file)
plt.close(fig)
else:
plt.show()
import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
# Create the PdfPages object to which we will save the pages:
# The with statement makes sure that the PdfPages object is closed properly at
# the end of the block, even if an Exception occurs.
with PdfPages('multipage_pdf.pdf') as pdf:
plt.figure(figsize=(3, 3))
plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
plt.title('Page One')
pdf.savefig() # saves the current figure into a pdf page
plt.close()
plt.rc('text', usetex=True)
plt.figure(figsize=(8, 6))
x = np.arange(0, 5, 0.1)
plt.plot(x, np.sin(x), 'b-')
plt.title('Page Two')
pdf.savefig()
plt.close()
plt.rc('text', usetex=False)
fig = plt.figure(figsize=(4, 5))
plt.plot(x, x*x, 'ko')
plt.title('Page Three')
pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig
plt.close()
# We can also set the file's metadata via the PdfPages object:
d = pdf.infodict()
d['Title'] = 'Multipage PDF Example'
d['Author'] = u'Jouni K. Sepp\xe4nen'
d['Subject'] = 'How to create a multipage pdf file and set its metadata'
d['Keywords'] = 'PdfPages multipage keywords author title subject'
d['CreationDate'] = datetime.datetime(2009, 11, 13)
d['ModDate'] = datetime.datetime.today()
Am folosit următoarele:
import matplotlib.pyplot as plt
p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")
plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05), ncol=2, fancybox=True, shadow=True)
plt.savefig('data.png')
plt.show()
f.close()
plt.close()
Am găsit foarte important să se folosească plt.spectacol după salvarea figura, altfel nu o't de lucru.figura exportate în format png
Puteți face, fie:
plt.show(hold=False)
plt.savefig('name.pdf')
și amintiți-vă să savefig termina înainte de închiderea GUI complot. În acest fel, puteți vedea imaginea în prealabil.
Alternativ, poti sa te uiti la ea cu plt.show() Apoi închideți GUI și rula script-ul din nou, dar de data asta a înlocui
plt.show () " cu " plt.savefig()`.
Alternativ, puteți utiliza
fig, ax = plt.figure(nrows=1, ncols=1)
plt.plot(...)
plt.show()
fig.savefig('out.pdf')
Soluția :
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
plt.figure()
ts.plot()
plt.savefig("foo.png", bbox_inches='tight')
Dacă doriți pentru a afișa imaginea, precum și a salva imaginea utilizare:
%matplotlib inline
după
import matplotlib
Potrivit întrebare https://stackoverflow.com/q/9012487/6329006.
Un singur lucru ar trebui să rețineți: dacă utilizați plt.show
și să plt.savefig
, sau va da o imagine goală.
Un exemplu detaliat:
import numpy as np
import matplotlib.pyplot as plt
def draw_result(lst_iter, lst_loss, lst_acc, title):
plt.plot(lst_iter, lst_loss, '-b', label='loss')
plt.plot(lst_iter, lst_acc, '-r', label='accuracy')
plt.xlabel("n iteration")
plt.legend(loc='upper left')
plt.title(title)
plt.savefig(title+".png") # should before plt.show method
plt.show()
def test_draw():
lst_iter = range(100)
lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
# lst_loss = np.random.randn(1, 100).reshape((100, ))
lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
# lst_acc = np.random.randn(1, 100).reshape((100, ))
draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")
if __name__ == '__main__':
test_draw()
import matplotlib.pyplot as plt
plt.savefig("image.png")
În Jupyter Notebook trebuie să eliminați plt.show()
și se adaugă plt.savefig()
, împreună cu restul de plt-cod într-o singură celulă.
Imaginea va apărea în continuare în notebook-ul.
Având în vedere că astăzi (nu a fost disponibil atunci când această întrebare a fost făcut) o mulțime de oameni folosesc Jupyter Notebook consola python, există o modalitate extrem de ușor pentru a salva parcele ca .png
, sunați la matplotlib
's pylab clasa de Jupyter Notebook, complot figura 'inline' jupyter celule, și apoi trageți această figură/imagine într-un director local. Don't uita
%matplotlib inline` în prima linie!
În plus față de cele de mai sus, am adăugat __file__
pentru numele atât de imagine și fișier Python obține același nume. Am adăugat, de asemenea, câteva argumente pentru a face să arate mai bine:
``
plt.savefig(file+".png",dpi=(250), bbox_inches='tight')
`` Sfat Final a găsit AICI.
Puteți salva imaginea cu orice extensie(png, jpg,etc.) și cu rezoluția dorită. Aici's o funcție pentru a salva figura ta.
import os
def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):
path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)
print("Saving figure", fig_id)
if tight_layout:
plt.tight_layout()
plt.savefig(path, format=fig_extension, dpi=resolution)
'fig_id' este numele cu care doriți să salvați figura ta. Sper că vă ajută:)