小能豆

如何更新 matplotlib 中的绘图

javascript

我在这里重新绘制图形时遇到了问题。我允许用户指定时间尺度(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)

阅读 49

收藏
2024-06-29

共1个答案

小能豆

要更新绘图而不是将新绘图附加到图形,您应该清除现有图形,然后重新绘制数据。此外,确保每次调用函数时都不会重新创建FigureCanvasTkAgg和实例。相反,您可以创建它们一次,然后只需重新绘制画布即可重复使用它们。NavigationToolbar2TkAgg``plots

您可以按照以下方法修改代码来实现此目的:

  1. 只需创建一次图形、画布和工具栏。
  2. plots调用时清除现有轴并重新绘制图表。

这是您的代码的修订版本:

Python复制代码import collections
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from tkinter import TOP, BOTTOM

# Initialize the figure, canvas, and toolbar outside the function
f = Figure()
graph1 = f.add_subplot(211)
graph2 = f.add_subplot(212, sharex=graph1)

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

def plots():
    global vlgaBuffSorted
    cntr()

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

    result_list = result.values()

    # Clear existing plots
    graph1.clear()
    graph2.clear()

    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')

    # Redraw the canvas
    plotCanvas.draw()

# Example usage: call plots() whenever you need to update the plot
# plots()

解释:

  1. 初始化图形、画布和工具栏一次:
  2. 它们在函数外部创建一次plots。这样可以避免每次调用函数时都重新创建画布和工具栏,因为这样做效率低下,并且可能导致小部件重叠的问题。
  3. 清除现有地块:
  4. graph1.clear()graph2.clear()清除轴线上现有的图,以新的图取代旧的图。
  5. 重新绘制画布:
  6. plotCanvas.draw()使用更新后的图表重新绘制画布。

通过遵循这些步骤,您可以确保正确更新图表,而不会在旧图表之上添加新图表。

2024-06-29