Python/matplotlibでチャートをリアルタイムに描画するには
Python/matplotlibで、株価や為替のように時間とともにデータが変化していく場合、その都度グラフを更新する必要があります。
今回は一定時間間隔でグラフを再描画する方法について書きます。
まずは固定グラフを用意
今回はランダムウォークのダミーデータを使います。
import numpy as np import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) step = np.random.choice([-1,1],500) arr = np.cumsum(step) plt.plot(arr) plt.show()
上のソースコードを実行すると以下のようなグラフになります。
[ad#top-1]
pause()を使ってグラフを再描画(失敗編)
グラフを再描画する場合は、plt.show()
の代わりに plt.pause(1)
を使用します。( )の中の数値はインターバル時間(秒)です。
import numpy as np import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) while True: step = np.random.choice([-1,1],500) arr = np.cumsum(step) plt.plot(arr) plt.pause(1)
上のコードだと1秒間隔でグラフを再描画してくれますが、以下の通り前のラインが残ってしまいます。
グラフを重ねないようにするにはset_dataメソッドを使う
グラフが重なってしまうのはループの中で毎回plotしてしまうからです。
そうではなく、ループの前にグラフオブジェクトを受け取っておいて(lines)、それに対し再描画(set_data)してあげればOKです。
import numpy as np import matplotlib.pyplot as plt #一旦ここでグラフを描画。 step = np.random.choice([-1,1],500) arr = np.cumsum(step) x = np.arange(0, 500, 1) plt.figure(figsize=(10,6)) lines, = plt.plot(x, arr) #グラフオブジェクトを受け取る #1秒ごとに再描画 #set_dataメソッドで描画データを更新する while True: step = np.random.choice([-1,1],500) arr = np.cumsum(step) lines.set_data(x, arr) #データ更新 plt.ylim([arr.min()-1,arr.max()+1]) plt.pause(1)
ご覧の通り前のグラフを残さず再描画できました。
[ad#ad-1]
スポンサーリンク