Image faylını Matplotlib ilə göstərmək əvəzinə bir görüntü faylına saxlaya bilərsiniz

Tezliklə qrafika yaratmaq üçün sürətli və çirkli bir yazı yazıram. Aşağıdakı kodu ( Matplotlib sənədlərindən) başlanğıc nöqtəsi kimi istifadə edirəm:

 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 

Qrafik interfeysdə qrafik göstərmək istəmirəm, əvəzində bir faylda (məsələn, foo.png) grafiği saxlamaq istərdim, məsələn, batch skriptlərdə istifadə edilə bilər. Bunu necə edirsiniz?

855
08 марта '12 в 20:38 2012-03-08 20:38 Homunculus Reticulli 8 Mart '12 saat 20:38 'də təyin olunub
@ 16 cavab

Suala cavab verilərkən, savefig istifadə edərkən bəzi faydalı məsləhətlər əlavə etmək istərdim . Fayl formatı uzantı ilə müəyyən edilə bilər:

 savefig('foo.png') savefig('foo.pdf') 

Rasterleştirilmiş və ya vektorlu çıxış verməklə, hər ikisi də faydalı ola bilər. Bundan əlavə, pylab görünüşü ətrafında böyük, tez-tez arzuolunmaz bir yer yaradır tapa bilərsiniz. Bunu çıxarın:

 savefig('foo.png', bbox_inches='tight') 
1025
27 марта '12 в 16:35 2012-03-27 16:35 Cavab verilir 27 Mart 'da saat 4: 35' da 2012-03-27 16:35

Həll:

border=0
 pylab.savefig('foo.png') 
144
27 марта '12 в 14:36 2012-03-27 14:36 Cavab Lukasz Czerwinski tərəfindən 27 Mart 2012 tarixində saat 14: 36-da verilir. 2012-03-27 14:36

Başqalarının dediyinə görə, plt.savefig() və ya fig1.savefig() həqiqətən bir şəkil saxlamaq üçün bir yoldur.

Lakin bəzi hallarda (məsələn, Spyder ilə plt.ion() : interaktiv rejimi = On) bir sıra həmişə göstərilir. Mənim nəhəng dövrümdə rəqəmlər pəncərəsini bağlamağa məcbur etdim, buna görə də dövr ərzində bir milyon açıq rəqəmim yoxdur:

 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 
141
29 апр. Demis tərəfindən 29 apreldə cavab verildi. 2015-04-29 01:35 '15 at 1:35 'de 2015-04-29 01:35

Mən bu linki yalnız MatPlotLib sənədlərində bu problemə xüsusi olaraq tapdım: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

Bir rəqəmin görünməməsinin qarşısını almaq üçün ən asan yol, məsələn, matplotib.use(<backend>) vasitəsilə qeyri-interaktiv arxa (məsələn, matplotib.use(<backend>) ) istifadə matplotib.use(<backend>) :

 import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt plt.plot([1,2,3]) plt.savefig('myfig') 

Mən hələ də şəxsən plt.close( fig ) istifadə plt.close( fig ) üstünlük verirəm, buna görə müəyyən formaları (loop zamanı) gizlətməyinizə imkan verir, amma hal-hazırda loopdan sonra məlumatların işlənməsi üçün formaları göstərmək. Bu, qeyri-interaktiv bir backend seçməsindən çox yəqin ki, yavaş - birisi onu yoxladıqda maraqlı olardı.

YENİLƏNİB : Spyder üçün adətən bu şəkildə bir backend qura bilməzsiniz (Spyder adətən matplotlib.use() istifadə matplotlib.use() imkan vermədən erkən matplotlib yükləyir çünki).

Bunun əvəzinə, plt.switch_backend('Agg') və ya Spyder parametrlərindən "dəstək matplotlib.use('Agg') " matplotlib.use('Agg')matplotlib.use('Agg') özünüz yerinə matplotlib.use('Agg') .

Bu iki ipucu: bir , iki

76
04 янв. Cavab Demis Jan 04 tərəfindən verilir 2016-01-04 03:35 '16 'da 3:35' də 2016-01-04 03:35 'da

Əgər "cari" formanın konsepsiyasını sevməsəniz, bunu:

 import matplotlib.image as mpimg img = mpimg.imread("src.png") mpimg.imsave("out.png", img) 
40
30 янв. Cavab şənbə günü verilir 2014-01-30 21:30 '14 saat 21:30 'da 2014-01-30 21:30

Digər cavablar düzgündür. Ancaq bəzən bir forma obyekti açmaq istədiyini görürəm. Məsələn, etiketləri ölçüsünü dəyişə bilərəm, bir grid əlavə edə bilərəm və ya başqa bir emal həyata keçirə bilərəm. İdeal bir dünyada, mən sadələşdirən kodunu yenidən başladın və parametrləri uyğunlaşdırıram. Əfsuslar olsun ki, dünya mükəmməl deyil. Buna görə də, PDF və ya PNG qənaət etməklə yanaşı əlavə edirəm:

 with open('some_file.pkl', "wb") as fp: pickle.dump(fig, fp, protocol=4) 

Beləliklə, daha sonra şəklin obyektini yükləyə və istədiyim kimi parametrləri manipulyasiya edə bilərəm.

Mən də istifdə olan hər bir funksiya / metod üçün qaynaq kodunu və lüğət locals() yığışdırıram, buna görə şəkilləri yaradan dəqiq deyə bilərik.

NB: ehtiyatlı olun, çünki bəzən bu metod böyük fayllar yaradır.

26
26 мая '16 в 14:48 2016-05-26 14:48 cavab 26 may, '16 14:48 2016-05-26 14:48 'ye verilir
 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 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() 
24
30 июня '15 в 11:38 2015-06-30 11:38 Cavab Viktor Juliet tərəfindən 30 İyun tarixində saat 11:38 'də veriləcəkdir 2015-06-30 11:38

İstədiyiniz məzmunu yaratmaq üçün sahəsi () və digər funksiyaları istifadə etdikdən sonra, göstərilən və ya fayl arasında seçim etmək üçün belə bir cümlədən istifadə edə bilərsiniz:

 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() 
20
12 окт. Mark P. tərəfindən verilmiş cavab 12 oktyabr. 2016-10-12 01:12 '16 'da 1:12' də 2016-10-12 01:12 'də

Aşağıdakıları istifadə etdim:

 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() 

Mən şəklini qənaət etdikdən sonra plt.show istifadə etmək çox vacibdir, əks halda işləməyəcək. bu rəqəm png ixrac olunur

19
05 апр. Cavab Cristian Muñoz tərəfindən verilir 05 Aprel. 2016-04-05 16:34 '16 saat 04:34 'da 2016-04-05 16:34

Siz edə bilərsiniz:

 plt.show(hold=False) plt.savefig('name.pdf') 

GUI'yi bağlamadan əvvəl qənaət qənaətini unutmağı unutmayın. Beləliklə, sənədi əvvəlcədən görə bilərsiniz.

Alternativ olaraq, bunu plt.show() ilə izləyə bilərsiniz plt.show() Sonra plt.show() bağlayın və skripti yenidən çalıştırın, lakin bu dəfə plt.show() ' plt.savefig() plt.show() ilə əvəz plt.show() .

Alternativ olaraq istifadə edə bilərsiniz

 fig, ax = plt.figure(nrows=1, ncols=1) plt.plot(...) plt.show() fig.savefig('out.pdf') 
12
24 сент. Nutcracker tərəfindən verilmiş cavab 24 Sep. 2017-09-24 02:20 '17 də 2:20 2017-09-24 02:20

Mənim kimi IDE Spyder istifadə edirsinizsə, istifadə edərək interaktiv rejimi aradan buraxmalısınız

plt.ioff()

(bu komanda elmi bir işə başladığınızda avtomatik olaraq başlayır)

Onu geri çevirmək istəyirsinizsə, istifadə edin:

plt.ion()

11
29 авг. Cavab Covich 29 avqustda verilir . 2015-08-29 17:50 '15 'də saat 17.50' də

Həll:

 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') 

Bir görüntüyü göstərmək və bir görüntünün istifadəsini saxlamaq istəyirsinizsə:

 %matplotlib inline 

import matplotlib sonra

11
27 марта '16 в 11:49 2016-03-27 11:49 Cavab verilir Durgesh satam 27 mart '16 saat 11:49 2016-03-27 11:49

Matplotlib (pyplot) sualına uyğun olaraq, savefig boş bir şəkil göstərilir .

Bir şey qeyd etmək lazımdır: əgər plt.show istifadə plt.showplt.savefig əməl plt.savefig , ya da boş bir şəkil verəcəksiniz.

Ətraflı nümunə:

 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() 

2019

20 июля '18 в 12:38 2018-07-20 12:38 Cavab Jayhello tərəfindən 20 İyul tarixində saat 18: 18- də 2018-07-20 12:38 tarixində verilir
 #write the code for the plot plt.savefig("filename.png") 

Fayl, çalışan python / Jupyter faylı ilə eyni kataloqda saxlanılır.

5
19 апр. 19 Aprel tarixində Swaraj Kumar tərəfindən cavab verildi 2018-04-19 09:14 '18 saat 09:14 'da 201-04-19 09:14
 import matplotlib.pyplot as plt plt.savefig("image.png") 

Jupyter noutbukunda, plt.show() silmək və plt.show() əlavə plt-kodu eyni kamerada əlavə plt.savefig() . Şəkil hələ də not defterinizdə göstəriləcək.

4
17 нояб. Cavab Punnerud tərəfindən 17 noyabrda verilir. 2018-11-17 23:01 '18 'də saat 11:01 ' də 2018-11-17 23:01 'də

Bu gün (bu sual soruşulduğunda mövcud olmadığı) nəzərə alsaq, bir çox insanlar Jupyter Notebooku bir Python konsolu olaraq istifadə edirlər, qrafikləri .png kimi saxlamaq üçün son dərəcə sadə bir yol var, basitçe Jupyter Notebook'undan və quruluşdan matplotlib sinif pylab çağırın. Jüpiterin "daxili" hüceyrələri və sonra bu forma / görünüşü yerli bir qovluğa sürükleyin. %matplotlib inline xəttini ilk satırda %matplotlib inline !

2
14 дек. Hamidreza tərəfindən verilmiş cavab 14 Dekabr. 2018-12-14 10:20 '18 saat 10:20 'də 2018-12-14 10:20' də

tags haqqında suallar və ya bir sual