当前位置: 首页 > 面试题库 >

FuncAnimation不显示在函数外部

葛言
2023-03-14
问题内容

我在此线程上给出了答案,并讨论了matplotlib上的衰落点。我对ImportanceOfBeingErnest的答案感到好奇。因此,我尝试使用他的代码。

首先,这是我的代码。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation
from matplotlib.colors import LinearSegmentedColormap

def get_new_vals():
    x = 0
    y = 0
    while True:
        if x >= .9:
            x = 0
            y = 0
        x += .1
        y += .1
        yield x, y

def update(t, x_vals, y_vals, intensity, scatter, gen):
    #   Get intermediate points
    new_xvals, new_yvals = gen.next()
    x_vals.extend([new_xvals])
    y_vals.extend([new_yvals])

    #   Put new values in your plot
    scatter.set_offsets(np.c_[x_vals, y_vals])

    #   Calculate new color values
    for index in range(len(intensity)):
        if intensity[index] < .1:
            intensity[index] = 0
        intensity[index] *= .6
    intensity.extend(1 for _ in xrange(len([new_xvals])))

    intens_dup = np.array(intensity)

    """
    intensity = np.concatenate((np.array(intensity) * .6, np.ones(len(new_xvals))))
    """
    scatter.set_array(intens_dup)

    # Set title
    axis.set_title('Time: %0.3f' % t)

def anim_random_points(fig, axis):
    x_vals = []
    y_vals = []
    intensity = []
    iterations = 100

    colors = [ [0, 0, 1, 0], [0, 0, 1, 0.5], [0, 0.2, 0.4, 1] ]
    cmap = LinearSegmentedColormap.from_list("", colors)
    scatter = axis.scatter(x_vals, y_vals, c=[], cmap=cmap, vmin=0, vmax=1)

    gen_values = get_new_vals()

    ani = matplotlib.animation.FuncAnimation(fig, update, frames=iterations,
        interval=50, fargs=(x_vals, y_vals, intensity, scatter, gen_values),
        repeat=False)

    #   Position 1 for plt.show()
    plt.show()

if __name__ == '__main__':

    fig, axis = plt.subplots()
    axis.set_xlabel('X Axis', size = 12)
    axis.set_ylabel('Y Axis', size = 12)
    axis.axis([0,1,0,1])

    anim_random_points(fig, axis)

    #   Position 2 for plt.show()
    # plt.show()

然后,我注意到了一件奇怪的事。至少对于我来说。注意Position 1Position 2(在代码末尾)。位置1放置在animation函数之后,另一个放置 代码 ,因为函数在位置1之后结束,因此转到位置2。

由于FuncAnimation需要figure运行动画,所以我想知道为什么plt.show()在位置1而不是位置2上可以工作。


问题答案:

该matplotlib文档约州FuncAnimation

保留对实例对象的引用至关重要。动画由计时器(通常来自主机GUI框架)推进,该动画对象持有唯一的引用。如果不保留对Animation对象的引用,则将对其进行垃圾回收(并因此而对计时器进行引用),这将停止动画。

如果将其放置plt.show()anim_random_points函数之外,则将ani保留垃圾内容,该变量保留了对动画的引用,并且将不再显示动画。

这种情况的解决方案是从该函数返回动画

def anim_random_points(fig, axis):
    # ...
    ani = matplotlib.animation.FuncAnimation(...)
    return ani

if __name__ == '__main__':
    # ...
    ani = anim_random_points(...)
    plt.show()


 类似资料:
  • 我已经创建了3秒的超时功能,在此之后,它应该呈现超文本标记语言。我按照官方的留档来做这件事,代码就像在留档上一样。有人有类似的问题吗?

  • 所以几天前,我安装了vscode来处理Unity游戏引擎脚本,然而,即使我安装了C#扩展,它也不会显示每个函数的参数,例如,如果我编写一个函数,vscode没有显示我应该把什么样的参数放在括号里。我怎样才能让它这样做? 比如说,在我编写的代码中,它不会显示的参数: 此外,每当我从Unity项目加载脚本时,vscode都会显示此错误: 错误图像

  • 我有以下代码: 基本上,当我运行上述代码时,总金额的总和应该是,但取而代之的是'1.60E 4。请告知我在这里错过了什么,以获得正确的金额?

  • 类是类测试 方法有[public static void test.main(java.lang.String[])抛出java.lang.ClassNotFoundException,public final native void java.lang.Object.Wait(long)抛出java.lang.InterruptedException,public final void java

  • 我的数据确实显示在console.log中,但实际上没有显示在表中,我在这里做错了什么?

  • 我创建了一个调查页面,但是当有人没有学分时,我想使用react-通知向用户显示通知,我已经测试了这个按钮,并且它可以独立工作,但是当我在onClark事件中使用react-router-dom将其添加到标签中时,函数运行,但通知不显示。这是代码: 所以,当我在上面测试时: 它显示按钮,单击时不显示信用,它会记录0信用,但是,它只是重定向到引用的页面,而不显示创建的通知。 在我这边,无论是终端还是控