2012-02-14 9 views
37

मेरे पास एक साधारण पायथन लिपि है जो एक ही आंकड़े में कुछ ग्राफ प्लॉट करती है। सभी ग्राफ ड्रा() द्वारा बनाए जाते हैं और अंत में मैं शो() फ़ंक्शन को ब्लॉक करने के लिए कॉल करता हूं।Matplotlib पायथन शो() तुरंत लौटता है

स्क्रिप्ट पाइथन 2.6.6, मैटलप्लिब 0.9 9.3, और उबंटू 11.04 के साथ काम करने के लिए प्रयुक्त होती है। इसे पायथन 2.7.2, मैटलप्लिब 1.0.1, और उबंटू 11.10 के तहत चलाने की कोशिश की लेकिन शो() फ़ंक्शन तुरंत आंकड़े को मारने के इंतजार किए बिना लौटता है।

क्या यह एक बग है? या एक नई सुविधा और हमें अपनी स्क्रिप्ट बदलनी होगी? कोई विचार?

संपादित करें: यह साजिश इंटरैक्टिव मोड के तहत खुले रखने करता है, यानी, अजगर मैं ..., लेकिन यह है कि बिना काम करता था, और पटकथा में plt.ion() है और इसे चलाने के लिए करने की कोशिश की सामान्य मोड में लेकिन कोई भाग्य नहीं।

+4

कोड SO का मुख्य विषय है। हमें कुछ – joaquin

+0

दें आप सही हैं। मैंने इसे एक सरल उदाहरण के साथ पुन: उत्पन्न करने की कोशिश की लेकिन वह नहीं कर सका। मैं कोड को ट्रिम करने और समस्या के स्रोत को हाइलाइट करने का प्रयास करूंगा। – gpierris

+0

स्क्रिप्ट – joaquin

उत्तर

29

मुझे लगता है कि show(block=True) का उपयोग करके आपकी समस्या को ठीक करना चाहिए।

+1

उत्तर के लिए धन्यवाद, लेकिन नहीं। शायद वह एक पुराना संस्करण था। यह सिर्फ मुझे बताता है कि ब्लॉक एक अप्रत्याशित तर्क था। – gpierris

+1

@gpierris 'block' तर्क 'show' के लिए कम से कम matplotlib 1.1.0 में मौजूद है। हालांकि, डिफ़ॉल्ट रूप से ब्लॉक करना है ताकि अगर आपने कोड में पहले मोड को नहीं बदला है, तो इसे सही पर सेट करना 'plt.show (block = True)' का उपयोग करके प्रासंगिक – joaquin

+5

प्रासंगिक नहीं है। –

40

मुझे यह वही समस्या थी, और यह pyplot ऑब्जेक्ट के बजाय चित्रा ऑब्जेक्ट पर show() पर कॉल करके हुई थी।

गलत कोड। कारण ग्राफ एक संक्षिप्त पल के लिए स्क्रीन पर फ्लैश करने के लिए:

import matplotlib.pyplot as plt 

    x = [1,2,3] 
    y = [5,6,7] 

    fig = plt.figure() 
    plt.plot(x, y) 

    fig.show() 

अंतिम लाइन ग्राफ को दिखाने के लिए जब तक यह खारिज किया जाता है इस प्रकार होना चाहिए:

plt.show() 
6

inverse problem था, और यह कि matplotlib लगता है कई चीजों के आधार पर इंटरैक्टिव या गैर-इंटरैक्टिव मोड में काम करेगा जो मैं नहीं ढूंढ सकता था (आईडीएलई में एक तरीका, सिस्टम कंसोल में दूसरा, सामान्य स्पाइडर कंसोल में एक और, एक समर्पित व्यक्ति में ...)

यह मेरे लिए काम किया:

import matplotlib 
matplotlib.interactive(False) 

(वास्तव में, मैं इंटरैक्टिव मोड चाहता था, लेकिन आपके मामले में उलटा मदद करनी चाहिए।) ion() और ioff() भी ऐसा ही करना चाहिए, लेकिन इसके बाद के संस्करण, बस pyplot या pylab नहीं matplotlib के स्तर पर है। यह मेरे लिए काम करता है हालांकि मैं (बाद में) pyplot अलग से आयात कर रहा हूं और कभी भी matplotlib को इस तरह से कॉल नहीं करता हूं। मैं सोच रहा हूं कि plt.ion() केवल pyplot पर प्रभाव डालता है, matplotlib के अन्य घटक नहीं जो pyplot का उपयोग करते समय शामिल हो सकते हैं या नहीं भी हो सकते हैं।

यह विधि विंडोज 7 पर पाइथन 2.65 दोनों के साथ मैटप्लॉटिब 0.9 9 और पाइथन 2.75 के साथ मैटलप्लिब 1.3.1 के साथ, दोनों उपलब्ध पायथन कंसोल और आईडीई दोनों सिस्टम (64-बिट, दोनों) पर मेरे लिए काम करती है। हालांकि, यह लिनक्स (सुसे 11.3, 64 बिट) पर काम नहीं करता है, इसलिए

3

पर कुछ प्लेटफार्म निर्भरता निश्चित रूप से शो() पर कॉल करते समय tkagg बैकएंड के साथ matplotlib.show() व्यवहार को दोहराने के लिए है चित्रा ऑब्जेक्ट:

import Tkinter as Tk 
import matplotlib.pyplot as plt 
fig = plt.figure() 
... your plot commands... 
fig.show() 
Tk.mainloop() 
+0

टिंकर एक पैकेज नहीं है। यह tkinter है। – thang

+0

उसका उदाहरण पायथन 2 के लिए सही है, यह पायथन 3 में टिंकर है। Https://stackoverflow.com/questions/25905540/importerror-no-module-named-tkinter यह भी पुष्टि करता है कि उसका समाधान हमारे विशिष्ट उपयोग मामले के लिए काम करता है। धन्यवाद! –

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