Медленный рендеринг Line2D в matplotlib - PullRequest
3 голосов
/ 30 декабря 2011

Я пытаюсь использовать 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()

По сути, каждый раз, когда мышь двигается, я хочу обновить пунктирную линию между последней нажатой точкой многоугольника и текущей новой позицией мыши. Это работает, но это супер лагом. Есть идеи ??

Редактировать: Изображение того, что происходит. Пунктирная линия - это то, что медленно.

enter image description here

1 Ответ

2 голосов
/ 30 декабря 2011

Не создавайте новый Line2D для каждого движения мыши.A Line2D может иметь более 2 очков.Поэтому вместо этого используйте 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...