Python matplotlib 실시간 그래프 표시

11878 단어 파이썬matplotlib

배경



일()로 실시간으로 얻은 값을 가시화하고 싶다는 것이 되었으므로, 임해 보았습니다.

실시간 디스플레이



최종 목표는 외부의 값을 그래프에 묘사하는 것입니다.

작성한 모델의 베이스가 된 것이, Pomta님 의 이쪽의 프로그램 (matplotlib에서 실시간 그래프를 출력하고 싶다) 입니다.
몹시 공부가 되었습니다. 깊이 감사드립니다.

이 코드를 기반으로 다음을 수행했습니다.
· 클래스화
· 얻어진 값의 최대값과 최소값을 취득
· 외부 입력 값을 그래프에 기록
・가로축을 일정 간격으로 갱신(슬라이드식)

참고 코드



외부 입력값은 sin에 스텝수를 대입한 값으로 하고,
또 가로축을 시간, 세로축을 변위(외부 입력값)로 했습니다.
실시간으로 그래프 표시는
가로축의 표시 범위를 지정된 스텝 수 범위에 강제로 설정하여 해결할 수 있습니다.

draw_pic_realtime.py
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),,, 을 계산하여 표시시키고 있습니다.


반성점



객체에 값을 넣는 것만으로 가시화할 수 있는 코드에 임했습니다.
더 쉽게 표현할 수 있는 점이 몇 가지 있다고 생각합니다만, 그것은 향후 배웁니다. . .
앞으로는 클래스 부분을 하나의 파일로 하고,
import한 것만으로 클래스를 사용할 수 있도록 하면 편리할까 생각합니다.

참고문헌



matplotlib로 실시간 그래프를 출력하고 싶습니다.

좋은 웹페이지 즐겨찾기