আইপিথন নোটবুকের একটি লুপে কীভাবে একটি প্লটকে গতিশীলভাবে আপডেট করবেন (এক কক্ষের মধ্যে)


94

পরিবেশ: পাইথন ২.7, ম্যাটপ্ল্লোব ১.৩, আইপথন নোটবুক ১.১, লিনাক্স, ক্রোম। কোডটি ব্যবহার করে একটি একক ইনপুট ঘরে রয়েছে--pylab=inline

আমি স্ট্রিম গ্রাস করতে আইপিথন নোটবুক এবং পান্ডাস ব্যবহার করতে এবং প্রতি 5 সেকেন্ডে একটি প্লটকে গতিশীলভাবে আপডেট করতে চাই।

আমি যখন পাঠ্য বিন্যাসে ডেটা মুদ্রণের জন্য মুদ্রণ বিবৃতিটি ব্যবহার করি তখন এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে: আউটপুট সেলটি কেবলমাত্র ডেটা মুদ্রণ এবং নতুন সারি যুক্ত করে রাখে। কিন্তু যখন আমি ডেটা প্লট করার চেষ্টা করি (এবং তারপরে এটি একটি লুপে আপডেট করি), প্লট কখনই আউটপুট ঘরে প্রদর্শিত হয় না। তবে আমি লুপটি সরিয়ে ফেললে একবার এটি প্লট করুন। এটা ভাল কাজ করে।

তারপরে আমি কিছু সাধারণ পরীক্ষা করেছি:

i = pd.date_range('2013-1-1',periods=100,freq='s')
while True:
    plot(pd.Series(data=np.random.randn(100), index=i))
    #pd.Series(data=np.random.randn(100), index=i).plot() also tried this one
    time.sleep(5)

আমি ম্যানুয়ালি প্রক্রিয়াটিতে বাধা দেওয়া পর্যন্ত আউটপুট কিছুই দেখায় না (ctrl + m + i)। এবং আমি এটি বাধা দেওয়ার পরে প্লটটি একাধিক ওভারল্যাপযুক্ত লাইন হিসাবে সঠিকভাবে দেখায়। তবে আমি যা চাই তা হ'ল একটি প্লট যা প্রতি 5 সেকেন্ডের মধ্যে প্রদর্শিত হয় এবং আপডেট হয় (বা যখনই plot()ফাংশনটি ডাকা হয় ঠিক তেমনভাবে আমি উপরে উল্লিখিত মুদ্রণ বিবরণীর আউটপুটগুলির মতো, যা ভালভাবে কাজ করে)। কেবলমাত্র ঘরটি সম্পূর্ণরূপে শেষ হওয়ার পরে চূড়ান্ত চার্টটি দেখানো হচ্ছে তা আমি চাই না।

এমনকি আমি প্রতিটিের পরেও স্পষ্টভাবে অঙ্কন () ফাংশন যুক্ত করার চেষ্টা করেছি plot()them এগুলির কোনওটিই কাজ করে না। ভাবুন কীভাবে আইপিথন নোটবুকের একটি ঘরের মধ্যে / যখন লুপের মাধ্যমে একটি প্লটটি গতিশীলভাবে আপডেট করবেন।

উত্তর:


125

IPython.displayমডিউল ব্যবহার :

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

4
এটি কোনও মসৃণ বিকল্প নয়, কক্ষটি উপর থেকে নীচে উপরে উঠার সাথে সাথে স্ক্র্যাচ থেকে পুনর্নির্মাণ করা হয়েছে
denfromufa

4
যোগ করা clear_output(wait=True)এই সমস্যার সমাধান করে। নীচে wabu এর উত্তর দেখুন।
আহিলিয়া

4
আপনি এই দিনগুলিতে আরও ভাল করতে পারবেন %matplotlib nbaggযা দিয়ে আপনাকে লাইভ ফিগার দেয়।
টাকসওয়েল

@ ট্যাকসওয়েল আমি এটি একটি নতুন প্রশ্ন যুক্ত করে জিজ্ঞাসা করেছি যে এটি কীভাবে nbaggঅর্জন করতে পারে। (যদি আপনি পিং করা আপনি এটা উত্তর করতে আগ্রহী হন।) Stackoverflow.com/questions/34486642/...
নাথানিয়েল

4
এটি মুদ্রিত ব্যবস্থার মতো কোষের অন্য কোনও কিছুকেও ধ্বংস করে দেয়। সত্যিই কি প্লটটি আপডেট করার এবং সমস্ত কিছু ঠিক জায়গায় রাখার কোনও উপায় আছে?
কেআইসি

31

আপনি আরও যোগ করে এই উন্নত করতে পারেন wait=Trueথেকে clear_output:

display.clear_output(wait=True)
display.display(pl.gcf())

4
+1 এই অত্যন্ত গুরুত্বপূর্ণ. আমি মনে করি এই তথ্য দিয়ে HYRY এর উত্তর আপডেট করা উচিত।
আহিলিয়া 18

4
এটি ভাল, তবে মুদ্রণ আউটপুটও সাফ করার বিরক্তিকর পার্শ্ব প্রতিক্রিয়া রয়েছে।
পিটার

31

এইচআইআরওয়ির উত্তরে কয়েকটা উন্নতি হয়েছে :

  • এর displayআগে কল করুন clear_outputযাতে ঘর বাধাগ্রস্থ হয়ে গেলে আপনি দুটি পরিবর্তে একটি প্লট দিয়ে শেষ হন।
  • এটি ধরুন KeyboardInterrupt, যাতে সেল আউটপুটটি ট্রেসব্যাক দিয়ে জঞ্জাল না হয়।
import matplotlib.pylab as plt
import pandas as pd
import numpy as np
import time
from IPython import display
%matplotlib inline

i = pd.date_range('2013-1-1',periods=100,freq='s')

while True:
    try:
        plt.plot(pd.Series(data=np.random.randn(100), index=i))
        display.display(plt.gcf())
        display.clear_output(wait=True)
        time.sleep(1)
    except KeyboardInterrupt:
        break

7
প্রকৃতপক্ষে, আগেdisplay.display(gcf()) যাওয়া উচিত display.clear_output(wait=True)
Herllich10

ধন্যবাদ, @ সিএসটিএ এটি যুক্ত।
টম ফিলিপস

@ Herrlich10 displayআগে কেন ডাকা হবে clear_output? আপনি কি প্রথমে আউটপুটটি সাফ করবেন না এবং তারপরে অন্য উপায়ে না করে নতুন ডেটা প্রদর্শন করবেন?
জাকুব আর্নল্ড

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

3

এখানে পোস্ট করা অন্যান্য সমাধানগুলিতে লেবেল যুক্ত করা প্রতিটি লুপে নতুন লেবেল যুক্ত করতে থাকবে। এটি মোকাবেলায়, প্লটটি ব্যবহার করে সাফ করুনclf

for t in range(100)
   if t % refresh_rate == 0:

     plt.clf()
     plt.plot(history['val_loss'], 'r-', lw=2, label='val')
     plt.plot(history['training_loss'], 'b-', lw=1, label='training')
     plt.legend()
     display.clear_output(wait=True)
     display.display(plt.gcf())


4
ধন্যবাদ plt.clf()কাজ। তবে কীভাবে আপডেটগুলি থেকে ঝাঁকুনির হাত থেকে মুক্তি পাওয়া যায়?
মাসায়ো মিউজিক

2

ফাংশন যুক্ত করার পরে show()বা gcf().show()পরে চেষ্টা করুন plot()। এগুলি বর্তমান চিত্রটিকে আপডেট করতে বাধ্য করবে (জিসিএফ () বর্তমান চিত্রটির জন্য একটি রেফারেন্স দেয়)।


4
ধন্যবাদ gcf ()। show () এছাড়াও কাজ করে। একই ডুমুরের স্টাফ দেখানোর জন্য এইচওয়াইআরওয়ির প্রস্তাবিত ক্লিয়ার_আউটপুট () যুক্ত করতে হবে
ইউজার 3236895

এটি কি "ডিসপ্লে.ডিসপ্লে (pl.gcf ())" এর সাথে যুক্ত?
মাসায়ো মিউজিক

0

আপনি এটি এইভাবে করতে পারেন। এটি x, y তালিকা হিসাবে গ্রহণ করে এবং একই প্লটের উপর একটি স্ক্যাটার প্লট এবং লিনিয়ার ট্রেন্ড আউটপুট দেয়।

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)একটি লুপের মধ্যে কল করতে হবে । এটি কেমন দেখাচ্ছে তা এখানে: এখানে চিত্র বর্ণনা লিখুন

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