我正在尝试对一维函数进行动画处理,其中函数输入相同,但函数参数随时间变化。我要设置动画的功能是
f(x)= sin(a * pi * x)/(b * x)+(x-1)^ 4
这里要绘制的数据是相同的,但是a,b每次更新都在变化。我正在使用python和matplotlib库。我最初的尝试如下:
fig,ax = plt.subplots()
line, = ax.plot([],[])
def animate(i,func_params):
x = np.linspace(-0.5,2.5,num = 200)
a=func_params[i][0]
b=func_params[i][1]
y=np.sin(a*math.pi*x)/b*x + (x-1)**4
line.set_xdata(x)
line.set_ydata(y)
return line,
ani = animation.FuncAnimation(fig,animate,frames=len(visualize_pop),fargs=(visualize_func,),interval = 100,blit=True)
plt.show()
上面的代码没有绘制任何内容。
编辑:基于注释更新了代码。
答案 0 :(得分:0)
您的问题是使用plot([],[])
时,您没有给matplotlib
数据,因此无法确定轴的极限。因此,它使用一些默认值,这些默认值超出了您实际要绘制的数据范围。因此,您有两种选择:
1)将限制设置为一些值,其中将包含所有情况下的所有绘制数据, 例如
ax.set_xlim([-0.5,2.5])
ax.set_ylim([-2,6])
2)让ax
每帧自动计算极限,并在动画函数中使用这两个命令来重新缩放图see here(请注意,只有关闭blitting后,此选项才能正常工作) :
ax.relim()
ax.autoscale_view()
这里仍然是您的代码的完整版本(解决方案(1)的命令已注释掉,我更改了一些表示法):
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
fig,ax = plt.subplots()
x = np.linspace(-0.5,2.5,num = 200)
line, = ax.plot([],[])
#ax.set_xlim([-0.5,2.5])
#ax.set_ylim([-2,6])
##assuming some parameters, because none were given by the OP:
N = 20
func_args = np.array([np.linspace(1,2,N), np.linspace(2,1,N)])
def animate(i,func_params):
a=func_params[0,i]
b=func_params[1,i]
y=np.sin(a*np.pi*x)/b*x + (x-1)**4
line.set_xdata(x)
line.set_ydata(y)
ax.relim()
ax.autoscale_view()
return line, ax
##blit=True will not update the axes labels correctly
ani = FuncAnimation(
fig,animate,frames=N, fargs=(func_args,),interval = 100 #, blit=True
)
plt.show()