0

私は、一度に 1 つのチャンクで、プロットが段階的に描画されるインタラクティブな図を作成しました。

つまり、ループでいくつかのサンプリング データを取得し、それらをプロット内の既存の曲線に追加して、画像を再描画します。このために、get/set_x/ydata 関数を使用しています。この行の何か:

# Get initial data
time = [1, 2, 3, 4, 5]
samples = [0.1, 0.2, 0.3, 0.4, 0.5]
c = plot_curve(time, samples)
# Get new data
time2 = [6, 7, 8]
samp2 = [0.6, 0.7, 0.8]
c.set_xdata(append(c.get_xdata(), time2))
c.set_ydata(append(c.get_ydata(), samp2))

問題は、曲線の近くの領域 (曲線と x 軸の間のスペースなど) も fill_between を使用して塗りつぶしていることです。現在、私はこの方法でたくさんの小さなチャンクを作成しています:

# Filling initial chunk
fill_between(time, samples, [0 for i in time])
# Filling next chunk
fill_between(time[-1] + time2, samples[-1] + samp2, [0 for i in time2] + [0])

(このコードが悪臭を放つことは知っていますが、アイデアを提供するためのものです)。

したがって、問題は次のとおりです。曲線は 1 つですが、塗りつぶされた領域は 2 つです (データ チャンクごとに 1 つ)。これにより、塗りつぶされた各領域が次の領域に非常に近く、その間のスペースがほとんどないため、図面に小さなアーティファクトが作成されます。

塗りつぶし領域でもこの種の漸進的な作業を行う方法はありますか?

たとえば、2 つの曲線 (c.get_ydata() に等しい 1 つとゼロの 1 つ) を保持し、matplotlib を使用してそれらの間の領域を自動的に塗りつぶすと、コマンドを明示的に呼び出す必要がなくなり、塗りつぶされた領域が常にサンプリング ポイントを最新の状態に保ちます。

または、別の良い方法は、get/set_x/ydata と同様の方法で領域を更新できるように、ポリゴンの代わりにサンプリング ポイントを使用して塗りつぶされた領域を表すことです。

4

1 に答える 1

0

これを行うための少しハック的ではない方法は、次のとおりです。

pc = fill_between(time, samples)

(デフォルトは y2 = 0 であるため、そのリスト内包表記は必要ないことに注意してください)

次に、図を更新すると

time2 = [6, 7, 8]
samp2 = [0.6, 0.7, 0.8]
time_update = append(c.get_xdata(), time2)
samp_update = append(c.get_ydata(), samp2)
c.set_xdata(time_update)
c.set_ydata(samp_update)
pc.remove()
pc = fill_between(time_update, samp_update)

毎回新しい小さなリージョンを作成する代わりに、古いリージョンを一掃して、すべてのデータに対して完全に再作成します。これがあなたの速度にどのように影響するかはわかりませんが、あなたが今していることよりも遅いとしたら、私は驚くでしょう.

于 2013-02-06T16:39:38.887 に答える