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

如何移除Matplotlib 3D绘图中绘图与窗口的边距以完整显示太阳系轨道

如何移除Matplotlib 3D绘图中绘图与窗口的边距以完整显示太阳系轨道

我看到你在做3D太阳系模型时遇到了轨道被左右截断的问题,而且尝试了subplots_adjust也没解决,咱们一步步来排查和修复:

首先,先揪出你代码里的一个关键错误:你的set_axis_limits方法中,设置轴范围的代码写错了!

你现在的代码是:

self.ax.set_xlim([size_koordsystem, size_koordsystem])
self.ax.set_ylim([size_koordsystem, size_koordsystem])
self.ax.set_zlim([size_koordsystem,size_koordsystem])

这相当于把x/y/z轴的上下限都设置成了同一个值(比如100),也就是说轴的范围是[100,100],等于没有有效范围,轨道的左侧(x负方向)自然会被完全截断!

第一步:修复轴范围的错误

把轴范围改成从负到正的区间,这样轨道的左右两侧才能进入可视范围:

def set_axis_limits(self, size_koordsystem):
    self.ax.set_box_aspect([1, 1, 1])
    # 修正:设置从 -size 到 size 的完整范围
    self.ax.set_xlim([-size_koordsystem, size_koordsystem])
    self.ax.set_ylim([-size_koordsystem, size_koordsystem])
    self.ax.set_zlim([-size_koordsystem, size_koordsystem])
    return self.ax

第二步:解决窗口边距问题

你用了fig.subplots_adjust(left=0, right=1, top=1, bottom=0)但没生效,核心原因是你设置了set_box_aspect([1,1,1])(强制3D轴为正立方体),同时你的figsize是16:9的宽屏比例——Matplotlib为了保持立方体的正确比例,会自动在左右留出空白。解决这个问题有两种思路:

方案1:使用正方形的figsize

把create_fig里的figsize改成正方形,比如(10,10),这样正立方体的3D轴可以刚好填满窗口,不会有边距:

def create_fig(self, facecolor, figsize=(10, 10)):
    self.fig = plt.figure(facecolor=facecolor, figsize=figsize)
    self.ax = self.fig.add_subplot(111, projection='3d')
    self.ax.set_facecolor(facecolor)
    return self.fig, self.ax

方案2:保持宽屏比例,调整box_aspect

如果你想保留16:9的窗口比例,可以修改set_box_aspect的参数,让3D轴的宽高比匹配窗口比例,同时调整y/z轴的范围避免球体变形:

def set_axis_limits(self, size_koordsystem):
    # 匹配16:9的窗口比例
    self.ax.set_box_aspect([16, 9, 9])
    self.ax.set_xlim([-size_koordsystem, size_koordsystem])
    # 按比例缩小y/z轴范围,保证球体不变形
    self.ax.set_ylim([-size_koordsystem*9/16, size_koordsystem*9/16])
    self.ax.set_zlim([-size_koordsystem*9/16, size_koordsystem*9/16])
    return self.ax

第三步:优化小细节

你在绘制行星的时候,代码里有个变量覆盖的小问题,建议重命名变量避免覆盖原列表元素:

for planet in planets:
    r_planet = planet[5] * scale_sphere
    a_planet = planet[1]
    # 重命名变量,避免覆盖原列表中的行星数据
    planet_sphere = sphere(r_planet * np.linspace(0, 2 * np.pi, 100), r_planet * np.linspace(0, np.pi, 100))
    planet_sphere.plot_sphere(ax, 4, 4, 'r', 0.5, x_offset=a_planet*scale_distance)

把这些修改整合后,你的3D太阳系就能完整显示轨道,同时窗口也不会有多余的边距了。

备注:内容来源于stack exchange,提问作者Silas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:33:05