matplotlib 函数动画:无法同时为点和线设置动画

9ceoxa92  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(167)

我正在尝试制作一个动画来展示简谐振子的行为,我希望这个动画是下面两个图的组合,也就是说,我希望红色的方块上下移动,而在同一个图上,我希望蓝色的线逐渐显示。
Red squareLine
这就是我遇到的问题。我不能让我的代码同时为它们制作动画
这是我用来让方块上下移动的代码

%matplotlib notebook
import itertools
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

plt.rcParams["figure.figsize"] = 9,6

x_0, v_0, k, m = 1,2,1,2
omega = np.sqrt(k/m)

def HA(t):
    xt = x_0*np.cos(omega*t) + (v_0/omega)*np.sin(omega*t)
    return np.array([t, xt])

# create a figure with an axes
fig, ax = plt.subplots()
# set the axes limits
ax.axis([0.0,50,-4,4])

# create a point in the axes
point, = ax.plot(0,x_0, marker="s", color = 'red', markersize=20)

t_vector = np.linspace(0,50, 100)
xt_vector = x_0*np.cos(omega*t_vector) + (v_0/omega)*np.sin(omega*t_vector)

# Updating function, to be repeatedly called by the animation
def update(t):
    #Point coordinates 
    t,xt = HA(t)
    point.set_data([0],[xt])
    return point

ani = animation.FuncAnimation(fig, update, interval=500, blit=True, repeat=True,frames=t_vector.size)
                    
plt.axhline(y=0.0, color='black', linestyle='--', label = "Equilibrium")
plt.xlabel(r'$t$', fontsize=18)
plt.ylabel(r"$x(t)$", fontsize=16)
plt.legend()

#ani.save('Square.mp4', writer = 'ffmpeg', fps = 10)
plt.show()

这是我用来写这行代码的

plt.rcParams["figure.figsize"] = 9,6

x_0, v_0, k, m = 1,2,1,2
omega = np.sqrt(k/m)

def HA(t):
    xt = x_0*np.cos(omega*t) + (v_0/omega)*np.sin(omega*t)
    return np.array([t, xt])

# create a figure with an axes
fig, ax = plt.subplots()
# set the axes limits
ax.axis([0.0,50,-4,4])

line, = ax.plot([], [], color="blue")

t_vector = np.linspace(0,50, 100)
xt_vector = x_0*np.cos(omega*t_vector) + (v_0/omega)*np.sin(omega*t_vector)

# Updating function, to be repeatedly called by the animation
def update(t):
    line.set_data(t_vector[:t], xt_vector[:t])
    return line

ani = animation.FuncAnimation(fig, update, interval=500, blit=True, repeat=True,frames=t_vector.size)
                    
plt.axhline(y=0.0, color='black', linestyle='--', label = "Equilibrium")
plt.xlabel(r'$t$', fontsize=18)
plt.ylabel(r"$x(t)$", fontsize=16)
plt.legend()

#ani.save('Line.mp4', writer = 'ffmpeg', fps = 10)

plt.show()

我试着把它们结合起来,但是虽然这不会给予任何错误,但得到的图不会移动。我是一个新手,当谈到动画与matplotlib,我检查了类似的问题,我可以找到,但没有帮助我。我不能扩展他们的答案,以获得对我有用的东西。

plt.rcParams["figure.figsize"] = 9,6

x_0, v_0, k, m = 1,2,1,2
omega = np.sqrt(k/m)

def HA(t):
    xt = x_0*np.cos(omega*t) + (v_0/omega)*np.sin(omega*t)
    return np.array([t, xt])

# create a figure with an axes
fig, ax = plt.subplots()
ax.axis([0.0,50,-4,4])

# create a point in the axes
point, = ax.plot(0,x_0, marker="s", color = 'red', markersize=20)
line, = ax.plot([], [], color="blue")

t_vector = np.linspace(0,50, 100)
xt_vector = x_0*np.cos(omega*t_vector) + (v_0/omega)*np.sin(omega*t_vector)

# Updating function, to be repeatedly called by the animation
def update(t):
    t,xt = HA(t)
    line.set_data(t_vector[:t], xt_vector[:t])
    point.set_data([0],[xt])
    return line, point

ani = animation.FuncAnimation(fig, update, interval=500, blit=True, repeat=True,frames=t_vector.size)
                    
plt.axhline(y=0.0, color='black', linestyle='--', label = "Equilibrium")
plt.xlabel(r'$t$', fontsize=18)
plt.ylabel(r"$x(t)$", fontsize=16)
plt.legend()

plt.show()

你能帮帮我吗?

cld4siwp

cld4siwp1#

我试着只把它们两者结合起来,但虽然这不会给予出任何错误,但由此产生的情节并没有移动。
在update函数中,在t, xt = HA(t)之后,t是一个浮点数。要使t_vector[:t]xt_vector[:t]工作,必须将其转换回整数值。

def update(t):
    t,xt = HA(t)
    t = int(t)
    line.set_data(t_vector[:t], xt_vector[:t])
    point.set_data([0],[xt])
    return line, point

请注意,HA()函数只返回xt值而不是np.array([t, xt])可能更有意义。
通过执行此小编辑,我获得了一个工作动画:

然而,假设红色矩形应该沿着Y轴沿着蓝线的尖端,这看起来不太好。
这是因为直线是根据xt_vector绘制的,矩形是根据xt值(由HA()函数返回)绘制的。两个公式相同,但t不同:在np.linspace(0, 50, 100)中为t计算xt_vector,而在np.range(0, nb_frame)中为t计算xt(这里nb_frame = 100)。
底线:按如下方式更改update函数应该有效

def update(t):
    line.set_data(t_vector[:t], xt_vector[:t])
    point.set_data([0], [xt_vector[t]])
    return line, point

相关问题