ম্যাটপ্ল্লিটিবের সাথে অ-অবরুদ্ধ উপায়ে প্লট করা


138

আমি গত কয়েকদিন ধরে নম্পি এবং ম্যাটপ্ল্লিটিবের সাথে খেলছি। এক্সপ্লোরেশন অবরুদ্ধ না করে ম্যাটপ্ল্লোলিব প্লটটিকে একটি ক্রিয়াকলাপ করার চেষ্টা করতে আমার সমস্যা হচ্ছে। আমি জানি যে ইতিমধ্যে একই ধরণের প্রশ্ন জিজ্ঞাসা করে এখানে অনেকগুলি থ্রেড রয়েছে এবং আমি বেশ কিছুটা গুগল করেছি তবে এই কাজটি পরিচালনা করতে সক্ষম হইনি।

কিছু লোকের পরামর্শ মতো আমি শো (ব্লক = মিথ্যা) ব্যবহার করার চেষ্টা করেছি, তবে আমি যা পাই তা হিমায়িত উইন্ডো। আমি যদি সহজভাবে শো () কল করি তবে ফলাফলটি যথাযথভাবে প্লট করা হয়েছে তবে উইন্ডোটি বন্ধ না হওয়া পর্যন্ত মৃত্যুদন্ড কার্যকর করা হবে। অন্যান্য থ্রেড থেকে আমি পড়েছি, আমি সন্দেহ করি যে শো (ব্লক = মিথ্যা) কাজ করে কিনা বা ব্যাকএন্ডের উপর নির্ভর করে। এটা কি সঠিক? আমার পিছনের প্রান্তটি Qt4Agg। আপনি কি আমার কোডটি একবার দেখতে পারেন এবং কিছু ভুল দেখলে আমাকে বলতে পারেন? এখানে আমার কোড। কোন সাহায্যের জন্য ধন্যবাদ।

from math import *
from matplotlib import pyplot as plt
print plt.get_backend()



def main():
    x = range(-50, 51, 1)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4

        y = [Xi**pow for Xi in x]
        print y

        plt.plot(x, y)
        plt.draw()
        #plt.show()             #this plots correctly, but blocks execution.
        plt.show(block=False)   #this creates an empty frozen window.
        _ = raw_input("Press [enter] to continue.")


if __name__ == '__main__':
    main()

পুনশ্চ. আমি এটি বলতে ভুলে গেছি যে আমি যখন নতুন কোনও তৈরি করার পরিবর্তে প্রতিবার নতুন কিছু তৈরি করার সময় বিদ্যমান উইন্ডোটি আপডেট করতে চাই।


1
আপনি কি এর plt.ion()আগে ম্যাটপ্ললটিব ইন্টারেক্টিভ মোড চেষ্টা করেছেন plt.show()? এটি তখন অবরুদ্ধ হওয়া উচিত কারণ প্রতিটি প্লট একটি শিশু থ্রেডে তৈরি হয়।
আনজেল

@ অঞ্জেল আমি কেবল এটি চেষ্টা করেছি, তবে মনে হয় এটি কোনও পার্থক্য করে না।
opetroch

3
আপনি কিভাবে আপনার স্ক্রিপ্ট চালাচ্ছেন? যদি আমি টার্মিনাল / কমান্ড প্রম্পট থেকে আপনার উদাহরণ কোডটি চালিত করি তবে মনে হয় এটি ভাল কাজ করে, তবে আমি মনে করি আইপিথন কিউটিসনসোল বা আইডিই থেকে এই জাতীয় জিনিসগুলি করার চেষ্টা করার আগে অতীতে আমার সমস্যা হয়েছিল।
মারিউস

1
@ মারিয়াস আহা !! তুমি ঠিক. সত্যই আমি এটি আমার আইডিই (পাইচার্ম) এর কনসোল থেকে চালাচ্ছি running এটি সিএমডি প্রম্পট থেকে চালানোর সময়, plt.show (ব্লক = মিথ্যা), দুর্দান্ত কাজ করে! আমি যদি আপনাকে জিজ্ঞাসা করি যে আপনি এর কোনও ধারণা / সমাধান পেয়েছেন তবে আমি কি খুব বেশি জিজ্ঞাসা করব? অনেক ধন্যবাদ!
opetroch

আমি দুঃখিত জানি না। আমি ম্যাটপ্ল্লিটিব কীভাবে কনসোলের সাথে মিথস্ক্রিয়া করে তার বিশদটি আমি সত্যিই বুঝতে পারি না, তাই আমি যদি সাধারণত এই জিনিসটি করার দরকার হয় তবে আমি সাধারণত কমান্ড প্রম্পট থেকে চলতে চলে যাই matplotlib
মারিউস

উত্তর:


167

আমি সমাধানগুলি অনুসন্ধান করতে দীর্ঘ সময় ব্যয় করেছি এবং এই উত্তরটি পেয়েছি ।

দেখে মনে হচ্ছে, মত অর্ডার আপনি (এবং আমি) কি আপনি চান পেতে, আপনি সমন্বয় প্রয়োজন plt.ion(), plt.show()(না দিয়ে block=False) এবং, সবচেয়ে গুরুত্বপূর্ণভাবে, plt.pause(.001)(অথবা যাই হোক না কেন সময় যদি আপনি চান)। বিরতি প্রয়োজন হয় কারণ গুই ঘটনা ঘটে প্রধান কোড অঙ্কন সহ, ঘুমাচ্ছে। এটা সম্ভব যে ঘুমের থ্রেড থেকে সময় বাছাই করে এটি প্রয়োগ করা হয়েছে, তাই সম্ভবত IDEs এর সাথে জগাখিচুড়ি — জানি না।

অজগর 3.5 এ আমার জন্য কাজ করে এমন একটি বাস্তবায়ন এখানে রয়েছে:

import numpy as np
from matplotlib import pyplot as plt

def main():
    plt.axis([-50,50,0,10000])
    plt.ion()
    plt.show()

    x = np.arange(-50, 51)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4
        y = [Xi**pow for Xi in x]
        plt.plot(x, y)
        plt.draw()
        plt.pause(0.001)
        input("Press [enter] to continue.")

if __name__ == '__main__':
    main()

3
আপনার উত্তরটি আমার একই ধরণের সমস্যাটি সমাধান করতে অনেক সহায়তা করেছিল। পূর্বে, আমি plt.drawঅনুসরণ করেছিলাম plt.show(block = False)তবে এটি কাজ করা বন্ধ করে: চিত্রটি কোনও প্রতিক্রিয়া দেখায় না, এটি বন্ধ করে আইপিথন ক্র্যাশ করে। আমার সমাধানটি প্রতিটি উদাহরণ সরিয়ে plt.draw()দিয়ে প্রতিস্থাপন করছে plt.pause(0.001)। এটি আগের plt.show(block = False)মতো অনুসরণ করার পরিবর্তে এটি plt.drawআগে plt.ion()এবং আগে ছিল plt.show()। আমার কাছে এখন একটি MatplotlibDeprecationWarningতবে এটি আমার পরিসংখ্যানগুলি প্লট করতে দেয়, তাই আমি এই সমাধানটি নিয়ে খুশি।
নীল_চিপ

3
দ্রষ্টব্য যে পাইথন ২.7 এ আপনার ব্যবহার করা উচিত raw_inputনয় inputএখানে
ক্রিস

প্রতিক্রিয়াশীল "অ্যানিমেট" পদ্ধতির পক্ষে সম্ভব না হলে সত্যই কার্যকর কাজ! অবজ্ঞার সতর্কতা থেকে কীভাবে মুক্তি পাবেন কেউ জানেন?
ফ্রেডেরিক ফরটিয়ার

প্লিট.শো এর আগে প্লট.ইন যুক্ত করার চেষ্টা করার সময় কেন আমি কোনও ফ্রিজেন কমান্ড প্রম্পট পাই তা দয়া করে আমাকে বলতে পারেন?
গ্যাব্রিয়েল আগস্টো

@ গ্যাব্রিয়েল অগাস্টো এর কারণ কী হতে পারে তা আমি নিশ্চিত নই এবং আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই। আমি পাইথন ৩.6-তে এই উদাহরণটি পরীক্ষা করেছি এবং এটি এখনও কার্যকর হয়। আপনি যদি একই প্যাটার্নটি ব্যবহার করেন এবং এটি হিমশীতল হয় তবে আপনার ইনস্টলেশনটিতে কিছু সমস্যা হতে পারে। সাধারণ চক্রান্ত প্রথম কাজ করে কিনা তা আপনার পরীক্ষা করা উচিত। আপনি যদি অন্যরকম কিছু চেষ্টা করে থাকেন তবে মন্তব্যে এটি করার মতো খুব বেশি কিছু নেই। উভয় ক্ষেত্রেই, আপনি পৃথক প্রশ্ন জিজ্ঞাসা করতে পারেন।
krs013

23

একটি সহজ কৌশল যা আমার পক্ষে কাজ করে তা হল:

  1. শোয়ের অভ্যন্তরে ব্লক = মিথ্যা যুক্তি ব্যবহার করুন : plt.show (ব্লক = মিথ্যা)
  2. .Py স্ক্রিপ্টের শেষে অন্য একটি plt.show () ব্যবহার করুন ।

উদাহরণ :

import matplotlib.pyplot as plt

plt.imshow(add_something)
plt.xlabel("x")
plt.ylabel("y")

plt.show(block=False)

#more code here (e.g. do calculations and use print to see them on the screen

plt.show()

দ্রষ্টব্য : plt.show()আমার স্ক্রিপ্টের শেষ লাইন।


7
এটি (লিনাক্স, অ্যানাকোন্ডা, পাইথন ২.7, ডিফল্ট ব্যাকএন্ডে) আমার জন্য একটি ফাঁকা উইন্ডো তৈরি করে যা ফাঁস হয়ে যায় মৃত্যুদণ্ডের একেবারে শেষ অবধি, শেষ অবধি এটি পূরণ হয় না execution মৃত্যুদন্ড কার্যকর করার সময় কোনও প্লট আপডেট করার জন্য কার্যকর নয়। :-(
sh37211

@ sh37211 আপনার লক্ষ্য কি তা নিশ্চিত নয়। কিছু ক্ষেত্রে আপনি কিছু প্লট করার চেষ্টা করেন তবে প্লট কমান্ডের পরে আপনার কাছে অন্যান্য কমান্ড থাকে, তবে এটি কার্যকর কারণ এটি আপনাকে প্লট করার অনুমতি দেয় এবং অন্যান্য কমান্ডগুলি কার্যকর করতে পারে। এই সম্পর্কে আরও জানার জন্য এই পোস্টটি দেখুন: stackoverflow.com/questions/458209/… । আপনি যদি কোনও প্লট আপডেট করতে চান তবে এটি অন্যভাবে হওয়া উচিত।
seralouk

17

আপনি অ্যারেতে প্লট লিখে, এবং তারপরে ভিন্ন থ্রেডে প্রদর্শন করে মৃত্যুদণ্ড কার্যকর করতে বাধা দিতে পারেন। পাইফর্মুলাস ০.২.৮ থেকে পিএফ.স্ক্রিন ব্যবহার করে একসাথে প্লট উত্পন্ন এবং প্রদর্শন করার উদাহরণ এখানে রয়েছে :

import pyformulas as pf
import matplotlib.pyplot as plt
import numpy as np
import time

fig = plt.figure()

canvas = np.zeros((480,640))
screen = pf.screen(canvas, 'Sinusoid')

start = time.time()
while True:
    now = time.time() - start

    x = np.linspace(now-2, now, 100)
    y = np.sin(2*np.pi*x) + np.sin(3*np.pi*x)
    plt.xlim(now-2,now+1)
    plt.ylim(-3,3)
    plt.plot(x, y, c='black')

    # If we haven't already shown or saved the plot, then we need to draw the figure first...
    fig.canvas.draw()

    image = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
    image = image.reshape(fig.canvas.get_width_height()[::-1] + (3,))

    screen.update(image)

#screen.close()

ফলাফল:

সাইন অ্যানিমেশন

দাবি অস্বীকার: আমি পাইফর্মুলার রক্ষণাবেক্ষণকারী।

রেফারেন্স: ম্যাটপ্ল্লোলিব: প্লটটি নিমপ অ্যারেতে সংরক্ষণ করুন


9

এই উত্তরগুলির অনেকগুলি দুর্দান্ত স্ফীত এবং আমি যা দেখতে পাই তার থেকে উত্তরটি বুঝতে এতটা কঠিন নয়।

আপনি চাইলে আপনি ব্যবহার করতে পারেন plt.ion()তবে আমি দেখতে পেলাম plt.draw()ঠিক তেমন কার্যকর

আমার নির্দিষ্ট প্রকল্পের জন্য আমি চিত্রগুলি ষড়যন্ত্র করছি তবে আপনি ব্যবহার করতে পারেন plot()বা scatter()তার পরিবর্তে যাই হোক figimage()না কেন, তাতে কিছু আসে যায় না।

plt.figimage(image_to_show)
plt.draw()
plt.pause(0.001)

অথবা

fig = plt.figure()
...
fig.figimage(image_to_show)
fig.canvas.draw()
plt.pause(0.001)

যদি আপনি একটি আসল চিত্র ব্যবহার করেন।
আমি @ krs013 এবং @ ডিফল্ট পিকচারের উত্তরগুলি ব্যবহার করে এটি প্রত্যাশা
করি আশা করি এটি প্রত্যেককে আলাদা আলাদা থ্রেডে আনতে বা এই উপন্যাসগুলি পড়ার থেকে বাঁচায় কেবল এটি বের করার জন্য


3

লাইভ প্লটিং

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
# plt.axis([x[0], x[-1], -1, 1])      # disable autoscaling
for point in x:
    plt.plot(point, np.sin(2 * point), '.', color='b')
    plt.draw()
    plt.pause(0.01)
# plt.clf()                           # clear the current figure

যদি ডেটার পরিমাণ খুব বেশি হয় তবে আপনি একটি সাধারণ কাউন্টার দিয়ে আপডেটের হার কমিয়ে আনতে পারেন

cnt += 1
if (cnt == 10):       # update plot each 10 points
    plt.draw()
    plt.pause(0.01)
    cnt = 0

প্রোগ্রাম প্রস্থান শেষে হোল্ডিং প্লট

এটি আমার আসল সমস্যা ছিল যার সন্তোষজনক উত্তর খুঁজে পাওয়া যায়নি, আমি এমন প্লট করতে চেয়েছিলাম যা স্ক্রিপ্ট শেষ হওয়ার পরে বন্ধ হয় নি (যেমন ম্যাটল্যাব),

যদি আপনি এটির বিষয়ে চিন্তা করেন, স্ক্রিপ্টটি শেষ হওয়ার পরে, প্রোগ্রামটি সমাপ্ত হবে এবং প্লটটি এইভাবে ধরে রাখার কোনও যৌক্তিক উপায় নেই, সুতরাং দুটি বিকল্প রয়েছে

  1. স্ক্রিপ্টটি প্রস্থান করা থেকে অবরুদ্ধ করুন (এটি plt.show () এবং যা আমি চাই তা নয়)
  2. পৃথক থ্রেডে প্লটটি চালান (খুব জটিল)

এটি আমার পক্ষে সন্তোষজনক ছিল না তাই বাক্সের বাইরে আমি আরও একটি সমাধান পেয়েছি

বাহ্যিক দর্শনে SaveToFile এবং দেখুন

এর জন্য সঞ্চয় এবং দেখা উভয়ই দ্রুত হওয়া উচিত এবং দর্শকের ফাইলটি লক করা উচিত নয় এবং স্বয়ংক্রিয়ভাবে সামগ্রী আপডেট করা উচিত

সংরক্ষণের জন্য ফর্ম্যাট নির্বাচন করা

ভেক্টর ভিত্তিক ফর্ম্যাটগুলি ছোট এবং দ্রুত উভয়ই

  • এসভিজি ভাল তবে ওয়েব ব্রাউজার ছাড়া এটির জন্য ভাল দর্শকের সন্ধান পাওয়া যায় না যার জন্য ডিফল্টরূপে ম্যানুয়াল রিফ্রেশ দরকার
  • পিডিএফ ভেক্টর ফর্ম্যাটগুলিকে সমর্থন করতে পারে এবং লাইটওয়েট ভিউয়ার রয়েছে যা লাইভ আপডেটিং সমর্থন করে

লাইভ আপডেট সহ দ্রুত লাইটওয়েট ভিউয়ার

জন্য পিডিএফ বেশ কিছু ভাল অপশন আছে

  • উইন্ডোজ আমি সুমাত্রাপিডিএফ ব্যবহার করি যা নিখরচায়, দ্রুত এবং হালকা (কেবলমাত্র আমার ক্ষেত্রে 1.8 এমবি র‌্যাম ব্যবহার করে)

  • লিনাক্সে বিভিন্ন বিকল্প রয়েছে যেমন এভিংস (জিনোম) এবং ওকুলার ( কেডিএ )

নমুনা কোড এবং ফলাফল

কোনও ফাইলের প্লট আউটপুট দেওয়ার জন্য নমুনা কোড

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(2 * x)
plt.plot(x, y)
plt.savefig("fig.pdf")

প্রথম রান করার পরে, উপরে উল্লিখিত দর্শকদের মধ্যে একটিতে আউটপুট ফাইলটি খুলুন এবং উপভোগ করুন।

এখানে সুমাত্রাপিডিএফের পাশাপাশি ভিএসকোডের একটি স্ক্রিনশট রয়েছে, আধা-লাইভ আপডেটের হার পাওয়ার জন্য প্রক্রিয়াটি যথেষ্ট দ্রুত (আমার সেটআপে আমি 10 হার্টজ কাছাকাছি যেতে পারি কেবল time.sleep()বিরতিগুলির মধ্যে ব্যবহার করতে পারি ) pyPlot, অ-অবরোধ


2

আইগির উত্তরটি অনুসরণ করা আমার পক্ষে সবচেয়ে সহজ ছিল, তবে পরবর্তী subplotকমান্ডটি করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি যা যখন আমি কেবল করছিলাম তখনই ছিল না show:

ম্যাটপ্লটলিবডিপ্রেসেশনস সতর্কতা: পূর্ববর্তী অক্ষ হিসাবে একই যুক্তি ব্যবহার করে একটি অক্ষ যুক্ত করা বর্তমানে পূর্ববর্তী উদাহরণটিকে পুনরায় ব্যবহার করে। ভবিষ্যতের সংস্করণে, একটি নতুন উদাহরণ সর্বদা তৈরি এবং ফিরে আসবে। এদিকে, এই সতর্কতাটি দমন করা যায় এবং প্রতিটি অক্ষের উদাহরণে একটি অনন্য লেবেল পাঠিয়ে ভবিষ্যতের আচরণ নিশ্চিত করা যায়।

এই ত্রুটিটি এড়াতে, এটি ব্যবহারকারী প্রবেশের পরে প্লটটি বন্ধ (বা সাফ ) করতে সহায়তা করে।

আমার পক্ষে কাজ করা কোডটি এখানে:

def plt_show():
    '''Text-blocking version of plt.show()
    Use this instead of plt.show()'''
    plt.draw()
    plt.pause(0.001)
    input("Press enter to continue...")
    plt.close()

0

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

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