信号処理アプリケーションに matplotlib を使用していますが、大規模なデータ セットで詰まることに気付きました。これは、使用可能なアプリケーションにするために本当に改善する必要があるものです.
私が探しているのは、matplotlib にデータをデシメーションさせる方法です。それを有効にする設定、プロパティ、またはその他の簡単な方法はありますか? これを実装する方法の提案は大歓迎です。
いくつかのコード:
import numpy as np
import matplotlib.pyplot as plt
n=100000 # more then 100000 points makes it unusable slow
plt.plot(np.random.random_sample(n))
plt.show()
いくつかの背景情報
以前は、大規模なデータセットをプロットする必要がある大規模な C++ アプリケーションで作業していました。この問題を解決するために、次のようにデータの構造を利用していました。
ほとんどの場合、ライン プロットが必要な場合、データは順序付けられ、多くの場合、等距離になります。等距離の場合は、データ配列の開始インデックスと終了インデックスをズーム四角形と逆軸変換から直接計算できます。順序付けられているが等距離でない場合は、二分探索を使用できます。
次に、ズームされたスライスがデシメートされます。データが順序付けられているため、1 ピクセル内に収まる点のブロックを単純に反復できます。そして、ブロックごとに平均、最大、最小が計算されます。1 ピクセルの代わりに、プロットにバーを描画します。
例: x 軸が順序付けられている場合、ブロックごとに垂直線が描画され、平均が異なる色で表示される可能性があります。
エイリアシングを避けるために、プロットは係数 2 でオーバーサンプリングされます。
散布図の場合、プロットの順序は重要ではないため、データを並べ替えて並べ替えることができます。
このシンプルなレシピの良いところは、拡大すればするほど速くなるということです。私の経験では、データがメモリに収まる限り、プロットは非常に反応が良いままです。たとえば、1,000 万点の時刻歴データを 20 プロットしても問題ありません。