非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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()
 

 

上のソースコードを実行すると以下のようなグラフになります。

広告

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)
 

 

ご覧の通り前のグラフを残さず再描画できました。

 

広告

 - Python