Matplotlibで正弦波をリアルタイム描画する

まだインバーターは完成していませんが,Python3とMatplotlibを使ってインバーターの電圧と周波数を表示するプログラムを作ってみました。(↓こんな感じ)

 

まず,全体のコードです。

# python3
import numpy as np
import matplotlib.pyplot as plt


"""sin波をリアルタイムプロットする関数"""
def waveplot(f, v):    # f:周波数[Hz],v:電圧[%]
    pi = np.pi
    t = 1 / f
    plt.title('CurrentFrequency')
    plt.ylabel('VoltageRatio')
    plt.xlabel('Range:0-1 [s]')
    x = np.linspace(0, 2*pi, 1000)  # 0から2πまでの範囲を1000分割して0-1000で並べる
    plt.ylim(-100, 100)
    plt.xlim(0, 1000)
    y = v*(np.sin(x * f))

    plt.plot(y, color='limegreen')  # デフォルト(指定無し)だと水色
    plt.pause(0.01)  # 引数はsleep時間
    print("周波数", round(f, 3), "[Hz]・", "電圧", round(v, 2), "[%]・", "周期", round(t, 4), "[s]")    

    # 関数の最後で消去しないとうまくプロットされない
    plt.cla()  # 現在描写されているグラフを消去


## example of use
# 初期値
v = 0
f = 0 

v1 = float(input("電圧変化率(100msでいくら増加するか)")) 
f1 = float(input("周波数変化率(100msでいくら増加するか)"))
 
while 0 <= v < 100 : 
    v += v1 
    f += f1 
    waveplot(f, v) 
while 0 <= v <= 101 : 
    v -= v1 
    f -= f1 
    waveplot(f, v)

周波数をf,電圧をvに代入して関数を実行すると,正弦波のグラフを表示します。数値を変えながら連続的に関数を実行すればリアルタイム描画できます。

matplotlib.animationってやつを使っても連続的に表示できるらしいですが,毎回変化する数値に対してのやり方がわからなかったので,今回は単純に「描画→削除」の処理を繰り返すことで連続的にグラフを表示できるようにしました。

リアルタイムで連続的にグラフを表示するには,前の処理で書いたグラフを一度消してから新しく描画する必要があるのですが,ここでウィンドウごと閉じてしまうと処理がとんでもなく重くなります。コメントにも書いてありますが,plt.cla() を使うとウィンドウの中のグラフだけ消去することができるので,関数の最後で実行しています。

線の色とか,コード内の引数は好みの値に調整してください。

 

複数グラフをリアルタイム表示したい場合は,以下の記事を参考にしてください。

Matplotlibでスイッチング波形を表示する

コメントを残す