如何让Matplotlib 3.4+版本3D绘图自适应固定尺寸画布并消去多余边距
问题描述
2019年使用以下代码创建3D绘图:
fig = plt.figure() fig.set_size_inches(10, 4) ax = fig.gca(projection='3d')
上述代码在Matplotlib 3.4版本后出现两个问题:
- 带关键字参数调用gca()的写法被官方弃用
- 3D坐标轴不再能自动适配预设的画布尺寸
以下是Matplotlib 3.4.3版本下的测试代码:
fig = plt.figure() fig.set_size_inches(10, 4) ax = plt.subplot(1, 1, 1)
fig = plt.figure() fig.set_size_inches(10, 4) ax = plt.subplot(1, 1, 1, projection='3d')
运行效果如下:
旧版本Matplotlib可自动将3D坐标轴适配到预设画布尺寸内(具体版本号未留存),但3.4.3版本无此效果。已知可使用Axes3D.set_box_aspect()调整,但很难找到刚好适配画布尺寸的宽高比参数,调用autoscale()也无效。
需求:
- 3D坐标轴自动适配固定尺寸的画布(或直接调整3D坐标轴尺寸)
- 消除画布上的多余边距
解决方案
1. 废弃写法替代
Matplotlib 3.4及以上版本不再支持fig.gca(projection='3d')传参方式,改用以下写法创建3D坐标轴即可:
ax = fig.add_subplot(projection='3d') # 多子图场景写法 ax = fig.add_subplot(111, projection='3d')
2. 3D轴自动适配画布+消除多余边距
无需手动计算宽高比参数,通过动态获取画布尺寸设置box_aspect,配合边距调整参数即可实现需求,可直接复用以下代码模板:
import matplotlib.pyplot as plt # 设定固定画布尺寸 fig = plt.figure(figsize=(10, 4)) # 创建3D坐标轴 ax = fig.add_subplot(projection='3d') # 消除多余边距,可根据是否需要显示标签、标题调整各边预留比例 # 若不需要任何边距,直接设置left=0, right=1, bottom=0, top=1 fig.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95) # 自动计算适配画布的3D轴宽高比,无需手动赋值 ax_bbox = ax.get_position() canvas_w = ax_bbox.width * fig.get_figwidth() canvas_h = ax_bbox.height * fig.get_figheight() # 三个参数对应 (Z轴比例, Y轴比例, X轴比例),可根据实际展示需求调整Z轴缩放系数 ax.set_box_aspect((canvas_h, canvas_h, canvas_w/2)) # 下方写入自身绘图逻辑 # ... plt.show()
内容的提问来源于stack exchange,提问作者J. Choi
相关产品推荐
相关产品推荐

