Python matplotlib.animation.ArtistAnimation для сюжета - PullRequest
0 голосов
/ 06 ноября 2019

Мне нужно анимировать несколько сюжетов на фигуре, созданной ранее. У меня есть класс (для визуализации) с данными для построения графика, фигура, которая была создана из этого класса, и я хочу сделать метод этого класса таким, чтобы я мог вызывать его с выбранными осями на фигуре и некоторыми параметрами для получения анимацииработай. Я спрашиваю о более питоническом способе сделать это, возможно, мой класс должен быть подклассом matplotlib.animation?

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

    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    import random
    class MyClass:  # some class
        def __init__(self, fig1):
            self.fig = fig1
            self.x = np.arange(0, 10)  # some data in class
            self.y = np.array([1, 0, 3, 5, 3, 5, 3, 7, 5, 3])
            self.condition1 = True
            self.number_of_lines = 3
        def _plot_one(self, axes):
            some_list = []  # need multiple lines
            for i in range(self.number_of_lines):  # create list of lines
                some_list.append(axes.plot(self.x, self.y * random.randint(1, 100) * 1))
            res = some_list[0]
            if len(some_list) > 1:  # sum all lines
                for i in range(1, len(some_list)):
                    res += some_list[i]
            return res
        def _plot_two(self, axes):
            # do another stuff
            pass
        # call the general method for plotting lines
        def _plot_all(self, axes):
            # check conditions to know what line to plot
            if self.condition1:
                return self._plot_one(axes)
            else:
                return self._plot_two(axes)
        def _create_anim_list(self, axes, count):
            list_to_anim = []
            for i in range(count):
                # here we must append plt.plot(data) object or
                # axes.plot(data) object to make it work
                list_to_anim.append(self._plot_all(axes))
            return list_to_anim
        def animate(self, axes, count):
            # create list of arts
            list_to_anim =  self._create_anim_list(axes, count)
            return animation.ArtistAnimation(self.fig, list_to_anim,
                                             interval=600, repeat_delay=1000)
    fig, ax = plt.subplots(2, 2)  # create figure and subplots
    ax[1,1].plot([1,10], [1,1])  # plot some stuff
    ax[0,0].plot([1,10], [1,1])  # plot some stuff
    anim = MyClass(fig)  # initialize obj
    animate1 = anim.animate(ax[0, 0], 10)  # animate list of images with given parameters
    animate2 = anim.animate(ax[1, 0], 10)  # another data animation on other subplot

Мне нужно использовать ArtistAnimation, потому что это может быть сложной логикой в ​​методе _plot_one(). Я получил то, что хотел, есть некоторые данные на подзадачах, и есть анимации, работающие на подзадачах. Но я ожидал что-то вроде создания MyClass, работающего более питонно. Извините за мой плохой английский.

...