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

如何让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')

运行效果如下:
3D绘图效果示意图

旧版本Matplotlib可自动将3D坐标轴适配到预设画布尺寸内(具体版本号未留存),但3.4.3版本无此效果。已知可使用Axes3D.set_box_aspect()调整,但很难找到刚好适配画布尺寸的宽高比参数,调用autoscale()也无效。

需求:

  1. 3D坐标轴自动适配固定尺寸的画布(或直接调整3D坐标轴尺寸)
  2. 消除画布上的多余边距

解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:45:02