【问题标题】:FuncAnimation being called too many timesFuncAnimation 被调用太多次
【发布时间】:2020-11-08 22:34:35
【问题描述】:

这是previous question I asked 的延续。我注意到用于更新我的饼图的值不正确。我有一个列表z,正在使用名为update 的FuncAnimation 函数中的num 迭代器进行更新。这是我正在使用的代码:

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)

print() 函数的输出如下所示:

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

打印输出显示numbers[0] 被添加到自身之前 num 迭代器增加 1。之后,它按预期工作,numbers[1]numbers[9] 是加在一起。但同样,numbers[0] 出于某种原因被添加到 numbers[9]

生成的 gif 的第一帧显示以下数据: [12.332 11.952 7.008 14.208 10.28 ] 55.78 最后一帧显示这个数据:[64.71655 62.2647 33.394 72.0865 58.2034 ] 290.66515 这没关系,因为这是循环应该停止的地方。

我想知道在这种情况下我做错了什么;如何纠正num 的意外行为?

【问题讨论】:

    标签: python numpy matplotlib matplotlib-animation


    【解决方案1】:

    如果没有将init_func= 传递给FuncAnimation,它将使用动画函数本身作为初始状态,这会导致您的双峰0The documentation states:

    init_func : 可调用的,可选的

    用于绘制清晰框架的函数。 如果没有给出,结果 将使用从帧序列中的第一项绘制。 该函数将在第一帧之前调用一次。

    您可以简单地传递一个空函数来解决问题。

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

    【讨论】:

    • 看我可以阅读和盯着文档,但仍然没有从中得到任何东西。但是,当像您这样的人在上下文中明确它的样子时,就会容易得多。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2019-09-11
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多