Matplotlib を使用してデータをリアルタイムでプロットする方法
Matplotlib を使用してリアルタイムでデータをプロットしたり、Matplotlib でアニメーションを作成したりするために、ループで反復してプロットする変数を常に更新し、更新した値をプロットします。更新されたプロットをアニメーションでリアルタイムに表示します。には、FuncAnimation() 関数、canvas.draw()、canvas_flush_events() などのさまざまなメソッドを使用します。
FuncAnimation() 関数
変数 x と y を更新し、matplotlib.animation.FuncAnimation を使用してアニメーションを通じて更新を表示します。ことで、プロットをリアルタイムで更新できます。
構文:
matplotlib.animation.FuncAnimation(fig,
func,
frames=None,
init_func=None,
fargs=None,
save_count=None,
*,
cache_frame_data=True,
**kwargs)
コード:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
x = []
y = []
figure, ax = plt.subplots(figsize=(4, 3))
(line,) = ax.plot(x, y)
plt.axis([0, 4 * np.pi, -1, 1])
def func_animate(i):
x = np.linspace(0, 4 * np.pi, 1000)
y = np.sin(2 * (x - 0.1 * i))
line.set_data(x, y)
return (line,)
ani = FuncAnimation(figure, func_animate, frames=10, interval=50)
ani.save(r"animation.gif", fps=10)
plt.show()

ani = FuncAnimation(figure, func_animate, frames=10, interval=50)
figure は、プロットが更新される Figure オブジェクトです。
func_animate は各フレームで呼び出される関数です。その最初の引数は、次の値 frames から取得されます。
frames=10 は range(10) と同じです。各フレームで 0 から 9 の値が func_animate に渡されます。リスト [0, 1, 3, 7, 12] のように、interalbe を frames に割り当てることもできます。
interval はフレーム間の遅延で、ms の単位です。
ani.save("animation.gif", fps=10)
fps や dpi などのパラメーターを使用して、アニメーションを gif または mp4 に保存できます。
canvas.draw() と canvas_flush_events()
変数 x と y を set_xdata() と set_ydata() で更新し、次に canvas.draw() を使用してアニメーションを通じて更新を表示します。ことで、プロットをリアルタイムで更新できます。JavaScript に基づくメソッド。
import numpy as np
import time
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y = np.cos(x)
plt.ion()
figure, ax = plt.subplots(figsize=(8, 6))
(line1,) = ax.plot(x, y)
plt.title("Dynamic Plot of sinx", fontsize=25)
plt.xlabel("X", fontsize=18)
plt.ylabel("sinX", fontsize=18)
for p in range(100):
updated_y = np.cos(x - 0.05 * p)
line1.set_xdata(x)
line1.set_ydata(updated_y)
figure.canvas.draw()
figure.canvas.flush_events()
time.sleep(0.1)

ここで、x と y の値は繰り返し更新され、プロットもリアルタイムで更新されます。
plt.ion() はインタラクティブモードをオンにします。呼び出されない場合、プロットは更新されません。
canvas.flush_events() は JavaScript に基づくメソッドであり、連続する数値が重複しないように、すべての反復で数値をクリアします。
リアルタイム散布図
ただし、リアルタイムの散布を行うには、x と y の値を更新し、各反復で散布点を追加します。この場合、散布図は一般に平面内の明確なポイントを表し、ポイントが重複する可能性はほとんどないため、すべての図をクリアする必要はありません。
import numpy as np
import matplotlib.pyplot as plt
x = 0
for i in range(100):
x = x + 0.04
y = np.sin(x)
plt.scatter(x, y)
plt.title("Real Time plot")
plt.xlabel("x")
plt.ylabel("sinx")
plt.pause(0.05)
plt.show()

Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn