我试图创建一个绘图实用程序来调整我的PIDS生活,所以目标是能够发送的绘图量和数据量的这些图在innital对象,然后调用更新功能与新的数据更新图形。目前我的例子没有我的类工程,但科塞,使图形和数据量可变,我需要将其集成到一个类时,实现,我已经goten,重点是我可以设置数据,但当调用我的图上的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()
型
这是生成和更新窗口以及管理“轴”/图的主类
multiple lines这是输出,我如何删除旧行还注意到,这段代码还没有完成,我仍然需要实现多个东西,我只是希望基本的图形工作之前,虽然。
我试过存储的数字和轴不同,因为我认为通过他们是造成问题,但我的主要问题是,我的uupdate代码基本上是一样的最小的例子和例子的工作,但我不明白为什么我的代码不工作,但例子做考虑到它的所有相同的只是在类的形式。
1条答案
按热度按时间sulc1iza1#
你需要做的是运行
plt.pause(.0001)
,这样restore_region()
方法就有了一个缓存的渲染器,在尝试渲染时可以调用。注意,它必须在其构造的上下文中。