FuncAnimation étant appelé trop de fois
C'est la suite d'une question précédente que j'ai posée . J'ai remarqué que les valeurs utilisées pour mettre à jour mon graphique à secteurs étaient incorrectes. J'ai une liste zqui est mise à jour avec l' numitérateur dans ma fonction FuncAnimation nommée update. Voici le code avec lequel je travaille:
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)
La sortie de la print()fonction ressemble à ceci:
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
La sortie d'impression montre le qui numbers[0]est ajouté à lui-même avant que l' numitérateur n'augmente de 1. Après cela, il fonctionne comme prévu où à numbers[1]travers numbers[9]sont ajoutés ensemble. Mais encore une fois, numbers[0]s'ajoute numbers[9]pour une raison quelconque.
La première image du gif résultant affiche ces données: [12.332 11.952 7.008 14.208 10.28 ] 55.78et la dernière image affiche ces données: [64.71655 62.2647 33.394 72.0865 58.2034 ] 290.66515ce qui est normal puisque c'est là que la boucle doit s'arrêter.
J'aimerais savoir ce que je fais de mal dans ce cas; comment puis-je corriger le comportement inattendu de num?
Réponses
Sans init_func=passer à FuncAnimation, il utilisera la fonction d'animation elle-même comme état initial, ce qui provoque votre doublet 0. La documentation déclare :
init_func: appelable, facultatif
Une fonction utilisée pour dessiner un cadre clair. Sinon, les résultats du dessin à partir du premier élément de la séquence d'images seront utilisés. Cette fonction sera appelée une fois avant la première image.
Vous pouvez simplement passer une fonction vide pour résoudre le problème.
def init():
pass
(...)
ani = animation.FuncAnimation(fig, update, frames=range(10), init_func=init, repeat=False)