FuncAnimation sendo chamado muitas vezes
Esta é uma continuação de uma pergunta anterior que fiz . Percebi que os valores usados para atualizar meu gráfico de pizza estavam incorretos. Eu tenho uma lista zque está sendo atualizada com o numiterador em minha função FuncAnimation chamada update. Aqui está o código com o qual estou trabalhando:
import numpy as np
import matplotlib.animation as animation
from matplotlib import pyplot as plt
numbers = [[6.166, 5.976, 3.504, 7.104, 5.14],
[7.472, 5.888, 3.264, 6.4825, 7.168],
[7.5716, 9.936, 3.6, 8.536, 2.808],
[2.604, 2.296, 0.0, 6.144, 4.836],
[7.192, 4.932, 0.0, 6.016, 8.808],
[7.192, 5.5755, 3.694, 9.376, 9.108],
[7.63616, 5.912, 3.968, 6.672, 3.192],
[3.41049, 5.44, 4.004, 7.212, 3.6954],
[4.3143, 6.364, 3.584, 7.44, 5.78],
[4.992, 3.9692, 4.272, 0.0, 2.528]]
numbers = np.array(numbers)
colors = ["yellow", "red", "purple", "blue", "green"]
explode = [0.01, 0.01, 0.01, 0.01, 0.01]
labels = ["DM", "Bard", "Warlock", "Paladin", "Ranger"]
z = np.array([0,0,0,0,0]).astype(np.float)
fig,ax = plt.subplots()
y = []
def update(num):
global y
global z
ax.clear()
ax.axis('equal')
z += numbers[num]
y.append(z)
#output of different vairables#
print(num, z, sum(z), len(y))
pie = ax.pie(z, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=140)
ax.set_title(sum(z))
ani = animation.FuncAnimation(fig, update, frames=range(10), repeat=False)
ani.save('test.gif', writer='pillow', fps=1)
A saída da print()função é semelhante a esta:
0 [6.166 5.976 3.504 7.104 5.14 ] 27.89 1
0 [12.332 11.952 7.008 14.208 10.28 ] 55.78 2
1 [19.804 17.84 10.272 20.6905 17.448 ] 86.05450000000002 3
2 [27.3756 27.776 13.872 29.2265 20.256 ] 118.5061 4
3 [29.9796 30.072 13.872 35.3705 25.092 ] 134.3861 5
4 [37.1716 35.004 13.872 41.3865 33.9 ] 161.3341 6
5 [44.3636 40.5795 17.566 50.7625 43.008 ] 196.27959999999996 7
6 [51.99976 46.4915 21.534 57.4345 46.2 ] 223.65975999999995 8
7 [55.41025 51.9315 25.538 64.6465 49.8954 ] 247.42165 9
8 [59.72455 58.2955 29.122 72.0865 55.6754 ] 274.90395 10
9 [64.71655 62.2647 33.394 72.0865 58.2034 ] 290.66515 11
0 [70.88255 68.2407 36.898 79.1905 63.3434 ] 318.55514999999997 12
Os shows de saída de impressão que numbers[0]está sendo adicionado a si mesmo antes de os numiteradoras aumenta em 1. Depois disso, ele funciona como pretendido, onde numbers[1]através numbers[9]são somados. Mas, novamente, numbers[0]é adicionado numbers[9]por algum motivo.
O primeiro quadro do GIF resultante exibe esses dados: [12.332 11.952 7.008 14.208 10.28 ] 55.78e o último quadro exibe esses dados: o [64.71655 62.2647 33.394 72.0865 58.2034 ] 290.66515que está certo, pois é aqui que o loop deve parar.
Eu gostaria de saber o que estou fazendo de errado neste caso; como posso corrigir o comportamento inesperado de num?
Respostas
Sem um init_func=passado para FuncAnimation, ele usará a própria função de animação como o estado inicial, o que causa o seu dupleto 0. A documentação afirma :
init_func: chamável, opcional
Uma função usada para desenhar um quadro claro. Se não for fornecido, os resultados do desenho do primeiro item na sequência de quadros serão usados. Esta função será chamada uma vez antes do primeiro quadro.
Você pode simplesmente passar uma função vazia para corrigir o problema.
def init():
pass
(...)
ani = animation.FuncAnimation(fig, update, frames=range(10), init_func=init, repeat=False)