জুপিটার / আইপিথনে প্লটগুলি গতিশীলভাবে আপডেট করার জন্য বর্তমানে সঠিক উপায় কী?


93

উত্তর সালে কিভাবে পরিবর্তনশীল ipython নোটবুক একটি লুপ (এক কক্ষের মধ্যে) একটি চক্রান্ত আপডেট করার জন্য , একটি উদাহরণ কিভাবে পরিবর্তনশীল একটি পাইথন লুপ মধ্যে একটি Jupyter নোটবুক ভিতরে একটি চক্রান্ত আপডেট করার জন্য এর দেওয়া হয়। যাইহোক, এটি প্রতিটি পুনরাবৃত্তির উপর প্লটটি ধ্বংস এবং পুনরায় তৈরি করে কাজ করে এবং থ্রেডগুলির একটিতে মন্তব্য করে যে নতুন-ইশ %matplotlib nbaggযাদু ব্যবহার করে এই অবস্থার উন্নতি করা যেতে পারে , যা নোটবুকে এমবেড করা একটি ইন্টারেক্টিভ চিত্র সরবরাহ করে, বরং একটি স্থির চিত্র চেয়ে।

যাইহোক, এই দুর্দান্ত nbaggবৈশিষ্ট্যটি আমি যতদূর বলতে পারি সম্পূর্ণরূপে শুল্কহীন বলে মনে হচ্ছে এবং কীভাবে এটি কোনও প্লটকে গতিশীলভাবে আপডেট করার জন্য ব্যবহার করতে হবে তার উদাহরণ খুঁজে পাচ্ছি না। এইভাবে আমার প্রশ্নটি হ'ল এনবাগ ব্যাকএন্ডটি ব্যবহার করে একজন কীভাবে একটি বৃহত্তর / পাইথন নোটবুকটিতে বিদ্যমান প্লটটিকে দক্ষতার সাথে আপডেট করবেন? যেহেতু ম্যাটপ্ল্লোলিবে প্লটগুলি পরিবর্তনশীলভাবে আপডেট করা সাধারণভাবে একটি জটিল সমস্যা, তাই একটি সাধারণ কাজের উদাহরণ একটি বিশাল সহায়ক হবে। বিষয়টিতে যে কোনও ডকুমেন্টেশনের পয়েন্টারও অত্যন্ত সহায়ক হবে be

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

উপরে লিঙ্কিত প্রশ্নের উত্তর থেকে কিছুটা সংশোধিত কোড এখানে দেওয়া হয়েছে, যা প্রতিবার পুরো চিত্রটি আবার অঙ্কন করে এটি অর্জন করে। আমি একই ফলটি অর্জন করতে চাই তবে আরও দক্ষতার সাথে ব্যবহার করছি nbagg

%matplotlib inline
import time
import pylab as pl
from IPython import display
for i in range(10):
    pl.clf()
    pl.plot(pl.randn(100))
    display.display(pl.gcf())
    display.clear_output(wait=True)
    time.sleep(1.0)

উত্তর:


62

এখানে একটি উদাহরণ যা লুপে একটি প্লট আপডেট করে। এটি চিত্রটিতে ডেটা আপডেট করে এবং প্রতিবার পুরো চিত্রটি পুনরায় চিত্রায়িত করে না। এটি ব্লক এক্সিকিউশনটি কার্যকর করে, যদিও আপনি যদি সিমুলেশনগুলির সীমাবদ্ধ সেট চালাতে এবং কোথাও ফলাফলগুলি সংরক্ষণ করতে আগ্রহী হন তবে এটি আপনার পক্ষে সমস্যা নাও হতে পারে।

%matplotlib notebook

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

def pltsin(ax, colors=['b']):
    x = np.linspace(0,1,100)
    if ax.lines:
        for line in ax.lines:
            line.set_xdata(x)
            y = np.random.random(size=(100,1))
            line.set_ydata(y)
    else:
        for color in colors:
            y = np.random.random(size=(100,1))
            ax.plot(x, y, color)
    fig.canvas.draw()

fig,ax = plt.subplots(1,1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
for f in range(5):
    pltsin(ax, ['b', 'r'])
    time.sleep(1)

আমি এটি এখানে এনবিউউয়ারের উপরে রেখেছি।

এর আইপিথন উইজেট সংস্করণ রয়েছে nbaggবর্তমানে ম্যাটপ্ল্লোলিব সংগ্রহস্থলের কাজ চলছে । যখন এটি উপলব্ধ থাকে, সম্ভবত এটি ব্যবহারের সেরা উপায় nbagg

সম্পাদনা: একাধিক প্লট দেখানোর জন্য আপডেট হয়েছে


4
দুর্দান্ত, মনে হচ্ছে এটি দুর্দান্তভাবে কাজ করছে। চলমান অবস্থায় ইন্টারঅ্যাক্টিভিটির অভাব আমার পক্ষে বড় সমস্যা নয়। একটি সামান্য বিজোড় জিনিস: আমি যদি while True:লুপটিকে একটি লুপে পরিবর্তন করি , যখন লুপটি শেষ হয় আমি একটি ইন্টারেক্টিভ এনব্যাগের পরিবর্তে শেষ প্লটের দুটি স্থির চিত্র পাই get কোন ধারণা কেন?
নাথানিয়েল

আমি লুপের জন্য কিছুক্ষণ পরিবর্তন করে tmpnb.org এ চেষ্টা করে দেখলাম, কিন্তু আমি দ্বিতীয় চিত্র বা আন্তঃসংযোগের ক্ষতি দেখছি না। অন্ধকারে গুলি করা হয়েছে, তবে আপনি ফাংশনে লুপ না রেখে কলটির চারদিকে লুপটি সরিয়ে ফাংশনটিতে নিয়ে যেতে চেষ্টা করতে পারেন। এফের জন্য রেঞ্জ (10): প্লটসিন (কুড়াল) সময়.স্লিপ (1)
বায়ুসংক্রান্ত

4
@ নিউম্যাটিকস দুর্ভাগ্যক্রমে এটি রেটিনা ডিসপ্লেতে ম্যাটপ্লটলিব ২.০ নিয়ে কিছু সমস্যা রয়েছে: লুপে প্লটগুলি সাধারণত দ্বিগুণ ছোট হয়।
আলেকজান্ডার রডিন

4
দেখে মনে হচ্ছে চিত্রটি নিজেকে সঠিকভাবে আকার পরিবর্তন করতে সময় দেয়নি। একটি রাখার সময় plt.show()এবং পরবর্তী কক্ষে লুপটি সরানোর সময় আমার আরও অনেক ভাল অভিজ্ঞতা হয়েছিল ।
ImportanceOfBeingErnest

4
নিশ্চিত হয়ে নিন যে আপনার প্লট হিসাবে একই জুপিটার নোটবুক সেলটিতে% ম্যাটপ্ল্লোলিব নোটবুক রয়েছে - আমি আজ 2 ঘন্টা এর বেশি সময় ব্যয় করেছি কারণ আমি আমদানি করা
স্ট্যাটাস

15

আমি জুপিটার-ল্যাব ব্যবহার করছি এবং এটি আমার জন্য কাজ করে (এটি আপনার ক্ষেত্রে খাপ খায়):

from IPython.display import clear_output
from matplotlib import pyplot as plt
import collections
%matplotlib inline

def live_plot(data_dict, figsize=(7,5), title=''):
    clear_output(wait=True)
    plt.figure(figsize=figsize)
    for label,data in data_dict.items():
        plt.plot(data, label=label)
    plt.title(title)
    plt.grid(True)
    plt.xlabel('epoch')
    plt.legend(loc='center left') # the plot evolves to the right
    plt.show();

তারপরে একটি লুপে আপনি একটি অভিধান তৈরি করুন এবং আপনি এটিকে পাস করুন live_plot():

data = collections.defaultdict(list)
for i in range(100):
    data['foo'].append(np.random.random())
    data['bar'].append(np.random.random())
    data['baz'].append(np.random.random())
    live_plot(data)

আপনার প্লটের নীচে কয়েকটি কক্ষ রয়েছে তা নিশ্চিত করুন, নইলে প্রতিবার প্লটটি পুনর্নির্মাণের সময় দৃশ্যটি স্ন্যাপ করে।


4
এটি বিদ্যমান প্লটটি আপডেট করার পরিবর্তে প্রতিবার একটি নতুন প্লট তৈরি করে
নিউম্যাটিক্স

4
সঠিক। জুপিটার-ল্যাবটিতে ডায়নামিকাল প্লট থাকার আর ভাল উপায় আমি খুঁজে পাইনি।
জিয়োফিল

4
এটির পুনরুক্তির মধ্যে কতক্ষণ অপেক্ষা করতে হবে তার কোনও উপায় আছে? কেবল একটি 'অপেক্ষা = সত্য' না হওয়ার চেয়ে
আহমদ মুছা

4
প্রতিবার প্লটটি পুনরায় চিত্রিত করা হলে, গ্রাফের ফ্লিকারগুলি। এই সমস্যাটি সমাধান করার কোনও উপায় আছে কি? আমার প্লটের অধীনে কয়েকটি খালি ঘর আছে, তবে এটি সাহায্য করবে বলে মনে হয় না।
মাসায়ো মিউজিক

@MasayoMusic "ঝিকিমিকি এবং জাম্পিং আউটপুট" মধ্যে দেখতে buildmedia.readthedocs.org/media/pdf/ipywidgets/latest/...
লিও

0

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

from IPython.display import clear_output
from matplotlib import pyplot as plt
%matplotlib inline
    
def live_plot(x, y, figsize=(7,5), title=''):
    clear_output(wait=True)
    plt.figure(figsize=figsize)
    plt.xlim(0, training_steps)
    plt.ylim(0, 100)
    x= [float(i) for i in x]
    y= [float(i) for i in y]
    
    if len(x) > 1:
        plt.scatter(x,y, label='axis y', color='k') 
        m, b = np.polyfit(x, y, 1)
        plt.plot(x, [x * m for x in x] + b)

    plt.title(title)
    plt.grid(True)
    plt.xlabel('axis x')
    plt.ylabel('axis y')
    plt.show();

আপনাকে কেবল live_plot(x, y)একটি লুপের মধ্যে কল করতে হবে । এটি কেমন দেখাচ্ছে তা এখানে: এখানে চিত্র বর্ণনা লিখুন


0

আপনি যদি সমস্ত আউটপুট সাফ করতে না চান, আপনি display_id=Trueএকটি হ্যান্ডেল পেতে এবং .update()এটিতে ব্যবহার করতে পারেন:

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

from IPython import display

def pltsin(ax, *,hdisplay, colors=['b']):
    x = np.linspace(0,1,100)
    if ax.lines:
        for line in ax.lines:
            line.set_xdata(x)
            y = np.random.random(size=(100,1))
            line.set_ydata(y)
    else:
        for color in colors:
            y = np.random.random(size=(100,1))
            ax.plot(x, y, color)
    hdisplay.update(fig)


fig,ax = plt.subplots(1,1)
hdisplay = display.display("", display_id=True)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
for f in range(5):
    pltsin(ax, colors=['b', 'r'], hdisplay=hdisplay)
    time.sleep(1)
    
plt.close(fig)

(@ নিউম্যাটিক্স থেকে অভিযোজিত)

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