作为一项旨在绘制复杂科学人物的大型GUI工作的一部分,我正在努力加快互动和数字更新。到目前为止,我一直在使用canvas.draw()方法更新图中任何绘制对象的任何更改。 我无法重现示例代码,因为它有数千行代码,但这是我正在处理的内容的快照
上图是一个相当拥挤的示例图像,包含3个轴,等高线图,路径,箭头,png图像,不同的透明度对象,阴影,线条,填充,颜色条等
通常用户将使用如上所述的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导致内存泄漏。有没有人试图验证这个假设?
感谢任何建议
答案 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)
我可以做个拼写错误。但你会明白它。