如何制作在网格上移动的点的动画而不使其变成一条线?

问题描述 投票:0回答:1

我有两组 x,y 坐标,描述了两颗行星随时间绕太阳运行的运动。我的作业要求我使用 Matplotlib 在 Python 中为这些数据制作动画,但我的教学大纲并没有很好地涵盖它。我已经在MatPlotLib 的文档的帮助下成功制作了轨迹动画,但我无法在行星的当前位置显示移动点:

import matplotlib.pylab as plt
import matplotlib.animation as animation

earthx = planetRs[0][0] #these are arrays of x and y coordinates of Earth and Mars
earthy = planetRs[0][1]
marsx = planetRs[2][0]
marsy = planetRs[2][1]


fig, ax = plt.subplots()

line1 = ax.plot(marsx[0], marsy[0], label='Mars')[0]
line2 = ax.plot(earthx[0], earthy[0], label='Earth')[0]
ax.set(xlim=[-2, 2], ylim=[-2, 2], xlabel='X position', ylabel='Y position')
ax.legend()

def update(frame):
    line1.set_xdata(marsx[:frame])
    line1.set_ydata(marsy[:frame])
    line2.set_xdata(earthx[:frame])
    line2.set_ydata(earthy[:frame])
    return line1, line2

ani = animation.FuncAnimation(fig=fig, func=update, frames=60, interval=30)
plt.close()
ani

每次我尝试时,它都会变成一条在每个 x,y 坐标处带有点的线。我希望这些点仅显示两个行星最近的 x,y 位置。有人可以帮我吗?

python matplotlib
1个回答
0
投票

您可以为地球和火星绘制单个点,然后将每个点的位置更新为当前帧坐标。

import matplotlib.pyplot as plt
import matplotlib.animation as animation

earthx = planetRs[0][0]
earthy = planetRs[0][1]
marsx = planetRs[2][0]
marsy = planetRs[2][1]

fig, ax = plt.subplots()

line1, = ax.plot([], [], 'bo', label='Earth')  # Earth
line2, = ax.plot([], [], 'ro', label='Mars')   # Mars
ax.set(xlim=[-2, 2], ylim=[-2, 2], xlabel='X position', ylabel='Y position')
ax.legend()
ax.grid(False)

def init():
    line1.set_data([], [])
    line2.set_data([], [])
    return line1, line2

def update(frame):
    line1.set_data(earthx[frame], earthy[frame])
    line2.set_data(marsx[frame], marsy[frame])
    return line1, line2

ani = animation.FuncAnimation(
    fig, update,
    frames=len(earthx),
    init_func=init,
    interval=30,
    blit=True,
)
plt.close()
ani

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.