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

如何用Python的Matplotlib生成不重叠的3D轨道图与2D能量时序图?

解决Matplotlib子图重叠问题:3D卫星轨道图+2D能量变化图

问题描述

我需要绘制卫星轨道的3D图,以及总能量随时间变化的2D图。尝试使用matplotlib库的subplot功能实现,但效果不佳,当前代码运行后两个图表出现重叠问题。以下是我最新的代码:

import matplotlib.pyplot as plt
import numpy as np

# Create 3D plot of the satellite's orbit
fig, (ax1, ax2) = plt.subplots(2 , subplot_kw={"projection": "3d"})

# Create a sphere to represent the planet
u, v = np.mgrid[0:2*np.pi:100j, 0:np.pi:100j]
x = r_planet * np.cos(u) * np.sin(v)
y = r_planet * np.sin(u) * np.sin(v)
z = r_planet * np.cos(v)
ax1.plot_surface(x, y, z, cmap = 'gray', alpha=0.5)

# Plot Orbit
ax1.plot(r[:, 0], r[:, 1], r[:, 2])
ax1.set_xlabel('X (m)')
ax1.set_ylabel('Y (m)')
ax1.set_zlabel('Z (m)')
ax1.set_title('Satellite orbiting planet')

# Plot Energy
ax2 = fig.add_subplot()
ax2.plot(t, E)
ax2.set_xlabel('Time (s)')
ax2.set_ylabel('Total Energy (J)')
ax2.set_title('Total Energy of Satellite')

plt.show()

问题原因

代码存在两个核心问题导致子图重叠:

  • 初始化子图时,给两个子图都设置了projection="3d",但第二个能量图是2D类型,不需要3D投影,这会直接打乱布局逻辑
  • 后续调用fig.add_subplot()重新创建ax2,这会破坏原本的子图网格布局,直接在原有区域叠加新图

修正方案

调整子图初始化逻辑,只给第一个子图设置3D投影,直接使用已创建的ax2绘制2D能量图,并添加自动布局调整:

import matplotlib.pyplot as plt
import numpy as np

# 创建2行1列的子图网格,先指定整体布局
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 10))
# 单独给第一个子图设置3D投影
ax1 = plt.subplot(211, projection='3d')

# 绘制行星球体
u, v = np.mgrid[0:2*np.pi:100j, 0:np.pi:100j]
x = r_planet * np.cos(u) * np.sin(v)
y = r_planet * np.sin(u) * np.sin(v)
z = r_planet * np.cos(v)
ax1.plot_surface(x, y, z, cmap='gray', alpha=0.5)

# 绘制卫星轨道
ax1.plot(r[:, 0], r[:, 1], r[:, 2])
ax1.set_xlabel('X (m)')
ax1.set_ylabel('Y (m)')
ax1.set_zlabel('Z (m)')
ax1.set_title('Satellite orbiting planet')

# 绘制能量变化图(直接使用初始化时的ax2对象)
ax2.plot(t, E)
ax2.set_xlabel('Time (s)')
ax2.set_ylabel('Total Energy (J)')
ax2.set_title('Total Energy of Satellite')

# 自动调整子图间距,避免标签和标题重叠
plt.tight_layout()
plt.show()

关键调整点

  • 拆分3D投影设置:先创建2行1列的子图网格,再单独给第一个子图指定3D投影,避免影响第二个2D子图
  • 不再调用fig.add_subplot(),直接使用初始化阶段生成的ax2对象,保留原有布局结构
  • 添加plt.tight_layout()自动优化子图间距,解决标签、标题互相遮挡的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:48:27