【问题标题】:Python Matplotlib FuncAnimationPython Matplotlib FuncAnimation
【发布时间】:2013-08-06 14:47:47
【问题描述】:

尊敬的 StackOverfloooow 会员您好, 我无法理解 matplotlib 的 FuncAnimation 模块。你介意帮我一下吗?我有两个问题:

  1. 为什么initanimate函数在只返回PLOT后都需要逗号?
  2. 为什么我的代码没有更新time_text?如果我让它在每个动画之后打印 t,我会在控制台中正确添加一个,但文本不会在情节中更新。

.

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

fig = plt.figure()
sub = fig.add_subplot(111,xlim=(0, 10), ylim=(0, 1))
PLOT, = sub.plot([],[])
time_text = sub.text(1,1,"",transform = sub.transAxes, ha="right")
t = 0

def init():
    PLOT.set_data([],[])
    time_text.set_text("")
    return PLOT,time_text

def animate(i):
    global t
    x = np.linspace(0,10,1000)
    y = np.exp(- ((x-0.01*i)/(2))**2 )/np.sqrt(2*np.pi)
    t += 1

    PLOT.set_data(x,y)
    time_text.set_text("time = "+str(t))
    return PLOT, time_text

ani = animation.FuncAnimation(fig, animate, init_func=init, frames=2000, interval=20, blit=True)

plt.show()

【问题讨论】:

    标签: python animation matplotlib


    【解决方案1】:

    1) 不太清楚你的意思。在initanimate 中,您需要同时返回PLOTtime_text,所以用逗号分隔它们,这样每个函数都会返回一个元组。

    对于PLOT, = sub.plot([],[]) 中的“悬挂”逗号,sub.plot 返回一个包含单个元素的列表,即matplotlib.lines.Line2D 对象。 PLOT, 正在解压这个单元素列表。所以,你也可以这样做:

    PLOT = sub.plot([],[])[0]
    

    获取元素。

    2) 您的代码确实更新了time_text,您只是将其绘制在图形的边界之外。例如更改:

    time_text = sub.text(1,1,"",transform = sub.transAxes, ha="right")
    

    收件人:

    time_text = sub.text(1,0,"",transform = sub.transAxes, ha="right")
    

    让它显示在右下角,或0.5, 0.5 让它显示在屏幕中间。

    【讨论】:

    • 好的,我明白了,非常感谢。关于逗号的事情:例如,如果我完全省略时间显示而只返回新的绘图数据:return PLOT 我得到一个错误。但是,如果我返回 return PLOT, 它会起作用。这是为什么呢?
    • PLOT, 解压缩 PLOT 中的内容。在控制台上试试这个:a, = [1]。然后打印a
    【解决方案2】:

    其他答案并未完全回答第一个问题。

    initanimate 的return 语句仅在使用blit=True 时才严格需要。这些函数预计将返回一个可迭代的艺术家来更新动画。有两位艺术家,回报可能看起来像

    return artist1, artist2
    # or 
    return [artist1, artist2]
    

    如果要更新单个艺术家,则必须记住仍然需要一个可迭代对象。在单个艺术家之后使用逗号是使函数返回可迭代的最简单方法

    return artist1,
    # or 
    return [artist1]
    

    【讨论】:

      【解决方案3】:

      在 python 中,元组是使用括号和逗号编写的,例如(3,2) 这是一个2元组。 one tuple 将是 (2,),其长度为 1。这与 int 2 不同,后者根本没有定义长度。 注意:() 是内容为空的 0 元组。

      在这种情况下,函数返回一个长度为 1 的可枚举,所以 省略逗号将使 PLOT 成为可枚举的。带逗号 元组 PLOT 的内容,与返回值的内容相匹配。

      在赋值中可以省略括号,所以 PLOT, 与 (PLOT,) 相同。

      【讨论】:

        猜你喜欢
        • 2018-08-14
        • 1970-01-01
        • 2013-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        • 2015-01-09
        • 2013-09-15
        相关资源
        最近更新 更多