ম্যাটপ্ল্লোব ব্যবহার করে প্লটটি চিত্র প্রদর্শন করার পরিবর্তে প্লটটি সংরক্ষণ করুন


1147

আমি ফ্লাইতে প্লট তৈরি করার জন্য একটি দ্রুত এবং নোংরা স্ক্রিপ্ট লিখছি। আমি নীচের কোডটি ( ম্যাটপ্লটলিব ডকুমেন্টেশন থেকে ) একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করছি :

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 বলে), যাতে এটি উদাহরণস্বরূপ, ব্যাচ স্ক্রিপ্টগুলিতে ব্যবহার করা যায়। আমি কেমন করে ঐটি করি?


84
দেখে মনে হচ্ছে আমি উত্তরটি পেয়েছি: এর পাইব্ল.স্যাভিফিগ ('foo.png')
হোমুনকুলাস রেটিকুলি

2
ম্যাটপ্লটলিব.র.র কোথাও লিঙ্কটি লিঙ্ক করা উচিত?
এ।

40
এছাড়াও পাইলব ব্যবহার না করা হলে ফিগার অবজেক্টেরও একটি savefigপদ্ধতি রয়েছে। সুতরাং আপনি কল করতে পারেন fig = plt.figure()তারপর fig.savefig(...)
এ।

27
উত্তরগুলির মধ্যে অনেকগুলি নীচে পৃষ্ঠা উল্লেখ করে plt.close(fig)যা বড় লুপগুলিতে বিশেষভাবে গুরুত্বপূর্ণ mention অন্যথায় পরিসংখ্যানগুলি উন্মুক্ত থাকে এবং স্মৃতিতে অপেক্ষা করে এবং সমস্ত উন্মুক্ত পরিসংখ্যান সম্পাদন করার সময় প্রদর্শিত হবেplt.show()
টাইম্ট্রটান

বিশেষ দ্রষ্টব্য: matplotlib.pyplot পছন্দ করা হয়: stackoverflow.com/questions/11469336/...
ErichBSchulz

উত্তর:


1435

প্রশ্নের জবাব দেওয়া হলেও, আমি ম্যাটপ্লটলিব.পায়প্লট.স্যাভফিগ ব্যবহার করার সময় কয়েকটি দরকারী টিপস যুক্ত করতে চাই । ফাইল ফর্ম্যাটটি এক্সটেনশন দ্বারা নির্দিষ্ট করা যেতে পারে:

from matplotlib import pyplot as plt

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

যথাক্রমে একটি রাস্টারযুক্ত বা ভেক্টরাইজড আউটপুট দেবে, যা উভয়ই কার্যকর হতে পারে। এছাড়াও, আপনি দেখতে পাবেন যে pylabচিত্রটির চারপাশে একটি উদার, প্রায়শই অনাকাঙ্ক্ষিত, সাদা স্থান ছেড়ে যায়। এটি দিয়ে সরান:

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

9
ফলাফল চিত্রের মাত্রা পরিবর্তন করা কি সম্ভব?
লামাডেডন

43
@ আসমাজেডন plt.savefigআপনি ডিপিআই পরিবর্তন করতে পারবেন, উত্তরের লিঙ্কটি দেখুন। মাত্রা নিয়ন্ত্রণ করা যায় যখন চিত্র তৈরি, দেখতে figsizeমধ্যে matplotlib.org/api/figure_api.html#matplotlib.figure.Figure
লাগানো

5
@ মোঃশিগজি আপনি কল করতে পারেন plt.ioff()যা matplotlib.pyplotকমান্ডগুলিতে আন্তঃসংযোগ অক্ষম করতে হবে ।
রুবেনবিবি

5
@STMohammed foo.png হয় পথ। আপনি উদাহরণস্বরূপ এটি একটি ডিরেক্টরিতে এটি রাখতে পারেন savefig("mydir/foo.png")
লাগানো

2
bbox_inches = 'টাইট' একটি কবজির মতো কাজ করে। আপনি আমার দিনটি তৈরি করেছেন
Catbuilts

204

যেমনটি অন্যরা বলেছেন, plt.savefig()বা fig1.savefig()সত্যই কোনও চিত্র সংরক্ষণ করার উপায়।

তবে আমি খুঁজে পেয়েছি যে নির্দিষ্ট ক্ষেত্রে চিত্রটি সর্বদা প্রদর্শিত হয় । (যেমন Spyder থাকার সঙ্গে। plt.ion()। ইন্টারেক্টিভ মোডে = উপর) আমি আমার দৈত্য লুপ চিত্রে উইন্ডোর বন্ধের জোর করে প্রায় এই কাজ plt.close(figure_object)(দেখুন ডকুমেন্টেশন ), তাই আমি লুপ করার সময় একটি মিলিয়ন খোলা পরিসংখ্যান নেই:

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 window

যদি প্রয়োজন হয় তবে fig.show()নিজেকে পরে চিত্রটি পুনরায় খুলতে সক্ষম হবেন (আমার নিজের পরীক্ষা করা হয়নি)।


9
আপনি সেট করতেও পারেন plt.ioff() # turn of interactive plotting mode, তবে এটি এমন আচরণটি অক্ষম করতে পারে যা আপনি ব্যবহার করতে চান আপনার কোডটি কোনও ত্রুটির সাথে প্রস্থান করা উচিত।
ডেমিস

2
আপনি জুপিটার নোটবুকগুলিতে একই সমস্যা দেখতে পাবেন। plt.close(fig)এটি সমাধান হয়েছে


89

ঠিক এই সমস্যাটিকে সম্বোধন করে MatPlotLib ডকুমেন্টেশনে এই লিঙ্কটি খুঁজে পেয়েছে: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

তারা বলেছে যে চিত্রটি পপিং করা থেকে রোধ করার সবচেয়ে সহজ উপায় হ'ল একটি আন্তঃ-ইন্টারেক্টিভ ব্যাকএন্ড (উদাহরণস্বরূপ এগ্রি) ব্যবহার করা matplotib.use(<backend>), যেমন:

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

আমি এখনও ব্যক্তিগতভাবে ব্যবহার পছন্দ করি plt.close( fig ), তারপরে আপনার কাছে নির্দিষ্ট পরিসংখ্যানগুলি লুকানোর বিকল্প রয়েছে (একটি লুপ চলাকালীন) তবে পোস্ট-লুপের ডেটা প্রক্রিয়াকরণের জন্য এখনও চিত্র দেখান। এটি কোনও ইন্টারঅ্যাক্টিভ ব্যাকএন্ড চয়ন করার চেয়ে সম্ভবত ধীর - যদিও কেউ এটি পরীক্ষা করে।

আপডেট : স্পাইডারের জন্য, আপনি সাধারণত এইভাবে ব্যাকএন্ড সেট করতে পারবেন না (কারণ স্পাইডার সাধারণত ম্যাটপ্ল্লিটিব লোড করে, আপনাকে ব্যবহার থেকে বিরত করে matplotlib.use())।

পরিবর্তে, স্পাইডার প্রিফেসে plt.switch_backend('Agg')" সক্ষম সক্ষম করুন" ব্যবহার করুন বা বন্ধ করুন এবং matplotlib.use('Agg')কমান্ডটি নিজে চালান ।

এই দুটি ইঙ্গিত থেকে: এক , দুই


1
এটি এমন পরিস্থিতির জন্য সত্যই ভাল কাজ করে যেখানে আপনার কোনও সেট প্রদর্শন নেই। সঠিকভাবে সেট না করা .plot()থাকলে এর সাথে অন্য একটি ব্যাকএন্ড ব্যবহার করা একটি ত্রুটি নিক্ষেপ করবে os.environ['DISPLAY']
অর্থনীতি

1
ধন্যবাদ। এটি কাজ করে এবং উত্পাদন সার্ভারগুলির জন্য খুব সহায়ক যেখানে কোনও ইন্টারনেট সংযোগ নেই এবং কোনও প্যাকেজ ইনস্টল করার জন্য সিস্টেম অ্যাডমিনের প্রয়োজন।
লিওন

"ব্যাকেন্ডস" এর বর্ণনা / সংজ্ঞা দেওয়ার জন্য ম্যাটপ্লটলিব সাইটের টিউটোরিয়ালটি আমি পছন্দ করি: matplotlib.org/tutorials/intrrodctory/…
ট্যানার স্ট্রান্ক

47

যদি আপনি "বর্তমান" চিত্রটির ধারণাটি পছন্দ করেন না, তবে করুন:

import matplotlib.image as mpimg

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

2
এটি কি কেবল অনুলিপি করে src.pngনা out.png?
জীবাণু

এটি কেবলমাত্র একটি উদাহরণ, এটি দেখায় যে আপনার যদি কোনও চিত্র অবজেক্ট ( img) থাকে তবে আপনি এটি .imsave()পদ্ধতিতে ফাইলটিতে সংরক্ষণ করতে পারেন ।
আশ্চর্য.মাইস

4
@ আশ্চর্য.মাইস বর্তমান চিত্রটি ব্যবহার না করে কীভাবে একটি চিত্র তৈরি করবেন তা দেখাতে সহায়তা করবে।
scry

@ আশ্চর্য.মাইস এই উদাহরণের জন্য ধন্যবাদ, এটি প্রথমটি যা আমাকে দেখিয়েছিল যে কীভাবে কোনও চিত্রকে .png এ সংরক্ষণ করতে হবে।
আর্থার ডেন্ট

@ স্ক্রি আপনার সবসময় কোনও চিত্র তৈরি করার দরকার হয় না, কখনও কখনও আপনি কিছু কোড চেষ্টা করে দেখতে পারেন এবং এই জাতীয় ইভেন্টগুলিতে এটি কার্যকর।
Schütze

29

অন্য উত্তরগুলি সঠিক। যাইহোক, আমি মাঝে মাঝে যে আমি চিত্রে খুলতে চান বস্তুর পরে। উদাহরণস্বরূপ, আমি লেবেলের আকারগুলি পরিবর্তন করতে, গ্রিড যুক্ত করতে বা অন্য প্রক্রিয়াজাতকরণ করতে চাই। একটি নিখুঁত বিশ্বে, আমি কেবল প্লট তৈরির কোডটি পুনরায় চালু করতে এবং সেটিংসটি মানিয়ে নেব। হায়, পৃথিবী নিখুঁত নয়। অতএব, পিডিএফ বা পিএনজি সঞ্চয় করার পাশাপাশি আমি যুক্ত করছি:

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

এটির মতো, আমি পরে চিত্র চিত্রটি লোড করতে এবং নিজের পছন্দমতো সেটিংসগুলি ম্যানিপুলেট করতে পারি।

আমি স্ট্যাকের locals()প্রতিটি ফাংশন / পদ্ধতির জন্য উত্স-কোড এবং অভিধান সহ স্ট্যাকটিও লিখি , যাতে পরে আমি চিত্রটি কী উত্পন্ন হয়েছিল তা সঠিকভাবে বলতে পারি।

এনবি: সাবধান থাকুন, কখনও কখনও এই পদ্ধতিটি বিশাল ফাইল তৈরি করে।


পরিসংখ্যানগুলি ইনলাইন করে একটি বৃহত্তর নোটবুকে উন্নয়ন করা কি সহজ হবে না? এইভাবে আপনি ঠিক ইতিহাসটি ট্র্যাক করতে পারেন এবং এমনকি এটি পুনরায় চালু করতে পারেন।
সিপ্রিয়ান টোমাইগ ă

3
@ সিপ্রিয়ানটোমিয়াগা আমি কখনও ইন্টারেক্টিভ পাইথন শেল (বৃহস্পতি বা অন্যথায়) থেকে উত্পাদন প্লট তৈরি করি না। আমি স্ক্রিপ্ট থেকে সমস্ত প্লট।
অঙ্কিত

28
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()

28

আপনার পছন্দসই সামগ্রী তৈরি করতে প্লট () এবং অন্যান্য ফাংশন ব্যবহার করার পরে, আপনি স্ক্রিনে প্লট করার জন্য বা ফাইল করার মধ্যে এই জাতীয় একটি ধারা ব্যবহার করতে পারেন:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4, 5))       # size in inches
# 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()

কেউ কেউ বলে fig = plt.figure(figuresize=4, 5)কিছু হতে পারেfig = plt.figure(figsize=(4, 5)) #figure sizes in inches
ব্যবহারকারী

24

আমি নিম্নলিখিত ব্যবহার:

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 ব্যবহার করা খুব গুরুত্বপূর্ণ মনে করেছি, অন্যথায় এটি কাজ করবে না। চিত্র png মধ্যে রফতানি


2
দুঃখিত, এই কি? প্লট করা ছবি ফাইল? f= plt.savefig('data.png')
মোর্স

14

আপনি হয় করতে পারেন:

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

এবং জিইউআই প্লটটি বন্ধ করার আগে সেভফিগ শেষ করতে দিন। এইভাবে আপনি ছবিটি আগেই দেখতে পাবেন।

অন্যথা, আপনার সাথে এটি তাকান করতে plt.show() তখন ঘনিষ্ঠ গুই এবং স্ক্রিপ্ট আবার চালাতে, কিন্তু এই সময় প্রতিস্থাপন plt.show()সঙ্গে plt.savefig()

বিকল্পভাবে, আপনি ব্যবহার করতে পারেন

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

2
অপ্রত্যাশিত কীওয়ার্ড আর্গুমেন্টটি 'হোল্ড'
পেয়েছে

13

যদি আমার মতো আপনিও স্পাইডার আইডিই ব্যবহার করেন তবে আপনাকে এর সাথে ইন্টারেক্টিভ মোডটি অক্ষম করতে হবে:

plt.ioff()

(এই কমান্ডটি স্বয়ংক্রিয়ভাবে বৈজ্ঞানিক সূচনা দিয়ে চালু করা হবে)

আপনি যদি এটি আবার সক্ষম করতে চান তবে ব্যবহার করুন:

plt.ion()


12

সমাধান :

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


9

প্রশ্ন অনুসারে ম্যাটপ্ল্লোব (পাইপলট) ​​সেভফিগ ফাঁকা চিত্র আউটপুট দেয়

একটি জিনিস লক্ষ্য করা উচিত: আপনি যদি ব্যবহার করেন plt.showএবং এটি পরে হওয়া উচিত plt.savefig, বা আপনি একটি ফাঁকা চিত্র দেবেন।

একটি বিস্তারিত উদাহরণ:

import numpy as np
import matplotlib.pyplot as plt


def draw_result(lst_iter, lst_loss, lst_acc, title):
    plt.plot(lst_iter, lst_loss, '-b', label='loss')
    plt.plot(lst_iter, lst_acc, '-r', label='accuracy')

    plt.xlabel("n iteration")
    plt.legend(loc='upper left')
    plt.title(title)
    plt.savefig(title+".png")  # should before plt.show method

    plt.show()


def test_draw():
    lst_iter = range(100)
    lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
    # lst_loss = np.random.randn(1, 100).reshape((100, ))
    lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
    # lst_acc = np.random.randn(1, 100).reshape((100, ))
    draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")


if __name__ == '__main__':
    test_draw()

এখানে চিত্র বর্ণনা লিখুন


6
import matplotlib.pyplot as plt
plt.savefig("image.png")

জুপিটার নোটবুকে আপনাকে একটি কক্ষে থাকা প্লট-কোডের সাথে একসাথে মুছে ফেলা plt.show()এবং যুক্ত plt.savefig()করতে হবে। চিত্রটি এখনও আপনার নোটবুকে প্রদর্শিত হবে।


1
"plt.show () সরান" .. এটি আমার দিনটি রক্ষা করেছে ...
গুরু

4

প্রদত্ত যে আজ (যখন এই প্রশ্ন করা হয়েছিল উপলব্ধ ছিল না) মানুষের প্রচুর, পাইথন কনসোল হিসাবে Jupyter নোটবুক ব্যবহার আছে অত্যন্ত সহজ উপায় হিসেবে প্লট সংরক্ষণ করতে হয় .png, শুধু কল matplotlibএর pylabJupyter নোটবুক থেকে বর্গ, ফিগার প্লটে বিভক্ত 'ইনলাইন 'জুপিটার সেলগুলি এবং তারপরে সেই চিত্র / চিত্রটিকে স্থানীয় ডিরেক্টরিতে টেনে আনুন। %matplotlib inlineপ্রথম লাইনে ভুলবেন না!


1
এটি একটি ভাল ধারণা, যদি চিত্রটি নোটবুকটিতে এম্বেড করা হয় তবে
ফাইলাইজের উপরের প্রভাবটি

3

উপরেরগুলির সাথে অতিরিক্ত হিসাবে, আমি __file__নামের জন্য যুক্ত করেছি যাতে ছবি এবং পাইথন ফাইল একই নাম পায়। এটিকে আরও ভাল দেখানোর জন্য আমি কয়েকটি যুক্তি যুক্ত করেছি:

# Saves a PNG file of the current graph to the folder and updates it every time
# (nameOfimage, dpi=(sizeOfimage),Keeps_Labels_From_Disappearing)
plt.savefig(__file__+".png",dpi=(250), bbox_inches='tight')
# Hard coded name: './test.png'

2

ব্যবহার করার সময় matplotlib.pyplot, আপনাকে অবশ্যই প্রথমে আপনার প্লটটি সংরক্ষণ করতে হবে এবং তারপরে এই 2 টি লাইন ব্যবহার করে এটি বন্ধ করতে হবে:

fig.savefig('plot.png') # save the plot, place the path you want to save the figure in quotation
plt.close(fig) # close the figure window

1

পূর্বে প্রস্তাবিত হিসাবে, আপনি হয় ব্যবহার করতে পারেন:

import matplotlib.pyplot as plt
plt.savefig("myfig.png")

আপনি প্রদর্শন করছেন যে আইফিটন ইমেজ সংরক্ষণ করুন। অথবা অন্য কোনও নোটে (একটি ভিন্ন কোণ থেকে দেখে), আপনি যদি কখনও ওপেন সিভি দিয়ে কাজ করতে যান বা আপনার যদি খোলা সিভি আমদানি করা হয় তবে আপনি যেতে পারেন:

সিভি 2 আমদানি করুন

cv2.imwrite ( "myfig.png", চিত্র)

তবে আপনার যদি ওপেন সিভি নিয়ে কাজ করার দরকার হয় তবে এটি কেবলমাত্র। অন্যথায় plt.savefig () যথেষ্ট হওয়া উচিত।


0

আপনি যে কোনও এক্সটেনশন (পিএনজি, জেপিজি, ইত্যাদি) এবং আপনি চান এমন রেজোলিউশনের সাহায্যে আপনার চিত্রটি সংরক্ষণ করতে পারেন। আপনার চিত্রটি সংরক্ষণ করার জন্য এখানে একটি ফাংশন রয়েছে।

import os

def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):
    path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)
    print("Saving figure", fig_id)
    if tight_layout:
        plt.tight_layout()
    plt.savefig(path, format=fig_extension, dpi=resolution)

'ফিগার_আইডি' সেই নামটি দিয়ে আপনি নিজের চিত্রটি সংরক্ষণ করতে চান। আশা করি এটা সাহায্য করবে:)


0

আপনি এটি এর মতো করতে পারেন:

def plotAFig():
  plt.figure()
  plt.plot(x,y,'b-')
  plt.savefig("figurename.png")
  plt.close()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.