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

