Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

matplotlib: 折れ線グラフのリアルタイムプロットでラベルやカラーなどの属性を変える(音声信号でのデモ付き)

f:id:Kurene:20210601200449g:plain

前回の記事では、matplotlibでの折れ線グラフのプロット画像のラベルや属性を変更しました。

www.wizard-notes.com

今回は、折れ線グラフのリアルタイムプロットでラベルやカラーなどの属性を変えるコードを実装をしました。

import numpy as np
import matplotlib.pyplot as plt


length = 100
x = np.arange(0, length)
y = np.array([
    np.random.normal(0, 5.0, length),
    np.random.normal(0, 1.0, length),
    np.random.normal(0, 3.0, length),
])
colors = ['r', 'g', 'b']
labels = ["", "", ""]
markers = ["o", "x", "*"]
alphas = [0.25, 0.5, 0.75]

plt.ion()
fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(111)
ax.set_prop_cycle(color=colors, marker=markers, alpha=alphas)

lines = ax.plot(x, y.T, "-*") 
plt.legend(lines, labels, loc='upper right')
plt.ylim(-10, 10)
plt.grid()
plt.show()


from collections import deque
colors = deque(colors)

for n in range(0, 50):
    y = np.array([
        np.random.normal(0, 5.0, length),
        np.random.normal(0, 1.0, length),
        np.random.normal(0, 3.0, length),
    ])
    labels = [f'plot{n}_no_1', f'plot{n}_no_2', f'plot{n}_no_3']
    colors.rotate(1)
    
    
    for k in range(0,len(lines)):
        lines[k].set_ydata(y[k,:]) 
        lines[k].set_color(colors[k])
        lines[k].set_marker(markers[k])

    plt.legend(lines, labels, loc='upper right')
    plt.pause(0.1)
    

matplotlib でのリアルタイムプロット方法の基本に関しては、以下の記事を参照してください。

www.wizard-notes.com

リアルタイムプロットでlines[k].set_ydata() を使う方法の場合、属性はlines[k].set_xxxx()を利用することになります。

属性については、前回の記事と同様で plt.legend(lines, labels)で変更することができます。

これを使うことで、リアルタイムプロットで特定の条件の時のみ折れ線グラフの色などの属性を変えることもできます。

以下の例では、リアルタイムでPCマイク録音し、RMS計算後にRMSが一定の値以上かどうかで折れ線グラフの色を変化させています。