1. ホーム
  2. python

[解決済み] matplotlib でプロットを更新する方法

2022-03-06 08:43:38

質問

こちらの図の再描画に問題があります。時間軸(X軸)の単位をユーザーが指定できるようにして、再計算してこの関数を呼び出しています。 plots() . 私はプロットを単に更新したいのであって、図に別のプロットを追加したいわけではありません。

def plots():
    global vlgaBuffSorted
    cntr()

    result = collections.defaultdict(list)
    for d in vlgaBuffSorted:
        result[d['event']].append(d)

    result_list = result.values()

    f = Figure()
    graph1 = f.add_subplot(211)
    graph2 = f.add_subplot(212,sharex=graph1)

    for item in result_list:
        tL = []
        vgsL = []
        vdsL = []
        isubL = []
        for dict in item:
            tL.append(dict['time'])
            vgsL.append(dict['vgs'])
            vdsL.append(dict['vds'])
            isubL.append(dict['isub'])
        graph1.plot(tL,vdsL,'bo',label='a')
        graph1.plot(tL,vgsL,'rp',label='b')
        graph2.plot(tL,isubL,'b-',label='c')

    plotCanvas = FigureCanvasTkAgg(f, pltFrame)
    toolbar = NavigationToolbar2TkAgg(plotCanvas, pltFrame)
    toolbar.pack(side=BOTTOM)
    plotCanvas.get_tk_widget().pack(side=TOP)

解決方法は?

基本的には2つの選択肢があります。

  1. 現在行っているのと全く同じように、しかし graph1.clear()graph2.clear() を実行してから、データを再プロットします。 これは最も時間がかかるが、最も単純で最も堅牢なオプションである。

  2. replotting の代わりに、plot オブジェクトのデータを更新すればよいのです。 コードにいくつかの変更を加える必要がありますが、毎回再プロットするよりもずっとずっと速くなるはずです。 しかし、プロットするデータの形状は変更できませんし、データの範囲が変更される場合は、x軸とy軸の制限を手動でリセットする必要があります。

2番目の選択肢の例を挙げると

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 6*np.pi, 100)
y = np.sin(x)

# You probably won't need this if you're embedding things in a tkinter plot...
plt.ion()

fig = plt.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x, y, 'r-') # Returns a tuple of line objects, thus the comma

for phase in np.linspace(0, 10*np.pi, 500):
    line1.set_ydata(np.sin(x + phase))
    fig.canvas.draw()
    fig.canvas.flush_events()