gpt4 book ai didi

python - 升级到 matplotlib 3.3.2 时动画停止工作

转载 作者:行者123 更新时间:2023-12-03 19:01:50 28 4
gpt4 key购买 nike

我有一段用于最近停止工作的动画可视化的 Python 代码。我已经跟踪到从 matplotlib 升级的问题3.2.2 至 3.3.2。我比较了 matplotlib 的文档3.2.2 和 3.3.2,主要变化是示例中的 HMTLAnimationWriter 和勘误表。我看不出为什么我的代码应该停止工作。
我提出了一个 bug report at matplotlib
A) 预期行为
帖子末尾的代码在 y 方向上上下移动一条线。它通过 matplotlib 成功地做到了这一点。 3.2.2,但不是 3.3.2。这在不同的设置中是可重现的。
enter image description here
B) 问题
当我使用 matplotlib 3.3.2,一个空的图形打开。
output with matplotlib 3.3.2
当我使用 python test.py 从命令行(例如 matplotlib )运行代码时3.2.2., 我没有 Depreciation Warning ,或任何其他错误消息。类似 matplotlib 3.3.2.这已经过测试

  • C1:带有 Asrock Z3​​70 P4、Nvidia 1050 Ti、i5-8600K 的台式机。
    测试:
  • Python:3.8.3,matplotlib:3.2.2 好的
  • Python: 3.8.3, matplotlib: 3.3.2 ( 有问题 )

  • C2:Acer Spin 5 SP513-52N 笔记本电脑。
    测试:
  • Python:3.8.3,matplotlib:3.2.2 好的
  • Python: 3.8.3, matplotlib: 3.3.2 ( 有问题 )

  • 根据用户评论:
    测试:
  • Win 10,Python:3.8.3,matplotlib:3.3.2( 有问题 )
  • Ubuntu 20.04,Python:3.8.3,matplotlib:3.1.2 OK
  • Ubuntu 20.04,Python:3.8.3,更新到 matplotlib:3.3.2( 有问题 )


  • 在我的两种情况下,升级时出现问题,降级时问题消失。所以,我的猜测是问题出在 matplotlib 3.3.2.
    有趣的一点是,如果我使用 Pillowriter 创建动画 gif,生成的 gif 在 matplotlib 的所有版本中都按预期执行。 .
    问题
  • 这是 API 的错误还是功能?
  • 如果它是一个功能,新推荐的动画方法是什么(最好具有向后兼容性)。貌似,不是全部FuncAnimation()命令受到影响。 This works with matplotlib 3.3.2.
  • 如果它是一个错误,是否有解决方法?

  • 代码
    我包含了一个 MCVE 代码,它重现了主要问题并适用于 matplotlib 3.2.2,但不是 3.3.2。
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import animation

    def create_animated_plot(xs, niter, xlim =(-1.5, 1.5), ylim = [-3, 3]):

    line_coords = np.vstack(( np.array([-1,1]), np.array([0,0]) ))

    boxData = [np.array([np.zeros(niter), xs])]

    fig, ax1 = plt.subplots(1,1)
    line, = ax1.plot([], [], lw=2)
    ax1.set_ylabel('position')
    ax1.set_ylim(ylim)
    ax1.set_xlim(xlim)

    lines = [ax1.plot([],[],lw=2,color="black")[0]]

    def init():
    lines[0].set_data([],[])
    return lines

    def animate(i):
    xs = [boxData[0][0, i]]
    ys = [boxData[0][1, i]]

    lines[0].set_data(line_coords[0,:]+xs[0], line_coords[1,:]+ys[0])
    return lines

    anim = animation.FuncAnimation(fig, animate, init_func=init,
    frames=niter, interval=10, blit=True)


    niter = 1001
    t = np.linspace(0,10,niter)

    create_animated_plot(xs =np.sin(t), niter=niter)
    plt.show()


    附加信息
    以下是我的原始代码中的图像(我在这篇文章中将其简化为 MCVE 代码):
  • 原始代码工作示例的动画 gif:此图中有两个动画(顶部子图:框上下移动,底部:红线穿过图)。

  • - [animated gif or working example of original code]( /image/SLYn7.gif)
  • matplotlib 3.3.2 输出的 png:两个动画都不会表现出预期的行为。顶部甚至不会绘制框。在底部的子图中,第一帧的红线将被绘制,但随后它不会移动。

  • - [png of the output with matplotlib 3.3.2]( /image/wRO90.png)
    请注意,此处发布的 MCVE 代码仅创建了两个图形的上框,并显示了一 strip 有 matplotlib 的弹跳线。 ≤3.2.2,但带有 matplotlib 的空帧3.3.2.

    最佳答案

    问题是 gc 现在更积极地收集对动画对象的引用。这与bug有关
    一个简单的解决方法是传递引用,如:

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

    def create_animated_plot(xs, niter, xlim =(-1.5, 1.5), ylim = [-3, 3]):

    line_coords = np.vstack(( np.array([-1,1]), np.array([0,0]) ))

    boxData = [np.array([np.zeros(niter), xs])]

    fig, ax1 = plt.subplots(1,1)
    line, = ax1.plot([], [], lw=2)
    ax1.set_ylabel('position')
    ax1.set_ylim(ylim)
    ax1.set_xlim(xlim)

    lines = [ax1.plot([],[],lw=2,color="black")[0]]

    def init():
    lines[0].set_data([],[])
    return lines

    def animate(i):
    xs = [boxData[0][0, i]]
    ys = [boxData[0][1, i]]

    lines[0].set_data(line_coords[0,:]+xs[0], line_coords[1,:]+ys[0])
    return lines

    anim = animation.FuncAnimation(fig, animate, init_func=init,
    frames=niter, interval=10, blit=True)
    return anim # return anim object reference ########################################################

    niter = 1001
    t = np.linspace(0,10,niter)

    anim = create_animated_plot(xs =np.sin(t), niter=niter) # assign to variable ###########################
    plt.show()
    如果你有一个类,你也可以将动画对象分配给 self.
    注意 : 如果没有 Mr. T 的帮助和耐心,我不可能想出这个答案。

    关于python - 升级到 matplotlib 3.3.2 时动画停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64561779/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com