python - matplotlib tutorial




احفظ الرسم على ملف الصورة بدلاً من عرضه باستخدام Matplotlib (9)

إذا كنت تستخدم Spyder IDE ، مثلي ، يجب عليك تعطيل الوضع التفاعلي مع:

plt.ioff()

(يتم تشغيل هذا الأمر تلقائيًا مع بدء التشغيل العلمي)

إذا كنت تريد تمكينه مرة أخرى ، فاستخدم:

plt.ion()

أنا أكتب السيناريو سريع وقذرة لتوليد المؤامرات على الطاير. أستخدم الرمز أدناه (من وثائق 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) ، بحيث يمكن استخدامها على سبيل المثال في برامج نصية مجمعة. كيف يمكنني فعل ذلك؟


إذا لم يعجبك مفهوم الشكل "الحالي" ، فافعل:

import matplotlib.image as mpimg

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

الإجابات الأخرى صحيحة. ومع ذلك ، أحيانًا أجد أنني أريد فتح كائن الشكل لاحقًا. على سبيل المثال ، قد أرغب في تغيير أحجام التسمية أو إضافة شبكة أو إجراء معالجة أخرى. في عالم مثالي ، أود ببساطة إعادة تشغيل الكود الذي يولد المؤامرة ، وتكييف الإعدادات. للأسف ، العالم ليس مثاليا. لذلك ، بالإضافة إلى الحفظ إلى PDF أو PNG ، أضيف:

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

مثل هذا ، يمكنني لاحقًا تحميل كائن الشكل والتلاعب بالإعدادات كما أريد.

أقوم أيضًا بكتابة الكومة مع القاموس المصدر locals() لكل وظيفة / طريقة في المكدس ، حتى أتمكن لاحقًا من معرفة ما الذي أنتج الرقم بالضبط.

ملاحظة: كن حذرا ، لأن هذه الطريقة في بعض الأحيان تولد ملفات ضخمة.


الحل :

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


بعد استخدام plot () ووظائف أخرى لإنشاء المحتوى الذي تريده ، يمكنك استخدام جملة مثل هذه لتحديد ما بين التخطيط إلى الشاشة أو الملف:

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

يقولون أن أسهل طريقة لمنع الشكل من الظهور هو استخدام خلفية غير تفاعلية (على سبيل المثال Agg) ، عبر 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 ) الأرقام لمعالجة البيانات بعد الحلقة. ربما يكون أبطأ من اختيار الواجهة الخلفية غير التفاعلية - سيكون من المثير للاهتمام إذا كان شخص ما قد اختبر ذلك.


وكما قال الآخرون ، فإن plt.savefig() أو fig1.savefig() هي بالفعل طريقة لحفظ الصورة.

ومع ذلك فقد وجدت أنه في حالات معينة (على سبيل المثال. مع Spyder بعد plt.ion() : الوضع التفاعلي = On) يظهر الرقم دائمًا. أنا أعمل حول هذا من خلال إجبار إغلاق نافذة الشكل في حلقة عملاقة ، لذلك ليس لدي مليون شخصية مفتوحة خلال الحلقة:

import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 )  # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png')   # save the figure to file
plt.close(fig)    # close the figure

يمكنك القيام إما:

plt.show(hold=False)
plt.savefig('name.pdf')

وتذكر السماح لإنهاء savefig قبل إغلاق مخطط واجهة المستخدم الرسومية. بهذه الطريقة يمكنك رؤية الصورة مسبقًا.

بدلا من ذلك ، يمكنك النظر إليها مع plt.show() ثم إغلاق واجهة المستخدم الرسومية وتشغيل البرنامج النصي مرة أخرى ، ولكن هذه المرة استبدال plt.show() مع plt.savefig() .

بدلا من ذلك ، يمكنك استخدام

fig, ax = plt.figure(nrows=1, ncols=1)
plt.plot(...)
plt.show()
fig.savefig('out.pdf')

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