В Jupyter Notebook и matplotlib, как избежать повторения всего в интерактивном сюжете - PullRequest
0 голосов
/ 30 октября 2018

В блокноте jupyter подготовьте сюжет рядом с другой анимацией. Для каждого кадра анимации график должен обновляться вертикальной линией и красной точкой, показывающей значение этого свойства. Ниже приведен минимальный рабочий пример (без анимации):

import ipywidgets as wg
import matplotlib.pyplot as plt

class interactive_plot:

    def __init__(self,r):
        self.X = [x for x in range(r)]
        self.Y = [y for y in range(r)]
        self.r = r
        self.fig = None
        self.ax = None

    def pathPlot(self, xframe = None):

        if self.fig is None:
            self.fig = plt.figure()
            self.ax =self.fig.add_subplot(1,1,1)
            self.ax.plot(self.X, self.Y, 'bo-')

        else:
            self.fig = plt.gcf()
            self.ax = plt.gca()
            self.ax.plot(self.X, self.Y, 'bo-')

        if xframe is not None:
            self.ax.axvline(x = self.X[xframe],color = 'black',linestyle = '--')
            self.ax.plot(self.X[xframe],self.Y[xframe], 'ro', markersize=10)

    def pathPlay(self):

        frame = wg.IntSlider(min = 0, max = self.r - 1)
        wg.interact(self.pathPlot, xframe = frame)

test = interactive_plot(10)
test.pathPlay()

Этот минимальный пример работает "отлично". Тем не менее, в моем блокноте Jupyter есть еще одна анимация, и с увеличением количества анимаций возникает проблема с производительностью (можно увидеть, как график очищается и повторяется).

Я подумал, что, возможно, я мог бы избежать строки self.ax.plot(self.X, self.Y, 'bo-') в операторе else (заменяя self.fig.show ()) и просто обновить вертикальную линию красной точкой. Однако я не смог этого сделать. Каждый раз синяя линия исчезает, и я получаю только вертикальную линию и красную точку на графике.

Так что мне было интересно:

1- Как правильно обновить сюжет?

2- Я действительно получу повышение производительности? По крайней мере, я не увижу, чтобы заговор был очищен и пересмотрен, верно?

...