python - Matplotlib का उपयोग करके इसे प्रदर्शित करने के बजाय साजिश को छवि फ़ाइल में सहेजें




(9)

मैं फ्लाई पर भूखंड उत्पन्न करने के लिए एक त्वरित और गंदे लिपि लिख रहा हूं। मैं एक प्रारंभिक बिंदु के रूप में नीचे दिए गए कोड ( Matplotlib दस्तावेज से) का उपयोग कर रहा हूँ:

from pylab import figure, axes, pie, title, show

# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]

explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})

show()  # Actually, don't show, just save to foo.png

मैं एक जीयूआई पर साजिश प्रदर्शित नहीं करना चाहता, इसके बजाय, मैं साजिश को एक फ़ाइल में सहेजना चाहता हूं (foo.png कहें), ताकि, उदाहरण के लिए, इसे बैच स्क्रिप्ट में उपयोग किया जा सके। मैं उसको कैसे करू?


अन्य उत्तरों सही हैं। हालांकि, मुझे कभी-कभी लगता है कि मैं बाद में आकृति वस्तु खोलना चाहता हूं। उदाहरण के लिए, मैं लेबल आकार बदलना, ग्रिड जोड़ना चाहता हूं, या अन्य प्रसंस्करण करना चाहता हूं। एक परिपूर्ण दुनिया में, मैं बस साजिश उत्पन्न करने वाले कोड को फिर से चालू कर दूंगा, और सेटिंग्स को अनुकूलित करूँगा। हां, दुनिया सही नहीं है। इसलिए, पीडीएफ या पीएनजी को बचाने के अलावा, मैं जोड़ता हूं:

with open('some_file.pkl', "wb") as fp:
    pickle.dump(fig, fp, protocol=4)

इस तरह, मैं बाद में आकृति ऑब्जेक्ट लोड कर सकता हूं और सेटिंग्स को हेरफेर कर सकता हूं।

मैं स्टैक में प्रत्येक फ़ंक्शन / विधि के लिए स्रोत-कोड और locals() शब्दकोश के साथ स्टैक भी लिखता हूं, ताकि मैं बाद में यह बता सकूं कि आंकड़े किसने उत्पन्न किया है।

एनबी: सावधान रहें, क्योंकि कभी-कभी यह विधि बड़ी फाइलें उत्पन्न करती है।


अपनी इच्छित सामग्री बनाने के लिए साजिश () और अन्य फ़ंक्शंस का उपयोग करने के बाद, आप स्क्रीन पर प्लॉट करने या फ़ाइल करने के बीच चयन करने के लिए इस तरह के एक खंड का उपयोग कर सकते हैं:

import matplotlib.pyplot as plt

fig = plt.figure(figuresize=4, 5)
# use plot(), etc. to create your plot.

# Pick one of the following lines to uncomment
# save_file = None
# save_file = os.path.join(your_directory, your_file_name)  

if save_file:
    plt.savefig(save_file)
    plt.close(fig)
else:
    plt.show()

इस लिंक को बस इस समस्या को संबोधित करने वाले MatPlotLib दस्तावेज़ पर यह लिंक मिला: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear विन्डो- प्रकट

वे कहते हैं कि आंकड़े को पॉप-अप करने से रोकने का सबसे आसान तरीका matplotib.use(<backend>) माध्यम से गैर-इंटरैक्टिव बैकएंड (उदाहरण के लिए matplotib.use(<backend>) , उदाहरण के लिए:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')

मैं अभी भी व्यक्तिगत रूप से plt.close( fig ) का उपयोग करना पसंद करता plt.close( fig ) , तब से आपके पास कुछ आंकड़े (लूप के दौरान) को छिपाने का विकल्प होता है, लेकिन फिर भी पोस्ट-लूप डेटा प्रोसेसिंग के लिए आंकड़े प्रदर्शित करते हैं। यद्यपि यह एक गैर-इंटरैक्टिव बैकएंड चुनने से शायद धीमा है - अगर किसी ने इसका परीक्षण किया तो दिलचस्प होगा।


जबकि सवाल का उत्तर दिया गया है, मैं savefig का उपयोग करते समय कुछ उपयोगी टिप्स जोड़ना चाहता हूं। फ़ाइल प्रारूप को एक्सटेंशन द्वारा निर्दिष्ट किया जा सकता है:

savefig('foo.png')
savefig('foo.pdf')

क्रमशः एक रास्टरराइज्ड या वेक्टरीकृत आउटपुट देगा, जो दोनों उपयोगी हो सकते हैं। इसके अलावा, आप पाएंगे कि pylab छवि के चारों ओर एक उदार, अक्सर अवांछनीय, सफेद जगह छोड़ देता है। इसके साथ निकालें:

savefig('foo.png', bbox_inches='tight')

मैंने निम्नलिखित का उपयोग किया:

import matplotlib.pyplot as plt

p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")  
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")  
plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05),        ncol=2, fancybox=True, shadow=True)

plt.savefig('data.png')  
plt.show()  
f.close()
plt.close()

मुझे आंकड़े को सहेजने के बाद plt.show का उपयोग करना बहुत महत्वपूर्ण लगता है, अन्यथा यह काम नहीं करेगा। पीएनजी में निर्यात आंकड़ा


यदि आपको "वर्तमान" आकृति की अवधारणा पसंद नहीं है, तो करें:

import matplotlib.image as mpimg

img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)

समाधान :

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
plt.figure()
ts.plot()
plt.savefig("foo.png", bbox_inches='tight')

यदि आप छवि को प्रदर्शित करना चाहते हैं और साथ ही छवि उपयोग को सहेजना चाहते हैं:

%matplotlib inline

import matplotlib बाद


समाधान है:

pylab.savefig('foo.png')

import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt

# Create the PdfPages object to which we will save the pages:
# The with statement makes sure that the PdfPages object is closed properly at
# the end of the block, even if an Exception occurs.
with PdfPages('multipage_pdf.pdf') as pdf:
    plt.figure(figsize=(3, 3))
    plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
    plt.title('Page One')
    pdf.savefig()  # saves the current figure into a pdf page
    plt.close()

    plt.rc('text', usetex=True)
    plt.figure(figsize=(8, 6))
    x = np.arange(0, 5, 0.1)
    plt.plot(x, np.sin(x), 'b-')
    plt.title('Page Two')
    pdf.savefig()
    plt.close()

    plt.rc('text', usetex=False)
    fig = plt.figure(figsize=(4, 5))
    plt.plot(x, x*x, 'ko')
    plt.title('Page Three')
    pdf.savefig(fig)  # or you can pass a Figure object to pdf.savefig
    plt.close()

    # We can also set the file's metadata via the PdfPages object:
    d = pdf.infodict()
    d['Title'] = 'Multipage PDF Example'
    d['Author'] = u'Jouni K. Sepp\xe4nen'
    d['Subject'] = 'How to create a multipage pdf file and set its metadata'
    d['Keywords'] = 'PdfPages multipage keywords author title subject'
    d['CreationDate'] = datetime.datetime(2009, 11, 13)
    d['ModDate'] = datetime.datetime.today()




matplotlib