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

动画在Matplotlib上不起作用

濮阳鸿卓
2023-03-14
问题内容

我正在尝试使形状的动画随着样本大小的增加(从100增加到1000)而呈指数分布。还有一个滑块,用于配置发行版的lambda参数,以及一个用于启动动画的按钮。

我的问题是,即使布局得到渲染,当我按下开始按钮时也没有动画发生。到目前为止,这是我的尝试:

为了简化起见,我在Python笔记本中运行它:

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

n0 = 100
n1 = 1000

#Create figure object
fig, ax = plt.subplots(1,1)
plt.subplots_adjust(bottom=0.3)

#Create Sliders for parameters
axlam = plt.axes([0.20, 0.05, 0.20, 0.03], facecolor=axcolor)

slam = Slider(axlam, 'Exp lambda', 0, 5, valinit=1)

#Default distributions
dexp = np.random.exponential(1, n1)

#Updates distributions when sliders are changed
def updateDist(val):
    lam = slam.val
    dexp = np.random.exponential(lam, n1)

slam.on_changed(updateDist)

#updates plot on FuncAnimation call
def update(curr):
    if( curr == (n1-n0) ):
        a.event.source.stop()
    plt.cla()
    bins_exp = np.arange(0,4/slam.val,0.25)
    ax.hist(dexp[:(n0+curr)],bins=bins_exp)
    ax.set_title('Exp n={}'.format(n0+curr))

#Define Start button and function to start animation
goax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(goax, 'Start', color=axcolor, hovercolor='0.975')

a = None
def start(event):
    a = animation.FuncAnimation(fig,update,interval=100)
button.on_clicked(start)

问题答案:

您应该注意函数的名称空间。

考虑

a = 0
def f():
    a = 1
f()
print(a) # will print 0

因此,您需要处理实际对象,而不是它们的某些本地副本。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.widgets import Slider, Button

n0 = 100
n1 = 1000

#Create figure object
fig, ax = plt.subplots(1,1)
plt.subplots_adjust(bottom=0.3)

#Create Sliders for parameters
axcolor = "skyblue"
axlam = plt.axes([0.20, 0.05, 0.20, 0.03], facecolor=axcolor)

slam = Slider(axlam, 'Exp lambda', 0, 5, valinit=1)

#Default distributions
dexp = [np.random.exponential(1, n1)]

##Updates distributions when sliders are changed
def updateDist(val):
    lam = slam.val
    dexp[0] = np.random.exponential(lam, n1)

slam.on_changed(updateDist)

#updates plot on FuncAnimation call
def update(curr):
    if( curr == (n1-n0) ):
        a.event.source.stop()
    ax.clear()
    bins_exp = np.arange(0,4/slam.val,0.25)
    ax.hist(dexp[0][:(n0+curr)],bins=bins_exp)
    ax.set_title('Exp n={}'.format(n0+curr))
    fig.canvas.draw_idle()

#Define Start button and function to start animation
goax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(goax, 'Start', color=axcolor, hovercolor='0.975')

a = [0]
def start(event):
    a[0] = animation.FuncAnimation(fig,update,interval=100)
button.on_clicked(start)

plt.show()


 类似资料:
  • 问题内容: 我在正在翻译动画的UILabel上有一个轻击手势。动画期间,只要在标签上轻按,轻按手势就不会有响应。 这是我的代码: 手势代码: 有任何想法吗?谢谢 :) 问题答案: 使用Tapgesture后,您将无法完成自己的工作,原因有1个。手势与标签的框架相关联。开始动画时,标签的最后一帧立即更改,而您只是在观看假电影(动画)。如果您能够触摸屏幕上的(0,900),它将在发生动画时照常触发。不

  • 问题内容: 我设置了一个动画,可以在Chrome 上正常运行,但是不能在Safari(IOS9 iPhone或9-El Capitan)上运行,也不能在Firefox上运行。 问题答案: @asimovwasright的答案是正确的。 为了避免在CSS上发生太多重复,我将SCSS与一起使用,以遍历所有可用范围(在本例中为8) 和HTML:

  • 我有一个由< code > RealmRecyclerViewAdapter 填充的< code > recycle view ,但不知何故,当数据更改时,没有动画播放。adapter类为不同的布局使用多个< code > view holder ,但这不应该影响动画,对吗? 用于设置 和适配器的代码如下所示: 将数据绑定到适配器的代码如下所述: 自动更新工作正常,但不知何故没有数据更改时没有动画

  • 问题内容: 自从升级matplotlib以来,每当尝试创建图例时都会出现以下错误: 这种情况甚至发生在像这样的琐碎脚本中: 我发现错误的链接使我对诊断错误的来源毫无用处。 问题答案: 您应该添加逗号: 需要使用逗号的原因是,无论实际上从命令中创建了多少个对象,plt.plot()返回一个行对象的元组。如果没有逗号,则“ plot1”和“ plot2”是元组而不是行对象,从而使以后对plt.lege

  • 问题内容: 我有一个按钮,该按钮调用animateWithDuration代码,以淡出图像,淡入文本和in的新bg颜色,然后将其重置为正常值。动画需要几秒钟才能完成,效果很好。 然而! 有一个问题: 有时在动画结束之前会再次按下此按钮。发生这种情况时,我希望当前的动画停止并重新开始。 研究解决方案不起作用 根据我的阅读,解决方案应该很简单,只需导入QuartzCore并添加: 这确实删除了动画,但

  • 不透明度在打开和关闭时都有效,高度变化仅在打开时有动画效果,在关闭时没有动画效果。 下面是我的代码,但一直没有成功。 查询了各种方案