优化PyQt5和Matplotlib画布重绘以进行实时数据处理[已关闭]

4uqofj5v  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(421)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

22小时前关闭
Improve this question
我做了一个真实的数据处理的图形用户界面,使用网络摄像头。我根据从网络摄像头处理的帧中获取的数据创建画布。我每次在while循环中刷新画布,然后重新绘制画布。我想做一个更快的解决方案,因为现在canvas.draw()方法对我来说似乎有点慢,大约0.1秒就可以完成。我在下面展示了解决方案的进展。我请求帮助优化重画的速度。
下面是我的canvas类:

class Canvas(FigureCanvas):
    def __init__(self, parent=None):
        fig, (self.ax1, self.ax2) = plt.subplots(2, sharex= True, sharey= False, figsize=(10, 10))
        super(Canvas, self).__init__(fig)

下面是while循环的一部分,它设置了画布的数据:

self.canvas.ax1.cla()
self.canvas.ax2.cla()
self.canvas.ax1.plot(self.dn, self.dx, label = 'X tengely', linewidth = 1, color='#66ff33')
self.canvas.ax2.plot(self.dn, self.dy, label = 'Y tengely', linewidth = 1, color='#ff5050')
self.canvas.ax1.legend('X')
self.canvas.ax2.legend('Y')
self.canvas.ax1.set_xlim(i - 50, i)
self.canvas.ax2.set_xlim(i - 50, i)
self.canvas.draw()

以下是我解决这个问题的尝试:
我也试过使用FuncAnimation,但绘图的速度是一样的:

def animate(self, frame):
        self.canvas.ax1.cla()
        self.canvas.ax2.cla()
        self.canvas.ax1.plot(self.dn, self.dx, label = 'X tengely', linewidth = 1, color='#66ff33')
        self.canvas.ax2.plot(self.dn, self.dy, label = 'Y tengely', linewidth = 1, color='#ff5050')
        self.canvas.ax1.legend('X')
        self.canvas.ax2.legend('Y')
        self.canvas.ax1.set_xlim(i - 50, i)
        self.canvas.ax2.set_xlim(i - 50, i)

self.anim = FuncAnimation(self.canvas.figure, self.animate, interval = 1, save_count = 10000)
self.canvas.draw()

我还尝试了一个来自互联网的解决方案,它运行得更快,但线条没有出现在画布上。可能不好,但我只是把它放在这里,也许有人可以用它来作为答案。

#before the while cycle:
self.line1, = self.canvas.ax1.plot(self.dn, self.dx, label='X axis', linewidth=1, color='#66ff33')
self.line2, = self.canvas.ax2.plot(self.dn, self.dy, label='Y axis', linewidth=1, color='#ff5050')
self.bg1 = self.canvas.copy_from_bbox(self.canvas.ax1.bbox)
self.bg2 = self.canvas.copy_from_bbox(self.canvas.ax2.bbox)

#in the while:
self.anim = FuncAnimation(self.canvas.figure, self.animate, interval = 1, save_count = 10000)
self.canvas.draw()

#the new animate function:
def animate(self, frame):
        self.line1.set_data(self.dn, self.dx)
        self.line2.set_data(self.dn, self.dy)
        self.canvas.ax1.set_xlim(i - 50, i)
        self.canvas.ax2.set_xlim(i - 50, i)
        self.canvas.restore_region(self.bg1)
        self.canvas.restore_region(self.bg2)
        self.canvas.ax1.draw_artist(self.line1)
        self.canvas.ax2.draw_artist(self.line2)
        self.canvas.blit(self.canvas.ax1.bbox)
        self.canvas.blit(self.canvas.ax2.bbox)
pbpqsu0x

pbpqsu0x1#

从本质上讲,matplotlib的架构并不适合你想要做的事情。更新相对较大的地块需要花费大量时间;它是为兼容性和多功能性而设计的,在性能方面则稍逊一筹。你在“互联网上”找到的例子(一个链接会有所帮助)试图通过将数据重新分配到现有行来解决这个问题,但这对数据如何不改变做了很多假设,如果你不遵守这一点,这本质上是违反API合同的。
我建议你寻找matplotlib的替代品,它们更适合你的特定用例。Pyqtgraph是一个相对容易使用的选项,并附带了大量的演示代码,您可以直接复制。

相关问题