Saya menulis cepat-dan-kotor script untuk menghasilkan plot on the fly. Saya menggunakan kode di bawah ini (dari Matplotlib dokumentasi) sebagai titik awal:
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
Saya don't ingin menampilkan plot pada GUI, bukan, saya ingin menyimpan plot ke sebuah file (misalnya foo.png), sehingga, misalnya, dapat digunakan dalam batch script. Bagaimana saya melakukan itu?
Sementara pertanyaan telah dijawab, aku'd ingin menambahkan beberapa tips yang berguna ketika menggunakan matplotlib.pyplot.savefig. Format file yang dapat ditentukan oleh perpanjangan:
from matplotlib import pyplot as plt
plt.savefig('foo.png')
plt.savefig('foo.pdf')
Akan memberikan raster atau vectorized output masing-masing, baik yang bisa berguna. Selain itu, anda'll menemukan bahwa pylab
daun yang murah hati, sering tidak diinginkan, ruang kosong di sekeliling gambar. Menghapusnya dengan:
savefig('foo.png', bbox_inches='tight')
Seperti yang orang lain telah mengatakan, plt.savefig()
atau fig1.savefig()
memang cara untuk menyimpan gambar.
Namun saya've menemukan bahwa dalam kasus-kasus tertentu sosok yang selalu ditampilkan. (misalnya. dengan Spyder memiliki plt.ion()
: interactive mode = On.) Saya bekerja di sekitar ini dengan memaksa penutupan dari gambar jendela raksasa loop dengan plt.dekat(figure_object)
(lihat dokumentasi), jadi saya don't memiliki sejuta membuka angka pada loop:
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
Anda harus dapat untuk membuka kembali sosok nanti jika diperlukan dengan ara.show()
(didn't test sendiri).
Hanya menemukan link ini di MatPlotLib dokumentasi menangani persis masalah ini: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Mereka mengatakan bahwa cara termudah untuk mencegah angka yang muncul adalah untuk penggunaan non-interaktif backend (misalnya. Agg), melalui matplotib.menggunakan(<backend>)
, misalnya:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
Saya secara pribadi masih lebih suka menggunakan plt.dekat( ara )
, karena maka anda memiliki pilihan untuk menyembunyikan tokoh-tokoh tertentu (saat lingkaran), tapi masih menampilkan angka-angka untuk pos-loop pengolahan data. Hal ini mungkin lebih lambat daripada memilih non-interaktif backend seakan - akan menarik jika seseorang diuji itu.
UPDATE: untuk Spyder, anda biasanya dapat't set backend dengan cara ini (Karena Spyder biasanya beban matplotlib dini, mencegah anda dari menggunakan matplotlib.menggunakan()
).
Sebaliknya, gunakan plt.switch_backend('Agg')
, atau Matikan "mengaktifkan dukungan" dalam Spyder prefs dan menjalankan matplotlib.menggunakan('Agg')
perintah sendiri.
Lain jawaban yang benar. Namun, kadang-kadang saya menemukan bahwa saya ingin membuka gambar objek kemudian. Misalnya, saya mungkin ingin mengubah label ukuran, menambahkan grid, atau melakukan pengolahan lainnya. Dalam dunia yang sempurna, saya hanya akan mengulangi menghasilkan kode plot, dan menyesuaikan pengaturan. Sayangnya, dunia ini tidak sempurna. Oleh karena itu, selain untuk menyimpan ke PDF atau PNG, saya tambahkan:
with open('some_file.pkl', "wb") as fp:
pickle.dump(fig, fp, protocol=4)
Seperti ini, saya kemudian dapat memuat angka objek dan memanipulasi pengaturan seperti yang saya harap.
Saya juga menulis stack dengan source-code dan setempat()
kamus untuk masing-masing fungsi/metode di stack, sehingga saya dapat nanti tahu persis apa yang dihasilkan angka.
NB: hati-hati, karena kadang-kadang metode ini menghasilkan file besar.
Setelah menggunakan plot() dan fungsi-fungsi lainnya untuk membuat konten yang anda inginkan, anda bisa menggunakan klausul seperti ini untuk memilih antara merencanakan ke layar atau ke file:
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()
Aku digunakan berikut ini:
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()
Saya menemukan sangat penting untuk menggunakan plt.tampilkan setelah menyimpan gambar, jika tidak maka tidak't bekerja.sosok diekspor dalam png
Anda dapat melakukan:
plt.show(hold=False)
plt.savefig('name.pdf')
dan ingat untuk membiarkan savefig selesai sebelum penutupan GUI plot. Dengan cara ini anda dapat melihat gambar terlebih dahulu.
Atau, anda dapat melihatnya dengan plt.show()
Kemudian tutup GUI dan menjalankan script lagi, tapi kali ini ganti plt.show()
dengan plt.savefig()
.
Atau, anda dapat menggunakan
fig, ax = plt.figure(nrows=1, ncols=1)
plt.plot(...)
plt.show()
fig.savefig('out.pdf')
Solusi :
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')
Jika anda ingin menampilkan gambar serta menyimpan gambar menggunakan:
%matplotlib inline
setelah
impor matplotlib
Sesuai dengan pertanyaan https://stackoverflow.com/q/9012487/6329006.
Satu hal yang harus dicatat: jika anda menggunakan plt.show
dan itu harus setelah plt.savefig
, atau anda akan memberikan sebuah gambar kosong.
Contoh rinci:
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")
Di Jupyter Notebook anda harus menghapus plt.show()
dan tambahkan plt.savefig()
, bersama-sama dengan sisa plt-kode dalam satu sel.
Gambar akan tetap muncul di notebook anda.
Mengingat bahwa hari ini (tidak tersedia bila pertanyaan ini dibuat) banyak orang menggunakan Jupyter Notebook sebagai konsol python, ada cara yang sangat mudah untuk menyimpan plot sebagai .png
, menelepon matplotlib
's pylab
kelas dari Jupyter Notebook, plot angka 'inline' jupyter sel-sel, dan kemudian tarik gambar/gambar ke direktori lokal. Don't lupa
%matplotlib inline
di baris pertama!
Selain itu untuk orang-orang di atas, saya menambahkan __file__
untuk nama jadi gambar dan file Python mendapatkan nama yang sama. Saya juga menambahkan beberapa argumen untuk membuatnya terlihat lebih baik:
``
plt.savefig(file+".png",dpi=(250), bbox_inches='rapat')
`` Tips terakhir yang ditemukan di SINI.
Anda dapat menyimpan gambar anda dengan ekstensi(png, jpg,dll.) dan dengan resolusi yang anda inginkan. Berikut ini's berfungsi untuk menyimpan gambar anda.
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' adalah nama yang anda inginkan untuk menyimpan gambar anda. Semoga membantu:)