FuncAnimation wird zu oft aufgerufen

Nov 08 2020

Dies ist eine Fortsetzung einer früheren Frage, die ich gestellt habe . Ich habe festgestellt, dass die zum Aktualisieren meines Kreisdiagramms verwendeten Werte falsch waren. Ich habe eine Liste z, die mit dem numIterator in meiner FuncAnimation-Funktion mit dem Namen aktualisiert wird update. Hier ist der Code, mit dem ich arbeite:

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)

Die Ausgabe der print()Funktion sieht folgendermaßen aus:

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

Die Druckausgabe zeigt das an, numbers[0]was zu sich selbst hinzugefügt wird, bevor der numIterator um 1 erhöht wird. Danach funktioniert es wie beabsichtigt, wo numbers[1]durch numbers[9]addiert werden. Aber auch hier numbers[0]wird numbers[9]aus irgendeinem Grund hinzugefügt .

Der erste Frame des resultierenden Gifs zeigt diese Daten an: [12.332 11.952 7.008 14.208 10.28 ] 55.78und der letzte Frame zeigt diese Daten an: [64.71655 62.2647 33.394 72.0865 58.2034 ] 290.66515Dies ist in Ordnung, da hier die Schleife anhalten sollte.

Ich würde gerne wissen, was ich in diesem Fall falsch mache. Wie kann ich das unerwartete Verhalten von korrigieren num?

Antworten

2 DizietAsahi Nov 08 2020 at 22:51

Ohne init_func=Übergabe an FuncAnimationwird die Animationsfunktion selbst als Ausgangszustand verwendet, wodurch Ihr Dublett verursacht wird 0. In der Dokumentation heißt es :

init_func: aufrufbar, optional

Eine Funktion zum Zeichnen eines klaren Rahmens. Wenn nicht angegeben, werden die Ergebnisse des Zeichnens aus dem ersten Element in der Rahmensequenz verwendet. Diese Funktion wird einmal vor dem ersten Frame aufgerufen.

Sie können einfach eine leere Funktion übergeben, um das Problem zu beheben.

def init():
    pass

(...)

ani = animation.FuncAnimation(fig, update, frames=range(10), init_func=init, repeat=False)