1. ホーム
  2. パイソン

[解決済み】matplotlibを使ってwhileループでリアルタイムにプロットするにはどうしたらいいですか?

2022-03-29 01:03:46

質問

OpenCVを使ってカメラからのデータをリアルタイムでプロットしようとしています。しかし、リアルタイムのプロット(matplotlibを使用)がうまくいかないようです。

この簡単な例で問題を分離してみました。

fig = plt.figure()
plt.axis([0, 1000, 0, 1])

i = 0
x = list()
y = list()

while i < 1000:
    temp_y = np.random.random()
    x.append(i)
    y.append(temp_y)
    plt.scatter(i, temp_y)
    i += 1
    plt.show()

この例では、1000点を個別にプロットすることを期待します。実際に起こることは、最初の点が表示されたウィンドウがポップアップし(それでOK)、ループが終了するのを待ってから残りのグラフを表示するというものです。

なぜ一度に1つのポイントが表示されないのか、何か思い当たることはありますか?

解決方法は?

以下は問題のコードの作業バージョンです(少なくとも2011-11-14からのバージョンMatplotlib 1.1.0が必要です)。

import numpy as np
import matplotlib.pyplot as plt

plt.axis([0, 10, 0, 1])

for i in range(10):
    y = np.random.random()
    plt.scatter(i, y)
    plt.pause(0.05)

plt.show()

を呼び出すことに注意してください。 plt.pause(0.05) これは新しいデータを描画し、GUIのイベントループを実行します(マウスの操作が可能です)。