Несколько анимационных сюжетов на одной фигуре [Программно] - PullRequest
0 голосов
/ 07 ноября 2019

Я устанавливаю топор для каждого из данных и хочу анимировать различные данные на разных подзадачах на рисунке. Я пробовал несколько блоков кода, но не могу обработать данные. На самом деле, я могу только анимировать последний субплот.

import matplotlib.pyplot as plt
import matplotlib.animation as animation

a = [1,2,5]
if len(a)%2 == 0:
    fig, axs = plt.subplots(int(len(a)/2),2)
else:
    fig, axs = plt.subplots(int(len(a)/2)+1,2)

def barlist(n): 
    return [1/float(n*k) for k in range(1,6)]
n = 20 #Number of frames
x = range(1,6)

anim = list()

for idx, ax in enumerate(axs.flat):
    ax.set_title(str(idx))
    barcollection = ax.bar(x,barlist(1))
    def animate(kj):
        y=barlist(kj+1)
        for l, b in enumerate(barcollection):
            b.set_height(y[l]*a[idx-1])

    anim.append(animation.FuncAnimation(fig, animate, repeat=True, blit=False, frames=n, interval=75)) 
plt.show()

Я ожидаю, что создать топор программно, не создавая переменную, а анимировать все отдельные субплоты.

Редактировать: (сработавшие коды)

Примечание. Проигрыватель ( ссылка ) также тестируется. Сработало!

colors=['blue', 'red', 'black', 'blue', 'purple']
subplot_list = [1,3,2,2,6]
leng = len(subplot_list)
ax, bars = list(), list()

def barlistdef(n): 
    return [1/float(n*k) for k in range(1,6)]

fig = plt.figure()
n = 20  # Number of frames
x = range(1,6)
for i in range(leng):
    if leng == 1:
        axis = fig.add_subplot(leng, 1, (i+1))
    elif leng > 1:
        if leng%2 == 0:
            axis = fig.add_subplot(leng/2, 2, (i+1))
        else:
            axis = fig.add_subplot(int(leng/2+0.5), 2, (i+1))
    ax.append(axis)
    barcollection = ax[i].bar(x,barlistdef(1), color=colors[i])
    bars.append(barcollection)

def animate(i):
    y = barlistdef(i+1)
    for j in range(len(bars)):
        for k, bar in enumerate(bars[j]):
            bar.set_height(y[k])
    return barcollection

ani = animation.FuncAnimation(fig, animate, interval=75, frames=n, blit=False, repeat=True)
plt.show()
...