2010-04-08 12 views
16

का उपयोग करते हुए आकृति अद्यतन नहीं कर रहा है matplotlib, pylab, pyplot, ipython के बारे में बहुत सारे प्रश्न हैं, इसलिए मुझे खेद है कि अगर आप यह पूछने में बीमार हैं तो मुझे खेद है। मैं जितना संभव हो उतना विशिष्ट होने की कोशिश करूंगा, क्योंकि मैं लोगों के प्रश्नों को देख रहा हूं और पाइपलॉट और पिलैब के लिए प्रलेखन देख रहा हूं, और मुझे अभी भी यकीन नहीं है कि मैं क्या गलत कर रहा हूं। कोड के साथ:matplotlib.pyplot/pylab isinteractive(), ipython -pylab

लक्ष्य: प्रत्येक 5 सेकंड में एक आकृति प्लॉट करें, और प्लॉट कमांड कहलाए जाने पर आकृति को अपडेट करें।

इस कोडिंग पर मेरे प्रयास इस प्रकार है (IPython -pylab पर चल रहा है):

 

import time 
ion() 
x=linspace(-1,1,51) 
plot(sin(x)) 
for i in range(10): 
    plot([sin(i+j) for j in x]) 
    #see ** 
    print i 
    time.sleep(1) 
print 'Done' 
 

यह सही ढंग से प्रत्येक पंक्ति भूखंडों, लेकिन नहीं है जब तक यह पाश के लिए बाहर निकल गया है। मैंने draw() डालकर एक रेड्रो को मजबूर करने का प्रयास किया है, जहां ** है, लेकिन ऐसा लगता है कि यह भी काम नहीं करता है। आदर्श रूप से, मैं इसे पूर्ण रेड्रा करने की बजाय, प्रत्येक पंक्ति को बस जोड़ना चाहता हूं। यदि पुनर्वितरण की आवश्यकता है, तो यह ठीक है।

हल करने के अतिरिक्त प्रयास:
ion() के ठीक बाद, hold(True) को कोई फायदा नहीं हुआ।
किक के लिए के लिए **
निकटतम जवाब मैं मैं क्या plotting lines without blocking execution पर था ऐसा करने के लिए कोशिश कर रहा हूँ करने के लिए मिल गया है show() कोशिश की, लेकिन show() कुछ नहीं कर रहा है।

अगर यह एक सीधा अनुरोध है, तो मैं क्षमा चाहता हूं, और मैं कुछ स्पष्ट दिख रहा हूं। इसके लायक होने के लिए, यह तब आया जब मैं अपने स्वयं के उपयोग के लिए कक्षा से मैटलैब कोड को कुछ पायथन में परिवर्तित करने की कोशिश कर रहा था। मूल matlab (initializations निकाला गया) जो मैं कन्वर्ट करने के लिए कोशिश कर रहे हैं इस प्रकार है:


for i=1:time 
    plot(u) 
    hold on 
    pause(.01) 
    for j=2:n-1 
     v(j)=u(j)-2*u(j-1) 
    end 
    v(1)= pi 
    u=v 
end 

किसी भी मदद की, भले ही वह बस "देखो this_method" उत्कृष्ट होगा, इसलिए मैं कम से कम पता लगाना करने के लिए अपने प्रयासों को कम कर सकते हैं उस विधि का उपयोग कैसे करें। यदि कोई और जानकारी है जो उपयोगी होगी, तो मुझे बताएं।

+1

[आपको 'time.sleep' की बजाय' pyplot.pause' का उपयोग करना चाहिए।] (Http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1- 1-और-अपडेट-ऑफ-द-प्लॉट-जबकि-द-प्रो) –

+0

मुझे विंडोज़ पर QT4Agg बैकएंड का उपयोग करने में एक ही समस्या थी, मुझे विश्वास है कि यह इस [github issue] से संबंधित है (https://github.com/matplotlib/matplotlib/मुद्दों/1646), pyplot.pause() का उपयोग करके इसे ठीक किया गया। – seumas

उत्तर

10

आपके द्वारा लिंक किए गए प्रश्न का दूसरा उत्तर उत्तर प्रदान करता है: प्रत्येक plot() के बाद इसे तुरंत प्रदर्शित करने के लिए draw() पर कॉल करें; उदाहरण के लिए:

import time 
ion() 
x = linspace(-1,1,51) 
plot(sin(x)) 
for i in range(10): 
    plot([sin(i+j) for j in x]) 
    # make it appear immediately 
    draw() 
    time.sleep(1) 

यदि वह काम नहीं करता है ... कोशिश है कि वे क्या इस पृष्ठ पर कार्य करें: http://www.scipy.org/Cookbook/Matplotlib/Animations

import time 

ion() 

tstart = time.time()    # for profiling 
x = arange(0,2*pi,0.01)   # x-array 
line, = plot(x,sin(x)) 
for i in arange(1,200): 
    line.set_ydata(sin(x+i/10.0)) # update the data 
    draw()       # redraw the canvas 

print 'FPS:' , 200/(time.time()-tstart) 

पेज कहा गया है कि line.set_ydata() समारोह महत्वपूर्ण हिस्सा है।

+2

किसी कारण से यह मेरे लिए काम नहीं कर रहा है। मुझे कोई संदेह नहीं है कि यह सही है, मुझे यकीन नहीं है कि यह मेरे लिए क्यों काम नहीं कर रहा है। जैसे ही पहला प्रिंट होता है, मुझे 10 सेकंड के लिए एक खाली विंडो दिखाई देती है; जिसके बाद सभी ग्राफ दिखाई देते हैं। लेकिन ड्रॉ() लूप के बाहर होने तक अपडेट को मजबूर नहीं कर रहा है। मैंने अभी matplotlib का उपयोग करने के लिए (कोशिश कर रहा है) शुरू किया है- क्या यह "बैकएंड" से संबंधित हो सकता है जिसके बारे में मैंने सुना है? (मुझे नहीं पता कि यह क्या है = /) – NumberOverZero

+1

@NumberOverZero - आप किस प्लेटफ़ॉर्म का उपयोग कर रहे हैं? (विंडोज़/मैक/लिनक्स ...) –

+0

विस्टा अल्टी 64, पायथन 2.6.2 – NumberOverZero

0

कृपया answer देखें यहां मैंने एक समान प्रश्न पर पोस्ट किया है। मैं केवल GTKAgg बैकएंड का उपयोग करके समस्याओं के बिना अपनी एनीमेशन उत्पन्न कर सकता हूं। ऐसा करने के लिए, आप (मैं pylab आयात करने से पहले लगता है) अपनी स्क्रिप्ट के लिए इस लाइन जोड़ने की जरूरत:

matplotlib.use('GTkAgg') 

और भी PyGTK स्थापित करें।

4

मेरे मैक पर चल रहे ipython के साथ एक ही समस्या थी। (मैकबुक प्रो चल रहे बर्फ तेंदुए पर अजगर 2.7 32 बिट का एंथॉट वितरण)।

काम पर एक दोस्त से एक टिप मिला।निम्नलिखित तर्क के साथ टर्मिनल से IPython चलाएँ:

"IPython -wthread -pylab"

यह मेरे लिए काम करता है। "डैनियल जी" का उपरोक्त पायथन कोड घटना के बिना चलता है, जबकि पहले उसने साजिश को अपडेट नहीं किया था।

ipython दस्तावेज़ीकरण के अनुसार: "[-gthread, -qthread, -q4thread, -wthread, -pylab: ...] वे जीटीके, क्यूटी (संस्करण 3 और 4) और WXPython टूलकिट के लिए थ्रेडिंग समर्थन प्रदान करते हैं, और matplotlib पुस्तकालय के लिए। " मुझे नहीं पता कि यह क्यों महत्वपूर्ण है, लेकिन यह काम करता है।

आशा व्यक्त की कि उपयोगी है, labjunky

+1

इस-थ्रेड फ्लैग ने मेरे लिए एक समान समस्या तय की है, जिसमें आंकड़े खिड़कियां बंद होने पर लॉक हो रही हैं। धन्यवाद! – wim

+0

दुख की बात है- थ्रेड्रेड [ipython 0.11 में हटा दिया गया था] (http://ipython.org/ipython-doc/stable/interactive/reference.html#eventloop-integration)। क्या यह काम करने के लिए कोई और तरीका है? –

10
from pylab import * 
import time 
ion() 
tstart = time.time()    # for profiling 
x = arange(0,2*pi,0.01)   # x-array 
line, = plot(x,sin(x)) 
for i in arange(1,200): 
    line.set_ydata(sin(x+i/10.0)) # update the data 
    draw()       # redraw the canvas 
    pause(0.01) 
print 'FPS:' , 200/(time.time()-tstart) 
ioff() 
show() 
#

ऊपर अच्छी तरह से मेरे लिए काम किया। मैं इसे Win7 ओएस के तहत pythonxy2.7.3 में स्पाइडर संपादक में चला गया। आईओएफ() और शो() के बाद ड्रा() के बाद रोकें() कथन पर ध्यान दें।

+0

कुछ भी नहीं था जब तक मैंने विराम (कथन) जोड़ा, तब तक मेरे लिए काम करना (जीत 7 पर भी)। धन्यवाद –

संबंधित मुद्दे