IPython में प्रदर्शन के बिना pylab.savefig को कॉल करना


111

मुझे IPython नोटबुक में प्रदर्शित किए बिना किसी फ़ाइल में एक आकृति बनाने की आवश्यकता है। मैं इस संबंध में IPythonऔर matplotlib.pylabइस संबंध में स्‍पष्‍ट नहीं हूं । लेकिन, जब मैं कॉल pylab.savefig("test.png")करता हूं तो वर्तमान आकृति को सहेजे जाने के अलावा प्रदर्शित किया जाता है test.png। प्लॉट फ़ाइलों के एक बड़े सेट के निर्माण को स्वचालित करते समय, यह अक्सर अवांछनीय होता है। या ऐसी स्थिति में कि किसी अन्य ऐप द्वारा बाहरी प्रसंस्करण के लिए एक मध्यवर्ती फ़ाइल वांछित है।

यकीन नहीं होता कि यह एक matplotlibया IPythonनोटबुक प्रश्न है।


@Staticfloat द्वारा जवाब मेरे लिए तब भी काम किया गया जब एक नोटबुक के भीतर नहीं, और जब जूलियालैंग के माध्यम से मेटप्लोटलिब का उपयोग किया गया; का उपयोग करioff
Vass

जवाबों:


173

यह एक matplotlib सवाल है, और आप इसके लिए एक बैकएंड का उपयोग करके प्राप्त कर सकते हैं जो उपयोगकर्ता को प्रदर्शित नहीं करता है, जैसे 'Agg':

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

संपादित करें: यदि आप प्लॉट प्रदर्शित करने की क्षमता नहीं खोना चाहते हैं, तो इंटरएक्टिव मोड को बंद कर दें , और केवल plt.show()तब कॉल करें जब आप प्लॉट प्रदर्शित करने के लिए तैयार हों:

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()

2
ठीक है - लेकिन, मैं आमतौर पर iPython के भीतर इनलाइन प्लॉटिंग को बनाए रखना चाहता हूं। यदि आप सुझाव देते हैं कि बैकएंड पर एक पूर्ण स्विच बनाने पर यह ठीक काम करता है। सवाल यह है कि आप इनलाइन प्लॉटिंग की सामान्य स्थिति के लिए कैसे बचत आंकड़ों के असाधारण मामले (इनलाइन दिखाए बिना) की अनुमति देते हैं। आपके सुझाव के साथ, मैंने मॉड्यूल को फिर से लोड करने और अस्थायी रूप से बैकेंड को बदलने का प्रयास किया, लेकिन सफलता के बिना। कैसे एक iPython नोटबुक सत्र के भीतर बैकएंड को अस्थायी रूप से बदलने के बारे में कोई विचार?
टीएनटी

1
मैंने इंटरैक्टिव प्लॉटिंग close()और show()कमांड्स के बारे में बात करने के लिए प्रश्न को अपडेट किया है , जो आपकी समस्या को हल करना चाहिए। फ्लाई पर बैकएंड को बदलने का समर्थन नहीं किया गया है, जैसा कि आपने खोजा है।
स्टेटफ्लोअट

3
उत्कृष्ट प्रतिक्रिया के लिए धन्यवाद। ऐसा लगता है कि मेरी जरूरत के लिए plt.close (अंजीर) प्रमुख कमांड है। मैं अभी भी आईओएफ पर स्पष्ट नहीं हूं क्योंकि यह ऑपरेशन को प्रभावित नहीं करता है; लेकिन, मुझे शायद कुछ याद आ रहा है। एक बार फिर धन्यवाद।
tnt

1
जो नुस्खा मैंने दिया है वह एक सामान्य है; यदि आप ipython नोटबुक में काम नहीं कर रहे हैं, तो plt.ioff () स्क्रीन पर और फ़्लिकर करने से आंकड़ों को रोकना महत्वपूर्ण है, क्योंकि जैसे ही आप plt.plot()इंटरेक्टिव मोड चालू करते हैं, कमांड-लाइन ipython के आंकड़े प्लॉट किए जाते हैं । इंटरेक्टिव मोड को बंद करने से किसी भी प्लॉट के प्रदर्शन में देरी होती है plt.show()। क्योंकि आप ipython नोटबुक का उपयोग कर रहे हैं, इंटरैक्टिव मोड को अलग तरह से व्यवहार किया जाता है।
स्टेटिकफ्लोट

मेरे लिए, matplotlib.use('Agg')अकेले ने चाल चली। मुझे किसी भी plt.show()या plt.ioff()अपने कोड में बिल्कुल भी ज़रूरत नहीं थी ।
झनवेन चेन

67

हम की जरूरत नहीं plt.ioff()या plt.show()(यदि हम का उपयोग %matplotlib inline)। आप बिना कोड के ऊपर परीक्षण कर सकते हैं plt.ioff()plt.close()आवश्यक भूमिका है। इसको आजमाओ:

%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

यदि आप इस कोड को iPython में चलाते हैं, तो यह दूसरा प्लॉट प्रदर्शित करेगा, और यदि आप plt.close(fig2)इसके अंत में जोड़ते हैं , तो आप कुछ भी नहीं देखेंगे।

अंत में, यदि आप आंकड़ा पास करते हैं , तो plt.close(fig)यह प्रदर्शित नहीं होगा।


5
बेहतर समाधान वास्तव में! मैं एक लूप में कई भूखंडों को उत्पन्न और सहेजता हूं। plt.ioffमेरे साथ RuntimeWarning: More than 20 figures have been opened...plt.closeउसे हल कर लिया।
नागासाकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.