2017-06-30 34 views
0

私は30秒ごとにインターネットからデータを取得するボットを構築しています。新しいデータが到着したらMatplotlibグラフを更新するには?

私はmatplotlibを使ってこのデータをプロットし、新しいものをフェッチするときにグラフを更新できるようにしたいと思います。

スクリプトの冒頭で、私のプロットを初期化します。 その後、これらのプロットを30秒ごとに更新する機能を実行しますが、私のプロットウィンドウはこの時点でフリーズします。

私はいくつかの研究を行ってきたが、いずれかの作業溶液を見つけるように見えることはできません。

plt.show(block=False) 
plt.pause(0.001) 

は私が間違って何をやっているの?

コードの一般的な構造:

import matplotlib.pyplot as plt 
import time 

def init_plots(): 
    global fig 
    global close_line 

    plt.ion() 
    fig = plt.figure() 
    main_fig = fig.add_subplot(111) 

    x = [datetime.fromtimestamp(x) for x in time_series] 
    close_line, = main_fig.plot(x, close_history, 'k-') 
    plt.draw() 


def update_all_plots(): 
    global close_line 

    x = [datetime.fromtimestamp(x) for x in time_series] 

    close_line.set_xdata(time_series) 
    close_line.set_ydata(close_history) 

    plt.draw() 


# SCRIPT : 
init_plots() 
while(True): 
    # Fetch new data... 
    # Update time series... 
    # Update close_history... 
    update_plots() 
    time.sleep(30) 

答えて

2

特に時間の経過とともに変化するプロットのためのmatplotlibの中のモジュールがあります:https://matplotlib.org/api/animation_api.html

基本的には、データを更新している、更新機能を定義しますあなたのラインオブジェクトのために。この更新関数を使用して、xミリ秒ごとに更新関数を自動的に呼び出すFuncAnimationオブジェクトを作成できます。

ani = FuncAnimation(figure, update_function, repeat=True, interval=x) 
+0

ご返信ありがとうございます。私のメインスクリプトがプロットによってブロックされずに続行できるように、グラフを別のスレッドにプロットするはずですか? – ypicard

+0

プロットの唯一のブロック部分は 'plt.show()'関数です。私は通常、プロットにデータを送り、その後私のメインスクリプトから 'plt.show()'を呼び出す別のスレッドを開始します。だから私のメインのスクリプトは、プロットが閉じられるまでブロックしますが、データソースはデータを送り続けます。しかし、インタラクティブモードを有効にすると、メインスクリプトを非ブロックにすることができると思います。https://matplotlib.org/faq/usage_faq.html#what-is-interactive-mode – Johannes

+0

そして私のプロットはPythonスクリプトは(time.sleep(x)で)スリープしますか? – ypicard

関連する問題