matplotlib中Line2D渲染慢
我正在尝试使用Line2D来绘制一条线,这条线连接上次点击多边形的点和用户当前鼠标的位置。现在的代码虽然能工作,但在渲染时延迟非常严重,导致线条跟不上鼠标的移动。以下是相关的代码:
#in constructor
cid2 = self.ui.canvas2.mpl_connect('motion_notify_event', self.renderMeasureLine)
#This gets called and is laggy
def renderMeasureLine(self, mouseEvent):
if self.measuring and mouseEvent.inaxes == self.ui.canvas2.axes and len(self.pointListX) > 0:
if self.dotted_line in self.ui.canvas2.axes.lines:
self.ui.canvas2.axes.lines.remove(self.dotted_line)
self.dotted_line = Line2D([self.pointListX[-1],mouseEvent.xdata],[self.pointListY[-1],mouseEvent.ydata],
color=color, axes=self.ui.canvas2.axes, ls = '--')
self.ui.canvas2.axes.add_line(self.dotted_line)
self.ui.canvas2.draw()
================================================================================
#mpl canvas class
class MyDynamicMplCanvas(MyMplCanvas):
"""A canvas that updates itself every second with a new plot."""
def __init__(self, *args, **kwargs):
MyMplCanvas.__init__(self, *args, **kwargs)
self.colorMap = cmap.bone
def compute_initial_figure(self):
self.axes.imshow(self.data, cmap = cmap.bone)
def update_figure(self, dataOverride = None):
if self.data is not None or dataOverride is not none:
FigureCanvas.updateGeometry(self)
self.axes.clear()
if dataOverride is not None:
self.axes.imshow(dataOverride, cmap = self.getColorMap())
else:
self.axes.imshow(self.data, cmap = self.getColorMap())
self.draw()
简单来说,每次鼠标移动时,我想更新一条虚线,这条线连接上次点击的多边形点和当前鼠标的新位置。这个功能是能实现的,但延迟太大了,有没有什么好的建议呢?
补充:这是我遇到的问题的图片。虚线的反应很慢。
1 个回答
2
不要在每次鼠标移动时都创建一个新的 Line2D
对象。一个 Line2D
可以包含多个点。所以,应该使用 Line2D.set_data()
来修改一个 Line2D
中的数据。
用一个包含成千上万个点的 Line2D
来绘图,肯定比创建和绘制成千上万个 Line2D
对象要快得多。
def renderMeasureLine(self, mouseEvent):
if (self.measuring and mouseEvent.inaxes == self.ui.canvas2.axes
and len(self.pointListX) > 0):
if self.dotted_line in self.ui.canvas2.axes.lines:
x, y = self.dotted_line.get_data()
x.append(mouseEvent.xdata)
y.append(mouseEvent.ydata)
self.dotted_line.set_data(x, y)
else:
self.dotted_line = Line2D(
[self.pointListX[-1],mouseEvent.xdata],
[self.pointListY[-1],mouseEvent.ydata],
color=color, axes=self.ui.canvas2.axes, ls = '--')
self.ui.canvas2.axes.add_line(self.dotted_line)
self.ui.canvas2.blit(self.ui.canvas2.axes.bbox)
self.ui.canvas2.draw_idle()