ইন্টারেক্টিভ ম্যাটপ্লটলিব পরিসংখ্যান সংরক্ষণ করা


119

ম্যাটপ্ল্লিটব চিত্রটিকে কীভাবে সংরক্ষণ করার কোনও উপায় আছে যাতে এটি পুনরায় খোলা যায় এবং আদর্শ ইন্টারঅ্যাকশন পুনরুদ্ধার করা যায়? (এমএটিএলবিতে .fig ফর্ম্যাটটি পছন্দ?)

এই ইন্টারেক্টিভ পরিসংখ্যানগুলি তৈরি করতে আমি নিজেকে বহুবার একই স্ক্রিপ্টগুলি চালাচ্ছি। অথবা আমি আমার কলিগদের প্লটটির বিভিন্ন দিক দেখানোর জন্য একাধিক স্ট্যাটিক পিএনজি ফাইল পাঠাচ্ছি। আমি বরং চিত্র চিত্রটি প্রেরণ করব এবং তাদের সাথে এটির সাথে যোগাযোগ করতে চাই।

উত্তর:


30

এটি দুর্দান্ত বৈশিষ্ট্য হবে তবে এএফআইএকি এটি ম্যাটপ্ল্লোলিবতে প্রয়োগ করা হয়নি এবং যেভাবে পরিসংখ্যান সংরক্ষণ করা হয়েছে তার কারণে নিজেকে বাস্তবায়ন করা বেশ কঠিন হবে।

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

এডিআইটি পোস্ট পতন ২০১২ : অন্যরা যেমন নীচের দিকে নির্দেশ করেছেন (যদিও এটি গ্রহণযোগ্য উত্তর হিসাবে এখানে উল্লেখ করা হয়েছে), ম্যাটপ্ল্লিটিব সংস্করণ ১.২ থেকে আপনি পরিসংখ্যানগুলি বেছে নিতে পারবেন allowed হিসাবে রিলিজ নোট রাষ্ট্র , এটি একটি পরীক্ষামূলক বৈশিষ্ট্য এবং এক matplotlib সংস্করণ এবং অন্য উদ্বোধনী মধ্যে একটি চিত্র সংরক্ষণ সমর্থন করে না। অবিশ্বস্ত উত্স থেকে আচার পুনরুদ্ধার করাও সাধারণত অনিরাপদ।

প্লটগুলি ভাগ করে নেওয়ার / পরে সম্পাদনের জন্য (যার জন্য প্রথমে উল্লেখযোগ্য ডেটা প্রসেসিংয়ের প্রয়োজন হয় এবং বৈজ্ঞানিক প্রকাশনার জন্য পিয়ার পর্যালোচনা চলাকালীন কয়েক মাস পরে তা টুইট করার প্রয়োজন হতে পারে), আমি এখনও প্রস্তাব দিই (1) এর ডেটা প্রসেসিং স্ক্রিপ্ট রয়েছে যা প্লট তৈরির আগে প্রক্রিয়াজাত ডেটা (যা আপনার প্লটের মধ্যে যায়) একটি ফাইলে সংরক্ষণ করে এবং (২) প্লটটি পুনরায় তৈরি করতে পৃথক প্লট জেনারেশন স্ক্রিপ্ট (যা আপনি প্রয়োজনীয় হিসাবে সামঞ্জস্য করেন) আছে। প্রতিটি প্লটের জন্য আপনি দ্রুত স্ক্রিপ্টটি চালাতে এবং এটি পুনরায় তৈরি করতে পারবেন (এবং দ্রুত নতুন ডেটা দিয়ে আপনার প্লট সেটিংসে অনুলিপি করতে পারেন)। এটি বলেছে, স্বল্প মেয়াদী / ইন্টারেক্টিভ / অনুসন্ধানের ডেটা বিশ্লেষণের জন্য একটি চিত্র বেছে নেওয়া সুবিধাজনক হতে পারে।


2
কিছুটা অবাক হয়েছে এটি কার্যকর করা হয়নি .. তবে ঠিক আছে, আমি একটি মধ্যবর্তী ফাইলে প্রক্রিয়াজাত ডেটা সংরক্ষণ করব এবং সহকর্মীদের কাছে ষড়যন্ত্র করার জন্য এটি এবং একটি স্ক্রিপ্ট প্রেরণ করব। ধন্যবাদ।
ম্যাট

2
আমি সন্দেহ করি বাস্তবায়ন কঠিন, তাই এটি এতই খারাপভাবে কাজ করে যে একটি ম্যাটল্যাব। ফিরে যখন আমি এটি ব্যবহার করেছি, পরিসংখ্যানগুলি ম্যাটল্যাব ক্র্যাশ করার জন্য ব্যবহৃত হয়েছিল এবং কিছুটা আলাদা সংস্করণ একে অপরকে .ফিগ ফাইলগুলি পড়তে সক্ষম হয় নি।
অ্যাড্রিয়ান রত্নপালা

6
pickleএখন এমপিএল পরিসংখ্যানগুলিতে কাজ করে, সুতরাং এটি করা যেতে পারে এবং যুক্তিসঙ্গতভাবে ভালভাবে কাজ করতে দেখা যায় - প্রায় কোনও মতলব ".fig" চিত্র ফাইলের মতো। এটি কীভাবে করবেন তার উদাহরণের জন্য নীচে আমার উত্তর দেখুন (এখনকার জন্য?)
ডেমিস

@ ডেমিস: টমোটো যেমন নীচে তার উত্তরে উল্লেখ করেছেন, এটি ইতিমধ্যে তখন থেকেই ছিল।
strpeter

@স্ট্রপিটার - মতলব পরিসংখ্যানগুলি এই মন্তব্যে উল্লিখিত হিসাবে ২০১০ সালে বাছাইযোগ্য ছিল না । পরীক্ষামূলক বৈশিষ্ট্যটি পতিত ২০১২-এ প্রকাশিত ম্যাটপ্ল্লোলিব ১.২ সহ যুক্ত করা হয়েছিল । সেখানে উল্লিখিত হিসাবে, আপনার এটি ম্যাটপ্ল্লোলিব সংস্করণগুলির মধ্যে কাজ করার আশা করা উচিত নয় এবং আপনার কোনও অবিশ্বস্ত উত্স থেকে আচারগুলি খোলা উচিত নয়।
ডাঃ জিম্বব

63

আমি কীভাবে এটি করতে পারি তা খুঁজে পেয়েছি। @ পেলসন দ্বারা উল্লিখিত "পরীক্ষামূলক আচার সমর্থন" বেশ ভাল কাজ করে।

এটা চেষ্টা কর:

# Plot something
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.plot([1,2,3],[10,-10,30])

আপনার ইন্টারেক্টিভ টুইটের পরে চিত্র চিত্রটি বাইনারি ফাইল হিসাবে সংরক্ষণ করুন:

import pickle
pickle.dump(fig, open('FigureObject.fig.pickle', 'wb')) # This is for Python 3 - py2 may need `file` instead of `open`

পরে, চিত্রটি খুলুন এবং টুইটগুলি সংরক্ষণ করা উচিত এবং জিইউআই ইন্টারেক্টিভিটি উপস্থিত থাকতে হবে:

import pickle
figx = pickle.load(open('FigureObject.fig.pickle', 'rb'))

figx.show() # Show the figure, edit it, etc.!

আপনি প্লটগুলি থেকে ডেটাও বের করতে পারেন:

data = figx.axes[0].lines[0].get_data()

(এটি লাইন, প্লেওরার এবং চিত্র প্রদর্শনের জন্য কাজ করে - প্লে সমতল তথ্য পুনর্গঠনের জন্য কিছু কৌশল নিয়ে কাজ করে ))

আমি পিকল ব্যবহার করে ম্যাটপ্ল্লোব ফিগারগুলি সেভিং থেকে দুর্দান্ত টিপ পেয়েছি ।


আমি বিশ্বাস করি এটি সংস্করণ পরিবর্তন ইত্যাদির পক্ষে শক্তিশালী নয়, এবং py2.x এবং py3.x এর মধ্যে ক্রস-সামঞ্জস্যপূর্ণ নয় I এছাড়াও আমি ভেবেছিলাম pickleডকুমেন্টেশনে বলা হয়েছে যে আমাদের যেমন পরিবেশটি import matplotlib.pyplot as pltপিক করা (সংরক্ষণ করা) হয়েছিল ঠিক তেমনই পরিবেশ সেটআপ করা দরকার, তবে আমি খুঁজে পেয়েছি যে আনপিকলিং (লোডিং) করার সময় আপনার প্রয়োজন হবে না - এটি পিকযুক্ত ফাইলটিতে আমদানির বিবৃতিগুলি সংরক্ষণ করে ।
ডেমিস

5
আপনার খোলার ফাইলগুলি বন্ধ করা বিবেচনা করা উচিত: উদাহরণস্বরূপwith open('FigureObject.fig.pickle', 'rb') as file: figx = pickle.load(file)

1
আমি কেবল পেয়েছি: 'অ্যাট্রিবিউটআরার:' চিত্র 'অবজেক্টটির কোনও বৈশিষ্ট্য নেই' _চাঁদরেন্ডার ''
ব্যবহারকারী 2673238

আপনি যদি স্ক্রিপ্টটি চালিয়ে না যেতে চান এবং সম্ভবত অবিলম্বে অবসান ঘটে figx.show(), আপনি plt.show()পরিবর্তে কল করা উচিত যা ব্লক করছে ocking
মেকলার

38

ম্যাটপ্লটলিব ১.২ অনুসারে, এখন আমাদের পরীক্ষামূলক আচার সমর্থন রয়েছে। একবার যান এবং দেখুন এটি আপনার ক্ষেত্রে ভাল কাজ করে কিনা। আপনার যদি কোনও সমস্যা থাকে তবে দয়া করে আমাদের ম্যাটপ্লটলিব মেলিং তালিকায় বা github.com/matplotlib/matplotlib এ কোনও সমস্যা খোলার মাধ্যমে জানান


2
কোনও কারণেই এই দরকারী বৈশিষ্ট্যটি চিত্রের "হিসাবে সংরক্ষণ করুন" এ যুক্ত হতে পারে। সম্ভবত .pkl যোগ করছেন?
ড্যাশসি

ভাল ধারণা @ ড্যাশসি। আমি সমর্থন করি যদি আপনি এটি প্রয়োগ করতে চান?
পেলসন

1
এটি কি কেবলমাত্র ব্যাকেন্ডের উপসেটে কাজ করে? আমি যখন ওএসএক্সে কোনও সাধারণ চিত্র নিয়ে যাওয়ার চেষ্টা করি, তখন আমি পাই PicklingError: Can't pickle <type '_macosx.GraphicsContext'>: it's not found as _macosx.GraphicsContext
ফেরেনোরথ

PicklingErrorউপরেরটি কেবল তখনই হয় যখন আপনি plt.show()আচারটি করার আগে কল করেন। সুতরাং ঠিক plt.show()পরে রাখুন pickle.dump()
সালমোনভ

MacOS 10.11 এ আমার পাই 3.3 এ ক্রমের বিষয়টি বিবেচনা fig.show()করে না - সম্ভবত এই বাগটি ঠিক করা হয়েছিল। আমি show()ইস্যু ছাড়াই / পরে আচার করতে পারি ।
ডেমিস

7

শুধু পাইথন স্ক্রিপ্ট কেন পাঠাবেন না? ম্যাটল্যাবের .ফিগ ফাইলগুলির প্রাপককে তাদের প্রদর্শন করার জন্য ম্যাটল্যাব থাকা দরকার, সুতরাং এটি পাইথন স্ক্রিপ্ট প্রেরণের সমতুল্য যার ম্যাটপ্ল্লিটিব প্রদর্শন করতে হবে।

বিকল্পভাবে (অস্বীকৃতি: আমি এখনও এটি চেষ্টা করি নি), আপনি চিত্রটি বাছাইয়ের চেষ্টা করতে পারেন:

import pickle
output = open('interactive figure.pickle', 'wb')
pickle.dump(gcf(), output)
output.close()

3
দুর্ভাগ্যক্রমে, ম্যাটপ্ল্লিটিব পরিসংখ্যানগুলি বেছে নেওয়া যায় না, সুতরাং সেই পদ্ধতির কাজ হবে না। পর্দার আড়ালে, অনেকগুলি সি এক্সটেনশান রয়েছে যা পিকিং সমর্থন করে না। যদিও আমি ঠিক স্ক্রিপ্ট + ডেটা প্রেরণে সম্পূর্ণরূপে একমত, যদিও ... আমার ধারণা আমি মাতলাবের সংরক্ষণ করা .fig এর বিন্দুটি সত্যই দেখিনি, তাই আমি সেগুলি কখনও ব্যবহার করি নি। কাউকে একা একা কোড এবং ডেটা প্রেরণ করা আমার অভিজ্ঞতাতে যাইহোক, দীর্ঘ সময়ের মধ্যে সবচেয়ে সহজ। তবুও, ম্যাটপ্ল্লিটিবের চিত্রগুলি যেখানে বাছাইযোগ্য তা ভাল লাগবে।
জো কিংটন

1
এমনকি আমাদের প্রিপ্রোসেসড ডেটা কিছুটা বড় এবং প্লট করার পদ্ধতিটি জটিল। যদিও একমাত্র আশ্রয়। ধন্যবাদ।
ম্যাট

1
পরিসংখ্যান আপাতদৃষ্টিতে চয়নযোগ্য - এটি বেশ ভাল কাজ করে! নীচে উদাহরণ।
ডেমিস

আচারের সুবিধা হ'ল আপনাকে প্রোগ্রামিকভাবে সমস্ত চিত্র / সাবপ্লট স্পেসিং / পজিশন সামঞ্জস্য করতে হবে না। চিত্রটি দেখতে সুন্দর ইত্যাদি তৈরি করতে আপনি এমপিএল প্লটের জিইউআই ব্যবহার করতে পারেন, তারপরে MyPlot.fig.pickleফাইলটি সংরক্ষণ করুন - প্লটের উপস্থাপনাটি প্রয়োজনীয়তার সাথে সামঞ্জস্য করার পরবর্তী ক্ষমতা ধরে রাখা। মতলবের .figফাইলগুলি সম্পর্কে এটি দুর্দান্ত । বিশেষত কার্যকর যখন আপনার কোনও ডুমুরের আকার / দিক অনুপাতটি পরিবর্তন করতে হবে (উপস্থাপনা / কাগজপত্রগুলিতে forোকানোর জন্য)।
ডেমিস

1

ভাল প্রশ্ন. এখানে থেকে ডক পাঠ্য pylab.save:

পাইল্যাব আর কোনও সংরক্ষণের ফাংশন সরবরাহ করে না, যদিও পুরাতন পাইব্ল্যাব ফাংশনটি এখনও ম্যাটপ্লোটিলিব.ম্লাব.সেসেভ হিসাবে উপলব্ধ (আপনি এখনও এটি পাইব্লাকে "ম্লেব.স্যাভ" হিসাবে উল্লেখ করতে পারেন)। তবে, সরল পাঠ্য ফাইলগুলির জন্য, আমরা numpy.savetxt সুপারিশ করি। নপি অ্যারেগুলি সংরক্ষণের জন্য, আমরা numpy.save এবং এর এনালগ numpy.load সুপারিশ করি যা পাইপগুলিতে এনপি.সেসেভ এবং এনপি.লোড হিসাবে পাওয়া যায়।


এটি পাইলাব অবজেক্ট থেকে ডেটা সংরক্ষণ করে, তবে আপনাকে চিত্রটি পুনরায় তৈরি করতে দেয় না।
ডাঃ জিম্বব

সঠিক। আমার স্পষ্ট করে বলা উচিত যে উত্তরটি ব্যবহারের জন্য কোনও প্রস্তাব ছিল না pylab.save। আসলে, ডক পাঠ্য থেকে, এটি ব্যবহার করা উচিত নয় বলে মনে হয় ।
স্টিভ তেজোয়া

থ্রিডি ফিগার পাঠানোর জন্য কি কোনও বাহ্যিক পদ্ধতি রয়েছে?
উদাহরণস্বরূপ,

0

আমার ম্যাটপ্ল্লিটিব পরিসংখ্যানগুলি সংরক্ষণ করার জন্য আমি তুলনামূলকভাবে সহজ উপায় (এখনও কিছুটা অপ্রচলিত) খুঁজে পেয়েছি। এটি এর মতো কাজ করে:

import libscript

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)

#<plot>
plt.plot(t, s)
plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.title('About as simple as it gets, folks')
plt.grid(True)
plt.show()
#</plot>

save_plot(fileName='plot_01.py',obj=sys.argv[0],sel='plot',ctx=libscript.get_ctx(ctx_global=globals(),ctx_local=locals()))

save_plotএই মত সংজ্ঞায়িত ফাংশন সহ (যুক্তি বোঝার সহজ সংস্করণ):

def save_plot(fileName='',obj=None,sel='',ctx={}):
    """
    Save of matplolib plot to a stand alone python script containing all the data and configuration instructions to regenerate the interactive matplotlib figure.

    Parameters
    ----------
    fileName : [string] Path of the python script file to be created.
    obj : [object] Function or python object containing the lines of code to create and configure the plot to be saved.
    sel : [string] Name of the tag enclosing the lines of code to create and configure the plot to be saved.
    ctx : [dict] Dictionary containing the execution context. Values for variables not defined in the lines of code for the plot will be fetched from the context.

    Returns
    -------
    Return ``'done'`` once the plot has been saved to a python script file. This file contains all the input data and configuration to re-create the original interactive matplotlib figure.
    """
    import os
    import libscript

    N_indent=4

    src=libscript.get_src(obj=obj,sel=sel)
    src=libscript.prepend_ctx(src=src,ctx=ctx,debug=False)
    src='\n'.join([' '*N_indent+line for line in src.split('\n')])

    if(os.path.isfile(fileName)): os.remove(fileName)
    with open(fileName,'w') as f:
        f.write('import sys\n')
        f.write('sys.dont_write_bytecode=True\n')
        f.write('def main():\n')
        f.write(src+'\n')

        f.write('if(__name__=="__main__"):\n')
        f.write(' '*N_indent+'main()\n')

return 'done'

বা এর save_plotমতো ফাংশনটি সংজ্ঞায়িত করা (লাইটার ফিগার ফাইলগুলি উত্পাদনের জন্য জিপ কম্প্রেশন ব্যবহার করে আরও ভাল সংস্করণ):

def save_plot(fileName='',obj=None,sel='',ctx={}):

    import os
    import json
    import zlib
    import base64
    import libscript

    N_indent=4
    level=9#0 to 9, default: 6
    src=libscript.get_src(obj=obj,sel=sel)
    obj=libscript.load_obj(src=src,ctx=ctx,debug=False)
    bin=base64.b64encode(zlib.compress(json.dumps(obj),level))

    if(os.path.isfile(fileName)): os.remove(fileName)
    with open(fileName,'w') as f:
        f.write('import sys\n')
        f.write('sys.dont_write_bytecode=True\n')
        f.write('def main():\n')
        f.write(' '*N_indent+'import base64\n')
        f.write(' '*N_indent+'import zlib\n')
        f.write(' '*N_indent+'import json\n')
        f.write(' '*N_indent+'import libscript\n')
        f.write(' '*N_indent+'bin="'+str(bin)+'"\n')
        f.write(' '*N_indent+'obj=json.loads(zlib.decompress(base64.b64decode(bin)))\n')
        f.write(' '*N_indent+'libscript.exec_obj(obj=obj,tempfile=False)\n')

        f.write('if(__name__=="__main__"):\n')
        f.write(' '*N_indent+'main()\n')

return 'done'

এটি libscriptআমার নিজের একটি মডিউল ব্যবহার করে , যা বেশিরভাগ মডিউল inspectএবং এর উপর নির্ভর করে ast। আগ্রহ প্রকাশ করা হলে আমি এটি গিথুবে ভাগ করে নেওয়ার চেষ্টা করতে পারি (এটির জন্য প্রথমে কিছুটা পরিষ্কার পরিচ্ছন্নতার প্রয়োজন হবে এবং আমাকে গিথুব দিয়ে শুরু করতে হবে)।

এই save_plotফাংশন এবং libscriptমডিউলটির পেছনের ধারণাটি হ'ল অজগর নির্দেশাবলী যা চিত্র তৈরি করে (মডিউল ব্যবহার করে inspect) তৈরি করে , বিশ্লেষণ করে (মডিউল ব্যবহার করে ast) সমস্ত ভেরিয়েবল, ফাংশন এবং মডিউলগুলি আমদানি করে যার উপর নির্ভর করে আমদানি নির্ভর করে, এক্সিকিউশন প্রসঙ্গটি থেকে এগুলি বের করে এবং সিরিয়ালিয়াল করে তোলে অজগর নির্দেশ হিসাবে (ভেরিয়েবলের কোডটি এর মত হবে t=[0.0,2.0,0.01]... এবং মডিউলগুলির কোডের মতো হবে import matplotlib.pyplot as plt...) চিত্রের নির্দেশাবলীতে প্রিপেন্ড করা হয়েছে। ফলস্বরূপ পাইথন নির্দেশাবলী পাইথন স্ক্রিপ্ট হিসাবে সংরক্ষণ করা হয় যার কার্যকরকরণটি ম্যাটপ্ল্লোটিব চিত্রটি পুনরায় তৈরি করবে।

আপনি কল্পনা করতে পারেন, এটি বেশিরভাগ (সমস্ত না থাকলে) ম্যাটপ্ল্লিটিব পরিসংখ্যানগুলির জন্য ভাল কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.