1. ホーム
  2. python

[解決済み] matplotlib でプロットを動的に更新する

2022-06-12 22:16:27

質問

Pythonで、シリアルポートからデータを収集し、収集したデータの到着時間に対するグラフをプロットするアプリケーションを作っています。データの到着時刻は不確定です。データを受信したらグラフを更新するようにしたいのですが、どうすればよいでしょうか。これを行う方法について検索したところ、2つの方法を見つけました。

  1. プロットをクリアして、もう一度すべての点でプロットを再描画する。
  2. 特定の間隔の後にプロットを変更することによってアニメートする。

プログラムが長時間(例えば1日)動作してデータを収集し、プロットを再描画するとかなり時間がかかるので、最初のものは好ましくありません。 2つ目の方法も、データの到着時刻が不確かで、データが受信されたときだけプロットを更新したいので、好ましくありません。

データを受信したときだけ、点を追加するだけでプロットを更新できるような方法はないでしょうか?

どのように解決するのですか?

点を追加するだけでプロットを更新できるような方法はありますか?

matplotlibでデータをアニメーション化する方法は、バージョンによっていくつもあります。あなたは matplotlib クックブック の例を見ましたか?また、より現代的な アニメーションの例 を matplotlib のドキュメントで見てみてください。最後に アニメーション API は関数を定義しています。 FuncAnimation を定義しています。この関数は、データを取得するために使用する関数である可能性があります。

各メソッドは基本的に data プロパティを設定するので、画面や図をクリアする必要はありません。そのため data プロパティは単純に拡張することができるので、前のポイントを維持したまま、線(または画像、あるいはあなたが描いているもの)に追加し続けることができます。

データの到着時間が不明であることを考えると、最善の方法は次のようなことを行うことでしょう。

import matplotlib.pyplot as plt
import numpy

hl, = plt.plot([], [])

def update_line(hl, new_data):
    hl.set_xdata(numpy.append(hl.get_xdata(), new_data))
    hl.set_ydata(numpy.append(hl.get_ydata(), new_data))
    plt.draw()

そして、シリアルポートからデータを受信するときは、単に update_line .