2011-03-01 8 views
6

मैं इसmatplotlib pyplot शो() एक बार काम नहीं करता है बंद कर दिया

#!/usr/bin/env python 
import matplotlib.pyplot as p 

for i in xrange(N): 
    # Create my_image here 

    # Display this image 
    p.figure() 
    p.imshow(my_image) 
    p.show() 
    p.close() 

इस तरह एक पाश ठीक जब मैं = 0 काम करता है। कार्यक्रम जारी रखने के लिए, मुझे pyplot द्वारा बनाई गई नई आकृति को बंद करने की आवश्यकता है। अन्य सभी लूप पुनरावृत्तियों (i> 0) के लिए, एक और नया आंकड़ा नहीं बनाया गया है, एक साजिश प्रस्तुत नहीं की गई है और कार्यक्रम बस चलता है। एक आकृति बनाने वाले pyplot को बंद करने में असमर्थ क्यों एक नया (MATLAB की तरह) खोलने में असमर्थ है?

व्यवहार जो मैं उम्मीद है:

  1. निष्पादन p.show()
  2. जब मैं आंकड़ा बंद करते हैं, निष्पादन जारी है पर बंद हो जाता
  3. जब p.show() फिर से, का सामना करना पड़ा है नई छवि प्रदर्शित होती है।
  4. दोहराएँ चरण 2 से अधिक नहीं साजिश जब तक दिखाने के लिए
+0

पर मैं एन> = 2 के लिए अनुक्रमिक भूखंडों बनाने के लिए कर रहा हूँ। आप किस आईडीई का उपयोग कर रहे हैं (यदि आप एक का उपयोग कर रहे हैं)? मुझे अगली बार मिलने से पहले साजिश को मैन्युअल रूप से बंद करना होगा, इसलिए इस उदाहरण में 'p.close() 'व्यर्थ है। – Paul

+0

मैं स्क्रिप्ट लिखने और इसे चलाने के लिए PyCharm का उपयोग करता हूं। मुझे लगता है कि यह समस्या केवल तब होती है जब ipython -pylab –

उत्तर

3

यह matplotlib के पिछले संस्करणों में एक बग से हो सकता है। मुझे एक ही समस्या हो रही थी जब मैंने अनुक्रमिक show() आदेश जारी किए - केवल पहला दिखाएगा (और रहें); लेकिन, जब मैंने 1.0.1 पर matplotlib को अद्यतन किया तो समस्या दूर हो गई।

+0

मै मैटलप्लिब एसवीएन में अपडेट किया गया और समस्या दूर हो गई। मुझे लगता है कि यह एक बग है। –

+2

यह संस्करण 1.0 के लिए 'नया क्या है' था।1: एक लंबा स्थायी अनुरोध दिखाने के लिए एकाधिक कॉल का समर्थन करना है()। यह मुश्किल रहा है क्योंकि ऑपरेटिंग सिस्टम, यूजर इंटरफेस टूलकिट्स और संस्करणों में लगातार व्यवहार करना मुश्किल है। एरिक फायरिंग ने बैकएंड में शो को तर्कसंगत बनाने पर बहुत सारे काम किए हैं, वांछित व्यवहार से शो बनाने के लिए सभी नए बनाए गए आंकड़े उठाएं और निष्पादन को बंद कर दें जब तक कि वे बंद न हों। दिखाने के लिए दोहराए गए कॉल को आखिरी कॉल के बाद नए बनाए गए आंकड़े उठाना चाहिए ... – wim

5

imshow के चेतन करने के लिए एक बेहतर तरीका हो सकता है, लेकिन यह एक चुटकी में काम करना चाहिए। यह animation example from the docs का हल्का संशोधित संस्करण है।

# For detailed comments on animation and the techniqes used here, see 
# the wiki entry http://www.scipy.org/Cookbook/Matplotlib/Animations 

import matplotlib 
matplotlib.use('TkAgg') 

import matplotlib.pyplot as plt 
import matplotlib.mlab as mlab 
import matplotlib.cm as cm 

import sys 
import numpy as np 
import time 

ax = plt.subplot(111) 
canvas = ax.figure.canvas 

delta=0.025 
x=y= np.arange(-3.0, 3.0, delta) 
x,y=np.meshgrid(x, y) 
z1=mlab.bivariate_normal(x, y, 1.0, 1.0, 0.0, 0.0) 
z2=mlab.bivariate_normal(x, y, 1.5, 0.5, 1, 1) 
z=z2-z1 # difference of Gaussians 

def run(z): 
    fig=plt.gcf() 
    for i in range(10): 
     plt.imshow(z, interpolation='bilinear', cmap=cm.gray, 
        origin='lower', extent=[-3,3,-3,3]) 
     canvas.draw() 
     plt.clf() 
     z**=2 

manager = plt.get_current_fig_manager() 
manager.window.after(100, run, z) 
plt.show() 
+1

में स्क्रिप्ट के रूप में चल रहा है आपका समाधान एनीमेशन के लिए बहुत अच्छा है। लेकिन मैं जो चाहता हूं वह एनीमेशन नहीं है, मैं बस एक साधारण MATLAB जैसा व्यवहार चाहता हूं जहां मैं एक निश्चित छवि/मैट्रिक्स देख सकता हूं क्योंकि मेरे एल्गोरिदम चलता है। –

+0

@ डेटा चु: मैं MATLAB के व्यवहार को नहीं जानता। – unutbu

+0

@ डेटा चु: क्या आपको प्लॉट प्रदर्शित होने के दौरान कोड निष्पादन रोकना आवश्यक है? – Paul

0

unutbu के उदाहरण के साथ घूमने के बाद, मुझे एक ऐसा व्यवहार मिला जो मैं सामान्य रूप से और पीडीडीव के साथ डीबग कर सकता था जहां मैं भूखंडों को धीरे-धीरे देख सकता था।

import time, threading 
import numpy 
from matplotlib.pyplot import * 

x = numpy.linspace(0, 10) 
y = x**2 

def main(): 
    plot(x, x) 
    draw() 
    time.sleep(2) 
    plot(x, y) 
    draw() 

thread = threading.Thread() 
thread.run = main 

manager = get_current_fig_manager() 
manager.window.after(100, thread.start) 
figure(1) 
show() 
+0

ध्यान दें कि यदि आपके पास एकाधिक आंकड़े हैं, तो मैं सुझाव देता हूं कि आप चित्र विंडो को दिखाने से पहले उन्हें 'प्रीलाकेट' करें। अन्यथा, किसी भी नई आकृति खिड़कियां कॉलिंग थ्रेड तक ही सीमित हैं। – eacousineau

+0

कोई बात नहीं, ऐसा लगता है कि 'मुख्य लूप में नहीं' त्रुटि फेंकती है ... – eacousineau

0

मैं लंबे समय से इस समस्या की जांच कर रहे किया गया है और हालांकि मैं अच्छी तरह से है यह अभी तक जांच नहीं की मैं एक समाधान हो सकता है।

कुंजी मैटलैब की तरह कोड लिखने में है, अपने आंकड़ों का नाम दें और फिर उन्हें दिखाने के लिए कॉल करें()।

उदाहरण के लिए।

from matplotlib import pyplot as plt 

fig1 = plt.figure() 
fig2 = plt.figure() 

fig1.show() 
fig2.show() 

इस एनिमेशन के लिए काम करते हैं और साजिश रचने सकता है विभिन्न चरणों

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