Hesablamalar davam edə bilər ki, matplotlib charts ayırmaq üçün bir yol var?

Bu təlimatlardan sonra Python tərcüməçisində grafi ilə bir pəncərə görünür:

 from matplotlib.pyplot import * plot([1,2,3]) show() # other code 

Təəssüf ki, show() tərəfindən yaradılan rəqəmin interaktiv tədqiqatını necə davam etdirəcəyini bilmirəm, proqram isə daha çox hesablamalar aparır.

Mümkündürmi? Bəzən hesablamalar uzun və ara nəticələr nəzərə alınanda davam edərsə kömək edəcəkdir.

215
19 янв. 19 yanvarda meteor qurdu 2009-01-19 19:30 '09 saat 19: 30-da 2009-01-19 19:30
@ 18 cavab

matplotlib zənglərindən istifadə edin:

draw() istifadə:

 from matplotlib.pyplot import plot, draw, show plot([1,2,3]) draw() print 'continue computation' # at the end call show to ensure window won't close. show() 

İnteraktiv rejimi istifadə etmək:

 from matplotlib.pyplot import plot, ion, show ion() # enables interactive mode plot([1,2,3]) # result shows immediatelly (implicit draw()) print 'continue computation' # at the end call show to ensure window won't close. show() 
178
19 янв. Cavab nosklo 19 yanvar verilir . 2009-01-19 19:52 '09 da 19:52 'da 2009-01-19 19:52

Məsələn, bloklama davranışını ləğv etmək üçün "blok" sözünü istifadə edin.

 from matplotlib.pyplot import show, plot plot(1) show(block=False) # your code 
border=0

kodunuzu davam etdirmək.

115
13 нояб. Cavab yanvar 13-də verilir. 2012-11-13 16:40 '12 at 4:40 2012-11-13 16:40

Qeyri-blocker istifadə etməyi dəstəklədiyindən istifadə etdiyiniz kitabxana ilə həmişə yoxlamaq daha yaxşıdır.

Ancaq daha ümumi bir həllə ehtiyacınız varsa və ya başqa bir yol multprocessing , multprocessing yer alan çox multprocessing modülünü istifadə edərək, ayrı bir prosesi multprocessing her şeyi çalıştırabilirsiniz. Hesablama davam edəcək:

 from multiprocessing import Process from matplotlib.pyplot import plot, show def plot_graph(*args): for data in args: plot(data) show() p = Process(target=plot_graph, args=([1, 2, 3],)) p.start() print 'yay' print 'computation continues...' print 'that rocks.' print 'Now lets wait for the graph be closed to continue...:' p.join() 

Bu, yeni bir prosesin matplotlib və bəzən kompleks ssenarilərdə diskussiya etmək daha çətindir, buna görə mən başqa bir həll etməyi ( blok olmayan API çağırışlarını matplotlib istifadə edərək)

28
19 янв. Cavab nosklo 19 yanvar verilir . 2009-01-19 19:40 '09 saat 19:40 'da 2009-01-19 19:40

Keçir

show() sənədlərində deyilir: 

Qeyri-interaktiv rejimdə nömrələr qapılana qədər bütün nömrələri və blokları göstərin; interaktiv rejimdə qeyri-interaktivdən interaktiv rejimə keçmədən əvvəl nömrələr yaradılmadığı təqdirdə heç bir təsiri yoxdur (tövsiyə edilmir). Bu halda nömrələri əks etdirir, lakin blok deyil.

block sözünün bir eksperimental arqumenti, yuxarıda təsvir edilən bloklama davranışını ləğv etmək üçün True və ya False olaraq təyin edilə bilər.

21
18 янв. 18 yanvarda Nico Schlömer tərəfindən cavab verildi 2013-01-18 14:53 '13 'da 14:53 2013-01-18 14:53

Bu sənədi, başlıqlı matplotlib sənədlərində oxuya bilərsiniz:

Python qabığında matplotlib istifadə

10
19 янв. Cavab nosklo 19 yanvar verilir . 2009-01-19 20:00 '09 saat 20:00 'da, 2009-01-19 20:00' də

Mənim vəziyyətimdə bir neçə pencerenin hesablandığında açılmasını istəmişdim. Müraciət üçün, bu yol:

 from matplotlib.pyplot import draw, figure, show f1, f2 = figure(), figure() af1 = f1.add_subplot(111) af2 = f2.add_subplot(111) af1.plot([1,2,3]) af2.plot([6,5,4]) draw() print 'continuing computation' show() 

Ps. Çox faydalı OAP interface guide matplotlib .

8
21 янв. Cavab meteora 21 yanvar verilir. 2009-01-21 17:05 '09 5:05 pm 2009-01-21 17:05

Bəli, məni məhdudlaşdırmıram əmrlərlə məşğul olmaq çox çətin idi ... Amma nəhayət, " Cookbook / Matplotlib / Animasiyalar - Animasiya seçilmiş qrafik elementləri " ni yenidən işlətməyə müvəffəq oldum, buna görə də iş parçaları ilə işləyir (və ya qlobal dəyişənlər vasitəsilə və ya çox proses Pipe vasitəsilə Ubuntu 10.04 Python 2.6.5.

Ssenariyi burada tapa bilərsiniz: Animating_selected_plot_elements-readread.py - istinad üçün aşağıda (az şərh ilə) yapışdırın:

 import sys import gtk, gobject import matplotlib matplotlib.use('GTKAgg') import pylab as p import numpy as nx import time import threading ax = p.subplot(111) canvas = ax.figure.canvas # for profiling tstart = time.time() # create the initial line x = nx.arange(0,2*nx.pi,0.01) line, = ax.plot(x, nx.sin(x), animated=True) # save the clean slate background -- everything but the animated line # is drawn and saved in the pixel buffer background background = canvas.copy_from_bbox(ax.bbox) # just a plain global var to pass data (from main, to plot update thread) global mypass # http://docs.python.org/library/multiprocessing.html#pipes-and-queues from multiprocessing import Pipe global pipe1main, pipe1upd pipe1main, pipe1upd = Pipe() # the kind of processing we might want to do in a main() function, # will now be done in a "main thread" - so it can run in # parallel with gobject.idle_add(update_line) def threadMainTest(): global mypass global runthread global pipe1main print "tt" interncount = 1 while runthread: mypass += 1 if mypass > 100: # start "speeding up" animation, only after 100 counts have passed interncount *= 1.03 pipe1main.send(interncount) time.sleep(0.01) return # main plot / GUI update def update_line(*args): global mypass global t0 global runthread global pipe1upd if not runthread: return False if pipe1upd.poll(): # check first if there is anything to receive myinterncount = pipe1upd.recv() update_line.cnt = mypass # restore the clean slate background canvas.restore_region(background) # update the data line.set_ydata(nx.sin(x+(update_line.cnt+myinterncount)/10.0)) # just draw the animated artist ax.draw_artist(line) # just redraw the axes rectangle canvas.blit(ax.bbox) if update_line.cnt>=500: # print the timing info and quit print 'FPS:' , update_line.cnt/(time.time()-tstart) runthread=0 t0.join(1) print "exiting" sys.exit(0) return True global runthread update_line.cnt = 0 mypass = 0 runthread=1 gobject.idle_add(update_line) global t0 t0 = threading.Thread(target=threadMainTest) t0.start() # start the graphics update thread p.show() print "out" # will never print - show() blocks indefinitely! 

Bu birinə kömək edir
Hooray!

6
11 нояб. cavab verildi 2010-11-11 00:55 '10 at 0:55 2010-11-11 00:55

Vacib : Bir şeyi aydınlaşdırmaq üçün. Əmrləri .py skriptinin içərisində .py.py scriptindən, məsələn, python script.py konsolundan istifadə olunur.

Mənim üçün işləyən sadə bir yol:

  1. Bloku istifadə edin = Yanlış şou içində: plt.show (block = False)
  2. .Py scriptin sonunda başqa bir şou () istifadə edin.

Məsələn file script.py :

 plt.imshow(*something*) plt.colorbar() plt.xlabel("true ") plt.ylabel("predicted ") plt.title(" the matrix") # Add block = False plt.show(block = False) ################################ # OTHER CALCULATIONS AND CODE HERE ! ! ! ################################ # the next is the last line of my script plt.show() 

6
08 марта '17 в 17:37 2017-03-08 17:37 Cavab seralouk tərəfindən verilir 8 Mart '17 17:37 2017-03-08 17:37

Bir çox hallarda, sabit diskdə bir .png faylı kimi bir görüntü qənaət etmədən daha rahatdır . Buna görə:

<strong> faydaları:

  • Siz onu aça bilər, baxa bilərsiniz və prosesin istənilən vaxtını bağlaya bilərsiniz. Ərizə uzun müddət çalışırsa bu xüsusilə faydalıdır.
  • Heç bir şey görünmür və pəncərələr açılmır. Bu, bir çox nömrələrlə məşğul olduqda xüsusilə faydalıdır.
  • Görünüşünüz gələcək istifadəsi üçün mümkündür və rəsm pəncərəsi bağlandıqda itirilmir.

Eksi:

  • Düşündüyüm tək şey, axtarış və qovluğu tapmaq və özünüzü özünüzü açmaq lazımdır.
5
18 дек. cavab elgehelge 18 dec tərəfindən verilir . 2013-12-18 21:21 '13 saat 09:21 'da 2013-12-18 21:21

Konsolda çalışırsan IPython , digər cavablarda göstərildiyi kimi plt.show(block=False) istifadə edə bilərsiniz. Təmiz olduğunuz halda, yalnız yaza bilərsiniz:

 plt.show(0) 

Nə eyni olacaq.

5
18 янв. Anton Protopopovun 18 yanvarda cavabı 2016-01-18 14:11 '16 at 2:11 PM 2016-01-18 14:11

Mən də qrafikimin qalan hissəsinin (və sonra da göstərməyə davam etmək üçün) qrafika göstərməsini istəmişəm, hətta səhv olsa da (bəzən hata ayarı üçün qrafik istifadə edirəm). Bu kiçik hack kodunu bəyanatın içərisində olan hər hansı bir qrafik belə bir davranışla kodlaşdırdıq.

Bu, ehtimal ki, çox qeyri-standartdır və istehsal kodu üçün tövsiyə edilmir. Yəqin ki, bu kodda gizli bir çox var.

 from contextlib import contextmanager @contextmanager def keep_plots_open(keep_show_open_on_exit=True, even_when_error=True): ''' To continue excecuting code when plt.show() is called and keep the plot on displaying before this contex manager exits (even if an error caused the exit). ''' import matplotlib.pyplot show_original = matplotlib.pyplot.show def show_replacement(*args, **kwargs): kwargs['block'] = False show_original(*args, **kwargs) matplotlib.pyplot.show = show_replacement pylab_exists = True try: import pylab except ImportError: pylab_exists = False if pylab_exists: pylab.show = show_replacement try: yield except Exception, err: if keep_show_open_on_exit and even_when_error: print "*********************************************" print "Error early edition while waiting for show():" print "*********************************************" import traceback print traceback.format_exc() show_original() print "*********************************************" raise finally: matplotlib.pyplot.show = show_original if pylab_exists: pylab.show = show_original if keep_show_open_on_exit: show_original() # *********************** # Running example # *********************** import pylab as pl import time if __name__ == '__main__': with keep_plots_open(): pl.figure('a') pl.plot([1,2,3], [4,5,6]) pl.plot([3,2,1], [4,5,6]) pl.show() pl.figure('b') pl.plot([1,2,3], [4,5,6]) pl.show() time.sleep(1) print '...' time.sleep(1) print '...' time.sleep(1) print '...' this_will_surely_cause_an_error 

"Qrafikləri açıq saxlamağa (hətta bir səhv baş verərsə) və yeni qrafiklərin göstərilməsinə icazə vermək üçün" düzgün istifadə etsəniz, heç bir istifadəçi müdaxiləsi fərqli deyilmirsə (komanda icrası üçün) scriptin düzgün çıxmasını istərəm.

"Ssenarinin sonu!" Kimi bir şey istifadə edə bilərəm? Növbəti cədvəlin çıxılmasını (5 saniyə var) isterseniz p basın: " https://stackoverflow.com/questions/26704840/corner istifadə üçün giriş-kəsilmə-həyata keçirmək

3
04 нояб. Cavab Simon Streicher tərəfindən verilir 04 Noyabr. 2014-11-04 15:14 '14 at 15:14 2014-11-04 15:14

Mən də plt.pause(0.001) əlavə plt.pause(0.001) ki, əslində plt.pause(0.001) içərisində işləmişdir (əks halda yalnız ilk və son grafiği göstərmək olar):

 import matplotlib.pyplot as plt plt.scatter([0], [1]) plt.draw() plt.show(block=False) for i in range(10): plt.scatter([i], [i+1]) plt.draw() plt.pause(0.001) 
3
09 нояб. Cavab Martin Pecka 09 noyabr tarixində verilir. 2016-11-09 17:16 '16 saat 05:16 'də 2016-11-09 17:16
 plt.figure(1) plt.imshow(your_first_image) plt.figure(2) plt.imshow(your_second_image) plt.show(block=False) # That important raw_input("Press ENTER to exist") # Useful when you run your Python script from the terminal and you want to hold the running to see your figures until you press Enter 
2
21 февр. cavab 21 fevraldan çox verilir. 2017-02-21 09:27 '17 'da 9:27' də 2017-02-21 09:27 'də

Sistemimdə, show () işarəsi əvvəlində, komutun istifadəçinin cədvəllə qarşılıqlı davranmasını gözləməsini istəməsinə baxmayaraq (və data toplamaq pick_event geri çağırışları) davam etməzdən əvvəl.

Gediş pəncərəsi bağlanana qədər icrası maneə törətmək üçün aşağıdakıları istifadə etdim:

 fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot(x,y) # set processing to continue when window closed def onclose(event): fig.canvas.stop_event_loop() fig.canvas.mpl_connect('close_event', onclose) fig.show() # this call does not block on my system fig.canvas.start_event_loop_default() # block here until window closed # continue with further processing, perhaps using result from callbacks 

Buna baxmayaraq, canvas.start_event_loop_default () aşağıdakı xəbərdarlıq verir:

 C:\Python26\lib\site-packages\matplotlib\backend_bases.py:2051: DeprecationWarning: Using default event loop until function specific to this GUI is implemented warnings.warn(str,DeprecationWarning) 

skript hələ də qaçırdı.

2
17 марта '11 в 8:06 2011-03-17 08:06 Cavab 17 mart 2011-ci il tarixində, 8: 03-də, Andrew tərəfindən verilmişdir

Mənim fikrimcə, bu mövzuda verilən cavablar, hər sistem üçün işləməyən və animasiya kimi daha mürəkkəb vəziyyətlərdə işləyən metodları təmin edir. MiKTeX cavabını növbəti filialda nəzərdən keçirirəm, burada etibarlı bir metod tapıldı: matplotlib animasiyasının necə bitməsini gözləmək üçün necə?

1
27 дек. Cavab MikeTeX 27 dekabr verilir. 2015-12-27 09:17 '15 at 9:17 'də 2015-12-27 09:17

Bir neçə şəkil açmaq istəyirsinizsə və onları açdığınız zaman bu kod mənim üçün işləyirdi:

 show(block=False) draw() 
0
16 сент. Cavab DomDev 16 sentyabrda verilir. 2016-09-16 18:11 '16 'da saat 18:11' də 2016-09-16 18:11 'də

Soruyu düzgün bir şəkildə anlayıramsa, Ipython (ya da Ipython Qt və ya Ipython laptop) istifadə edərək, hesablamalar təkrar arka planda davam edərkən, proqramla interaktiv şəkildə işləməyə imkan verəcəkdir. http://ipython.org/

0
24 мая '12 в 7:18 2012-05-24 07:18 24 May 'da saat 07:18 ' da xristofoslara cavab verilir 2012-05-24 07:18

Burada yeniləmə (Windows 10-da python 3.6.5).

Mən hər cür birləşməni sınamışam - tapdığım ən sadə şey, sadəcə, hər bir qrafikdən sonra pause(0.01) istifadə etməkdir - aralıq cədvəllər üçün show() ehtiyac yoxdur - sonra bir show() metodunun sonunda sonuncu bölməyə baxa bilərsiniz feshedilməzdən əvvəl.

Məsələn, burada müxtəlif array ölçüləri üçün sürəti yoxlamaq üçün istifadə etdiyim kodun bir parçasıdır - grafikdə daha yüksək dəyərlər daha yüksək sürətlə deməkdir ... 10 üst-üstə düşən qrafik var ...

 from pylab import * import matplotlib.pyplot as plt from time import * ttot=clock(); mmax=6;npts=20;nplts=10; x=[int(a+0.5) for a in 10**linspace(0,mmax,npts)] for nrun in range(nplts): j=0;aa=1;bb=1;b=1; tim=zeros(npts) for n in x: aa=rand(n);bb=aa;b=aa; if n<100:m=10000 elif n<5000:m=1000 elif n<20000:m=100 else:m=100 tt=clock() for ii in range(1,m+1): b=aa*bb+aa tt1=clock()-tt tim[j]=tt1/n/m j=j+1 print(n,2/(tt1/n/m)/1e6); plt.semilogx(x,2/tim/1e6) pause(0.01) print(clock()-ttot) show() 
0
27 июня '18 в 4:47 2018-06-27 04:47 Cavab marzetti 27 iyun '18 saat 04:47 ' də verilir 2018-06-27 04:47

tags haqqında suallar və ya bir sual