我在这里重绘图形时遇到问题。我允许用户指定时间刻度(x 轴)中的单位,然后我重新计算并调用此函数plots()。我希望情节简单地更新,而不是在图中附加另一个情节。
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)
你基本上有两个选择:
做你目前正在做的事情,但在重新绘制数据之前调用graph1.clear()and graph2.clear()。这是最慢,但最简单和最强大的选项。
graph1.clear()
graph2.clear()
您可以只更新绘图对象的数据,而不是重新绘制。您需要对代码进行一些更改,但这应该比每次都重新绘制要快得多。但是,您正在绘制的数据的形状无法更改,并且如果您的数据范围正在更改,您将需要手动重置 x 和 y 轴限制。
举第二个选项的例子:
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()