使用Python 3.12,Matplotlib 3.9.2,
从高度 h=20(m) 开始,以给定的速度 v 向上抛物体 A,并放下物体 B,使其自由落体。空气阻力可以忽略不计。计算 v,使对象 A 在对象 B 和动画之后落到地面 dt =2 秒。 g = 9.81(米/秒2)
我一直在尝试使用“set_data”使用 matplotlib 对上述问题进行动画处理,但结果并不令人满意,因为保留了 A 的先前位置,这使得动画在一段时间后自行重叠。我想删除以前的数据,但我找不到任何功能来帮助它。
这是我使用过的代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
#Input Variables
h, g, dt= 20, 9.81, 2
#Calculated Variables
tmp = np.sqrt(2*h/g) + dt
v = 0.5*g*tmp - h/tmp
#Arrays
t = np.linspace(0, tmp , 100)
hA = h + v*t - 0.5*g*t**2
hB = h - 0.5*g*t**2
#Plot
fig, ax = plt.subplots()
plt.axis([0, 10, 0, 100])
ax.set_title("Physic 1")
plt.grid()
#Define object A and object B
A, = ax.plot([],[],"o",markersize=4,color="red")
B, = ax.plot([],[],"o",markersize=4,color="blue")
#Animation
def animate(frame):
A.set_data([2],hA[:frame])
B.set_data([6],hB[:frame])
return A,B
ani=FuncAnimation(fig, animate, frames=len(t)+2, interval=25, repeat =False)
plt.show()
当您使用
hA[:frame]
时,您会将所有点传递到索引 frame
。由于您只想要一个索引,因此您应该这样做 hA[frame]
。您需要将该结果包装在一个列表中,以便 y 是一个序列(否则您会收到注释中提到的错误)。最后,你会得到这个:
def animate(frame):
A.set_data([2], [hA[frame]])
B.set_data([6], [hB[frame]])
return A, B
这也可以使用散点图来完成,将相应的线更改为:
# the zorder argument puts the scatter points on top of the grid markings
A = ax.scatter([], [], s=16, color="red", zorder=2)
B = ax.scatter([], [], s=16, color="blue", zorder=2)
def animate(frame):
A.set_offsets([2, hA[frame]])
B.set_offsets([6, hB[frame]])
return A, B
最后,您的
hA
和 hB
数组与 t
的长度相同,因此帧数应该是 len(t)
,而不是 len(t)+2
。