You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单轴绘制不同时间间隔多动画:内行星轨道动画故障

行星轨道动画问题修复

问题现象

  • 运行动画时行星反复消失重现
  • 已设置点标记,但行星显示为线条
  • 单独绘制轨道时(除点线问题外)运行正常

问题原因分析

  1. 点标记显示为线条:初始化行星点时,错误地将x、y坐标放入同一列表,导致绘制出线条而非单点;且未显式设置linestyle='none',默认会保留线条绘制逻辑。
  2. 行星反复消失:使用多个独立FuncAnimation实例更新行星,blit=True模式下多个动画的重绘区域互相覆盖,导致部分行星被清除;同时不同interval设置会造成运动节奏混乱。

修正后的代码

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
from math import cos, sin, radians

# 轨道参数示例(根据实际需求替换)
a_mercury, b_mercury = 0.004, 0.0038
a_venus, b_venus = 0.007, 0.0068
a_earth, b_earth = 0.01, 0.0099
a_mars, b_mars = 0.015, 0.0147

# 初始位置坐标
r_zerox_mercury, r_zeroy_mercury = a_mercury, 0
r_zerox_venus, r_zeroy_venus = a_venus, 0
r_zerox_earth, r_zeroy_earth = a_earth, 0
r_zerox_mars, r_zeroy_mars = a_mars, 0

# 行星轨道周期比例(水星:金星:地球:火星 ≈ 88:225:365:687)
period_ratios = [88, 225, 365, 687]
max_period = max(period_ratios)

# 椭圆坐标计算函数
def ellipse_mercury(phi):
    return a_mercury * cos(phi), b_mercury * sin(phi)

def ellipse_venus(phi):
    return a_venus * cos(phi), b_venus * sin(phi)

def ellipse_earth(phi):
    return a_earth * cos(phi), b_earth * sin(phi)

def ellipse_mars(phi):
    return a_mars * cos(phi), b_mars * sin(phi)

fig, ax = plt.subplots()
ax.axis([-0.016, 0.016, -0.016, 0.016])
ax.set_aspect('equal')  # 保持坐标轴比例一致,避免轨道变形

# 绘制太阳
plt.plot(0, 0, marker='o', color='yellow', markersize=8, linestyle='none')

# 初始化行星点:正确传入x/y坐标,设置无线条仅显示标记
point_mercury, = plt.plot(r_zerox_mercury, r_zeroy_mercury, marker='o', color='gray', markersize=4, linestyle='none')
point_venus, = plt.plot(r_zerox_venus, r_zeroy_venus, marker='o', color='orange', markersize=5, linestyle='none')
point_earth, = plt.plot(r_zerox_earth, r_zeroy_earth, marker='o', color='blue', markersize=5, linestyle='none')
point_mars, = plt.plot(r_zerox_mars, r_zeroy_mars, marker='o', color='red', markersize=4, linestyle='none')

# 绘制所有轨道
t = np.linspace(0, 360, 360)
x1 = a_mercury * cos(radians(t))
y1 = b_mercury * sin(radians(t))
plt.plot(x1, y1, color='gray', linewidth=0.5)

x2 = a_venus * cos(radians(t))
y2 = b_venus * sin(radians(t))
plt.plot(x2, y2, color='orange', linewidth=0.5)

x3 = a_earth * cos(radians(t))
y3 = b_earth * sin(radians(t))
plt.plot(x3, y3, color='blue', linewidth=0.5)

x4 = a_mars * cos(radians(t))
y4 = b_mars * sin(radians(t))
plt.plot(x4, y4, color='red', linewidth=0.5)

# 统一更新函数:同时更新所有行星位置
def update_all(frame):
    # 按周期比例计算各行星当前角度
    phi_mercury = 2 * np.pi * frame / period_ratios[0]
    phi_venus = 2 * np.pi * frame / period_ratios[1]
    phi_earth = 2 * np.pi * frame / period_ratios[2]
    phi_mars = 2 * np.pi * frame / period_ratios[3]
    
    # 更新行星坐标
    point_mercury.set_data(*ellipse_mercury(phi_mercury))
    point_venus.set_data(*ellipse_venus(phi_venus))
    point_earth.set_data(*ellipse_earth(phi_earth))
    point_mars.set_data(*ellipse_mars(phi_mars))
    
    return point_mercury, point_venus, point_earth, point_mars

# 创建单个动画实例管理所有元素
ani = FuncAnimation(fig, update_all, interval=50, blit=True, repeat=True,
                    frames=np.arange(0, max_period, 1))

plt.show()

关键修复说明

  • 点标记显示修复:将x、y坐标分开传入plt.plot(),添加linestyle='none'参数强制仅显示标记点
  • 行星消失修复:用单个更新函数统一管理所有行星的位置更新,通过一个FuncAnimation实例完成重绘,避免多动画冲突
  • 额外优化:添加ax.set_aspect('equal')保证轨道显示为正椭圆;按真实周期比例设置行星运动速度,增强动画真实性

内容的提问来源于stack exchange,提问作者Mark Sanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:14:58