如何使Matplotlib 3D绘图完全填满显示窗口?
如何让Matplotlib 3D绘图完全填满显示窗口
问题分析
你之前的操作要么只是等比例放大了画布(空白占比没变),要么用负边距强制拉伸导致绘图被截断——核心原因是Matplotlib的3D轴默认会预留视角空间,单纯调整画布尺寸或硬拉边距都会打破自动适配逻辑。
解决步骤
1. 匹配屏幕尺寸设置画布
先根据你的屏幕分辨率配置画布,确保DPI和屏幕一致,避免绘图模糊:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np # 获取系统默认DPI,也可以手动指定(比如你的屏幕是144DPI就写144) screen_dpi = plt.rcParams['figure.dpi'] # 按屏幕分辨率设置画布(比如1920x1080的屏幕直接用这个尺寸) fig_width = 1920 / screen_dpi fig_height = 1080 / screen_dpi fig = plt.figure(figsize=(fig_width, fig_height), dpi=screen_dpi) ax = fig.add_subplot(projection='3d')
2. 消除所有子图边距
把画布的上下左右边距全设为0,让3D轴直接占满画布空间:
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0, hspace=0)
3. 调整3D轴比例与视角(关键)
别用修改投影矩阵的方式硬拉伸,改用set_box_aspect设置轴的长宽高比例,再用view_init调整视角,让内容刚好适配画布:
# 按你的数据调整轴比例,示例为X/Y/Z轴1:1:0.5 ax.set_box_aspect([1, 1, 0.5]) # 调整仰角和方位角,找到最合适的显示视角 ax.view_init(elev=30, azim=45)
4. 可选:隐藏冗余元素省空间
如果不需要坐标轴标签、刻度,直接隐藏它们,能释放更多空间给绘图内容:
ax.set_xticks([]) ax.set_yticks([]) ax.set_zticks([]) ax.set_xlabel('') ax.set_ylabel('') ax.set_zlabel('')
完整示例代码
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np # 生成示例3D曲面数据 X = np.linspace(-5, 5, 100) Y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(X, Y) Z = np.sin(np.sqrt(X**2 + Y**2)) # 配置画布 screen_dpi = plt.rcParams['figure.dpi'] fig_width = 1920 / screen_dpi fig_height = 1080 / screen_dpi fig = plt.figure(figsize=(fig_width, fig_height), dpi=screen_dpi) ax = fig.add_subplot(projection='3d') # 消除边距 fig.subplots_adjust(left=0, right=1, bottom=0, top=1) # 绘制3D曲面 ax.plot_surface(X, Y, Z, cmap='viridis') # 适配画布空间 ax.set_box_aspect([1, 1, 0.6]) ax.view_init(elev=25, azim=30) # 隐藏冗余坐标轴元素 ax.set_xticks([]) ax.set_yticks([]) ax.set_zticks([]) ax.set_xlabel('') ax.set_ylabel('') ax.set_zlabel('') plt.show()
为什么之前的方法失效?
- 单纯改
figsize/DPI:只是等比例放大了画布和绘图,但3D轴预留的空白比例没变,所以还是会有大量空白。 - 负边距+修改
get_proj:负边距让轴超出了画布边界,导致内容被截断;修改投影矩阵的拉伸会破坏Matplotlib的自动适配逻辑,强制变形后内容必然溢出。
内容的提问来源于stack exchange,提问作者user24353751
相关产品推荐
相关产品推荐

