背景
お仕事()でリアルタイムで得られた値を可視化したいということになったので、取り組んでみました。
リアルタイム表示
最終的な目標は外部からの値をグラフに描写することです。
作成したモデルのベースとなったのが、Pomta様のこちらのプログラム(matplotlibでリアルタイムグラフを出力してみたい)です。
大変勉強になりました。深く感謝したします。
こちらのコードをもとに以下のことを取り組みました。
・クラス化
・得られた値の最大値と最小値を取得
・外部入力値をグラフに書き込む
・横軸を一定間隔で更新(スライド式)
参考コード
外部入力値はsinにステップ数を代入した値とし、
また横軸を時間、縦軸を変位(外部入力値)としました。
リアルタイムでのグラフ表示は、
横軸の表示範囲を指定のステップ数範囲に強引に設定することで解決できます。
import matplotlib.pyplot as plt
import math
import numpy as np
#クラス作成 スライド式リアルタイム速度表示
class draw_pic( ):
#変数の初期化
def __init__(self):
self.i_step = 0#ステップ数
#self.j_step = 0
self.t_axis = []#ステップ数を格納
self.x_axis = []#変位を格納
self.color = 'blue'
plt.ion()
plt.title('Estimation displacement Value')#タイトル
plt.xlabel('t')#横軸のラベル名
plt.ylabel('x')#縦軸のラベル名
plt.grid()#グリッド表示
# 引数はselfを指定しないと、すべての引数を認識してくれない
def once_draw_pic(self, X_j):## 描画データ生成
self.i_step = self.i_step + 1#ステップ数をインクリメント
self.t_axis.append(self.i_step)#横軸
self.x_axis.append(X_j)#縦軸
plt.plot(self.t_axis, self.x_axis ,self.color)#横軸、縦軸、色
plt.xlim(self.i_step - 20, self.i_step + 1)#横軸の範囲指定
plt.draw()# グラフ表示
if self.i_step == 1000:#ステップ数が1000に達したら終了
plt.close()
plt.pause(0.1)#待機時間[s]
# 最大値から最小値に並べ替え,上位3つを取得
def get_4_maxmin(self):
# 最大値から最小値に並べ替える
ld_max = sorted(self.x_axis, reverse=True)
# 並べ替えて上位4つを取得
ld_max = ld_max[:4]
# 並べ替えて上位4つを小数第位4までを丸め込む
ld_max = [ round(ld_max[n],4) for n in range( len(ld_max) )]
# 平均値
ld_max_ave = round(float(sum(ld_max) / len(ld_max)), 4)
print("平均値", ld_max_ave, "最小値上位4つ", ld_max)
# 最小値から最大値に並べ替える
ld_min = sorted(self.x_axis)
# 並べ替えて上位4つを取得
ld_min = ld_min[:4]
# 並べ替えて上位4つを小数第位4までを丸め込む
ld_min = [round(ld_min[n],4) for n in range(len(ld_min ))]
# 平均値
ld_mix_ave = round(float(sum(ld_min) / len(ld_min)), 4)
print("平均値", ld_mix_ave, "最小値上位4つ ", ld_min)
return ld_max_ave, ld_mix_ave#別に返さなくてもいいです
#外部入力X_j
i_ = 0
X_j = 0
#描写オブジェクトを作成
D_p = draw_pic( )
#連続的な描写
while True:
i_ += 1#インクリメント
X_j = (np.sin(i_))#sinにステップ数を代入
D_p.once_draw_pic(X_j)#グラフをリアルタイムで描写
D_p.get_3_maxmin()#値の最大値と最小値を算出
実験結果
本当はgitで載せたかったんですが、ここらへんで力尽きました。
sin波形がカクカクしているのは、sinに1,2,3,4,,,を代入しているためです
つまり、sin(1),sin(2),sin(3),,,を計算して、表示させています。
反省点
オブジェクトに値を入れるだけで可視化できるコードに取り組みました。
もっと簡単に表現できる点がいくつもあるとは思いますが、それは今後学びます。。。
今後はクラス部分を1つのファイルにし、
importしただけでクラスを使えるようにすると便利かなと思います。