matplotlib 用BLIT现场绘图无法清除情节

ddarikpa  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(119)

我试图创建一个绘图实用程序来调整我的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代码基本上是一样的最小的例子和例子的工作,但我不明白为什么我的代码不工作,但例子做考虑到它的所有相同的只是在类的形式。

sulc1iza

sulc1iza1#

你需要做的是运行plt.pause(.0001),这样restore_region()方法就有了一个缓存的渲染器,在尝试渲染时可以调用。注意,它必须在其构造的上下文中。

相关问题