我正在尝试创建一个图形实用程序来实时调整我的 PIDS,因此目标是能够发送初始对象中的绘图数量和这些绘图的数据量,然后使用新数据调用更新函数来更新图表。目前,我的示例没有我的类,但是为了使图形和数据量可用,我需要将其集成到一个类中,当实现我已经达到了我可以设置数据但在我的图形上调用
fig.canvas.restore_region(bbox)
时我收到无限量的线条,就像画布在下一次 blit 之前没有被恢复一样。
class Plot():
def __init__(self,fig,ax,grain,dataAmount,names,colors) -> None:
self.fig = fig
self.ax = ax
self.xData = range(grain)
self.yData = [0] * grain
self.name = names
self.color = colors
self.ln, = self.ax.plot(self.xData, self.yData, animated=True,label=self.name)
self.bg = self.fig.canvas.copy_from_bbox(self.ax.bbox)
self.origBB = self.fig.bbox
self.fig.canvas.blit(self.fig.bbox)
self.ax.legend()
def update(self,ticks,y):
self.fig.canvas.restore_region(self.bg)
self.yData.append(y)
self.yData.pop(0)
self.ln.set_ydata(self.yData)
self.ax.relim()
self.ax.autoscale_view()
self.ax.draw_artist(self.ln)
self.ax.set_title(self.name)
self.ax.legend()
self.fig.canvas.blit(self.ax.bbox)
self.fig.canvas.flush_events()
这是单独的 Plot 类,充当 LiveGraph 类中的对象来创建新轴。
class LiveGraph():
def __init__(self,plotNum,names) -> None:
fig = plt.figure()
self.plots = [ Plot(fig,fig.add_subplot(plotNum, 1, i+1),100,1,names[i],i) for i in range(plotNum)]
self.tick = 0
plt.show(block=False)
plt.pause(0.1)
def update(self):
self.tick += 1
for plot in self.plots:
plot.update(self.tick,math.sin(self.tick/10))
if __name__ == "__main__":
LG = LiveGraph(2,["test1","test2"])
while True:
LG.update()
这是生成和更新窗口并管理“轴”/图的主类
这是输出我如何删除旧行 另请注意,此代码尚未完成,我仍然需要实现多项功能,但我只是希望基本图形能够在此之前工作。
我尝试以不同的方式存储图形和轴,因为我认为传递它们会引起问题,但我的主要问题是我的uopdate代码基本上与最小示例相同,并且该示例确实有效,但我不明白为什么我的代码不起作用但这个例子确实考虑到它在类形式上几乎是一样的。
您需要做的是运行“plt.pause(.0001)”,以便“restore_region()”方法在尝试渲染时可以调用已兑现的渲染器。请注意,它必须处于其构造的上下文中。