Я пытаюсь создать программу, которая позволит пользователям строить графики на нескольких вспомогательных участках вместе с большим графиком, который накладывается на все вспомогательные участки. Теперь у пользователя есть возможность анимировать свои графики, если они этого хотят. Кажется, что анимация работает хорошо, когда анимация выполняется на нескольких маленьких вспомогательных участках, а также при анимации большого графика с неподвижными фигурами на меньших вспомогательных участках. Проблема возникает, однако, в том случае, если пользователь хочет разместить анимацию как на меньших, так и на больших общих участках (это не должно происходить часто, но может возникнуть по любой причине). Вот пример того, что у меня есть:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def animate_graph(fig, ax, x, y):
line, = ax.plot([], [])
def init():
line, = ax.plot([], [])
return line,
def animate(i, x, y):
x = x[:int(i+1)]
y = y[:int(i+1)]
line.set_data(x, y)
line.axes.axis([0, 5, -1, 1])
return line,
ani = animation.FuncAnimation(fig, animate, init_func= init, interval = 20, fargs = [x, y], blit = True)
#create figure and subplots
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.4])
ax2 = fig.add_axes([0.1, 0.5, 0.8, 0.4])
#create axis in front with dimensions that span both subplots
ax_full = fig.add_axes([0.1, 0.1, 0.8, 0.8])
#make background of large axis transparent
ax_full.patch.set_alpha(0)
#create data arrays
x = np.linspace(0, 5, 100)
y1 = np.sin(2*np.pi*x)
y2 = np.cos(2*np.pi*x)
y_full = [0.5 if i < 2.5 else -0.5 for i in x]
#call animation function
animate_graph(fig, ax1, x, y1)
animate_graph(fig, ax2, x, y2)
animate_graph(fig, ax_full, x, y_full)
Это работает, когда я вызываю animate_graph первые два раза, но если я добавлю третий вызов animate_graph, анимация станет очень нервной и не синхронизированной по времени. Я предполагаю, что это потому, что matplotlib сталкивается с проблемой синхронизации между синхронизацией анимации и отображением графиков друг над другом, но я не уверен, как бы я решил эту проблему. Любая помощь будет отличной, спасибо!