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

如何将Matplotlib图形按指定宽度、自动高度保存为PDF文件

如何将Matplotlib图形按指定宽度、自动高度保存为PDF文件

太懂这种手动试调figsize的痛苦了!想要固定宽度但让高度自动适配内容,又不想反复折腾,我来给你分享个靠谱的解决办法。

问题根源

你遇到的问题本质是:

  • 一开始设figsize=(5,5)固定了图形宽高比,但ax.set_aspect('equal')强制了轴的宽高比,导致图形内容无法填满整个画布,出现大量上下留白
  • 用bbox_inches='tight'虽然能裁剪留白,但Matplotlib会把裁剪后的区域作为新的图形尺寸保存,导致原本固定的5英寸宽度被打破

解决方案:先获取内容尺寸,再按比例缩放

核心思路是先让Matplotlib计算出无多余留白的内容实际尺寸,再按比例将宽度缩到你要的5英寸,高度自动同步适配,最后直接保存即可。具体代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 1. 初始化图形,先不固定figsize,让Matplotlib自动计算初始布局
fig, ax = plt.subplots(layout='constrained')
x = np.linspace(0, 2*np.pi)
y = np.sin(x)
ax.set_aspect('equal')
ax.plot(x, y)

# 2. 渲染图形,让Matplotlib计算出所有元素的实际位置
fig.canvas.draw()

# 3. 获取无多余留白的内容边界框,并计算实际宽高(单位:英寸)
renderer = fig.canvas.get_renderer()
tight_bbox = fig.get_tightbbox(renderer)
current_width = tight_bbox.width / fig.dpi
current_height = tight_bbox.height / fig.dpi

# 4. 按目标宽度(5英寸)计算缩放比例,调整画布尺寸
scale_ratio = 5 / current_width
fig.set_figwidth(5)
fig.set_figheight(current_height * scale_ratio)

# 5. 直接保存即可,无需额外裁剪参数(画布尺寸已完美适配内容)
fig.savefig('test.pdf', format='pdf')
plt.show()

为什么这个方法有效?

  1. 先不固定figsize,让Matplotlib根据轴的aspect='equal'和constrained布局,自动算出刚好容纳内容的初始尺寸
  2. 通过get_tightbbox拿到无留白的真实内容尺寸,再按比例将宽度缩到5英寸,高度同步缩放以保持内容比例不变
  3. 调整后的画布尺寸已经完美适配内容,直接保存既不会有多余留白,也能严格保证宽度为5英寸

验证效果

这样保存的PDF文件,宽度会严格是5英寸,高度和plt.show()展示的完全一致,完美匹配你想要的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:43:15