matplotlib
前回、PythonのPandasで特定の値を書き換える方法を紹介しました。
今回はmatplotlibを使ってリアルタイムに変化するグラフを表示する方法を紹介します。
ちなみに似たようなものとしてmatplotlibとPILを使ってアニメーショングラフを作成する方法を過去に紹介していますので、よかったらどうぞ。
今回紹介するmatplotlibを使ってリアルタイムに変化するグラフを作成するのは、python実行プログラムとして実行する場合と、Jupyter notebook上で実行する場合では少しやり方が違いますので、それぞれ紹介します。
それでは始めていきましょう。
グラフのデータの作成
まずはグラフで用いるデータを作成するプログラムをこんな感じで作ってみました。
import random
data_length =100
x = []; y = []
for i in range(data_length):
x.append(i)
y.append(random.randint(0, 20))
if len(x) > 10:
del x[0]
del y[0]
print(x, y)
実行結果
[0] [7]
[0, 1] [7, 11]
[0, 1, 2] [7, 11, 19]
[0, 1, 2, 3] [7, 11, 19, 16]
[0, 1, 2, 3, 4] [7, 11, 19, 16, 10]
(中略)
[86, 87, 88, 89, 90, 91, 92, 93, 94, 95] [20, 16, 19, 20, 5, 13, 17, 2, 7, 4]
[87, 88, 89, 90, 91, 92, 93, 94, 95, 96] [16, 19, 20, 5, 13, 17, 2, 7, 4, 6]
[88, 89, 90, 91, 92, 93, 94, 95, 96, 97] [19, 20, 5, 13, 17, 2, 7, 4, 6, 14]
[89, 90, 91, 92, 93, 94, 95, 96, 97, 98] [20, 5, 13, 17, 2, 7, 4, 6, 14, 14]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99] [5, 13, 17, 2, 7, 4, 6, 14, 14, 8]
for文を使ってxはデータのインデックス、yは0から20の間のランダムな数字を取得しています。
そしてデータの数が10より大きくなった場合、リスト内の最初の値を削除することで常に10個のデータとなるようにしています。
このプログラムを基本にして、リアルタイムに変化するグラフを表示してみましょう。
Python実行プログラムでリアルタイムに変化するグラフ表示
Python実行プログラムとしてリアルタイムに変化するグラフを表示するには「plt.show()」の代わりに「plt.pause(ポーズする秒数)」とします。
またグラフをクリアするのに「plt.clf()」ではなく、「plt.cla()」を用います。
ということでこんな感じです。
import matplotlib.pyplot as plt
import random
import time
data_length =100
x = []; y = []
fig = plt.figure()
for i in range(data_length):
x.append(i)
y.append(random.randint(0, 20))
if len(x) > 10:
del x[0]
del y[0]
plt.clf()
plt.plot(x, y)
plt.pause(0.1)
time.sleep(5)
実行結果
このままではY軸がかなりバタバタ変わってしまっているので、「plt.xlim()」で範囲を制限してあげるともう少し見やすくなります。
import matplotlib.pyplot as plt
import random
import time
data_length =100
x = []; y = []
fig = plt.figure()
for i in range(data_length):
x.append(i)
y.append(random.randint(0, 20))
if len(x) > 10:
del x[0]
del y[0]
plt.clf()
plt.plot(x, y)
plt.ylim(0, 22)
plt.pause(0.1)
time.sleep(5)
実行結果
Jupyter notebook上でリアルタイムに変化するグラフ表示
Jupyter notebook上でリアルタイムに変化するグラフを表示するには以下の点に注意します。
- マジックコマンド「%matplotlib inline」を使う
- 「IPython.displayのclear_output」をグラフの切り替えで用いる
ということでこんな感じです。
import matplotlib.pyplot as plt
import random
from IPython.display import clear_output
%matplotlib inline
data_length =100
x = []; y = []
fig = plt.figure()
for i in range(data_length):
x.append(i)
y.append(random.randint(0, 20))
if len(x) > 10:
del x[0]
del y[0]
plt.clf()
plt.plot(x, y)
plt.ylim(0, 22)
plt.pause(0.1)
clear_output(wait = True)
実行結果
例えば測定器から来たデータなんかを受け取ってリアルタイムに表示するのに役立ちます。
今回見てみるとどうやらPython実行プログラムの方が動きが良く、Jupyter notebook上でリアルタイム表示すると指定した時間よりも遅い感じがします。
入ってきたデータを処理なんかするとまた時間がかかると思うので、そこら辺は色々工夫が必要かもしれません。
次回はmatplotlibのplt.clf()とplt.cla()、plt.close()の違いを見てみましょう。
ではでは今回はこんな感じで。
コメント