Мне нужно анимировать несколько сюжетов на фигуре, созданной ранее. У меня есть класс (для визуализации) с данными для построения графика, фигура, которая была создана из этого класса, и я хочу сделать метод этого класса таким, чтобы я мог вызывать его с выбранными осями на фигуре и некоторыми параметрами для получения анимацииработай. Я спрашиваю о более питоническом способе сделать это, возможно, мой класс должен быть подклассом 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, работающего более питонно. Извините за мой плохой английский.