如何用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
相关产品推荐
相关产品推荐

