matplotlib - wxpython后端 - 快速更新

时间:2018-01-28 20:51:20

标签: python matplotlib wxpython

作为一项旨在绘制复杂科学人物的大型GUI工作的一部分,我正在努力加快互动和数字更新。到目前为止,我一直在使用canvas.draw()方法更新图中任何绘制对象的任何更改。 我无法重现示例代码,因为它有数千行代码,但这是我正在处理的内容的快照

enter image description here

上图是一个相当拥挤的示例图像,包含3个轴,等高线图,路径,箭头,png图像,不同的透明度对象,阴影,线条,填充,颜色条等

enter image description here

通常用户将使用如上所述的GUI来添加,删除更新或修改任何绘制的对象。 对于这样的数字,任何修改都很慢,因为它在后端调用canvas.draw()。

#self.__canvas.Refresh()
#self.__canvas.Update()
###self.__canvas.update() # 'FigureCanvasWxAgg' object has no attribute 'update'
#self.__canvas.Refresh()
#self.__canvas.flush_events()
#self.__canvas.blit(self.__selectedAxes.bbox)
self.__canvas.draw()

我已经尝试过使用上述所有内容,但只有canvas.draw导致更新其他所有人赢得的数字。到目前为止,我不确定如何在仅更新一个对象后加快重新绘制图像的速度。

此外,根据此post blit导致内存泄漏。有没有人试图验证这个假设?

感谢任何建议

1 个答案:

答案 0 :(得分:0)

您可以使用blitting,而不是使用self.__canvas.draw()并重绘绘图上的所有数据。通过使用blitting,您可以将特定的新元素添加到绘图中,而不是重绘整个事物。这节省了大量时间。

为了开始blitting,必须在代码中的某个地方至少绘制一次画布。否则就没有什么可以“搞砸”了。所以很遗憾你无法完全摆脱self.__canvas.draw()

要滑动某个元素(例如矩形),首先必须将矩形元素添加到轴。矩形是matplotlib.patch,并且要向您必须使用的轴添加补丁:self.axes.add_patch(rectangle)。添加后,您需要使用:self.axes.draw_artist(rectangle)在轴上绘制它。绘制完成后,您可以使用:self.canvas.blit(self.axes.bbox)将其blit到画布。 使用:self.background = self.canvas.copy_from_bbox(self.axes.bbox)将blitted元素作为背景图像保存,并使用:self.canvas.restore_region(self.background)将其恢复到画布。

将Rectangle blits到画布的一些示例代码:

import matplotlib
matplotlib.use('WXAgg')

from matplotlib.figure import Figure
from matplotlib.backends.backend.wxagg import FigureCanvasWxAgg as FigureCanvas

import wx

class Panel(wx.Frame):
    wx.Frame.__init__(self, parent, id, 'Title')

    self.figure = Figure()
    self.axes = self.figure.add_subplot(111)
    self.canvas = FigureCanvas(self, -1, self.figure)
    self.sizer = wx.BoxSizer(wx.VERTICAL)
    self.sizer.Add(self.canvas, proportion=1, flag= wx.ALL | wx.GROW)

    """Plot data and stuff to canvas...."""        

    self.canvas.draw()
    self.background = self.canvas.copy_from_bbox(self.axes.bbox)

    square = matplotlib.patches.Rectangle((xPos,yPos), width, height)

    self.canvas.restore_region(self.background)
    self.axes.add_patch(square)
    self.axes.draw_artist(square)
    self.canvas.blit(self.axes.bbox)
    self.background = self.canvas.copy_from_bbox(self.axes.bbox)

我可以做个拼写错误。但你会明白它。