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

Matplotlib保存PDF时图表标签被裁剪,导入Inkscape后恢复的问题求助

Matplotlib保存PDF时轴标签被裁剪的原因与解决方法

问题复现

使用Matplotlib 3.6.2(Python 3.9.12,Windows 10)保存小尺寸图表时,x、y轴标签部分被裁剪。复现代码如下:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(1.75,1.75), dpi=300)
ax.scatter(x, y)
ax.set_xlabel("x")
ax.set_ylabel("y")
fig.savefig("fig.pdf")

现象:PDF查看器中标签被裁剪;导入Inkscape时,选择「internal import」可恢复完整标签,选择「Poppler/Cairo import」则仍显示裁剪。

背后的原理

  1. 布局边界与PDF显示区域不匹配:当设置的figsize过小时,轴标签会超出Matplotlib默认的绘图区域边界。Matplotlib生成PDF时,默认以绘图区域作为PDF的MediaBox(PDF标准定义的默认显示范围),但标签元素实际被绘制在了MediaBox之外。
  2. 不同渲染器的处理逻辑差异:普通PDF查看器和Poppler/Cairo渲染器会严格遵循MediaBox的范围进行裁剪显示;而Inkscape的internal import模式会读取PDF文件中的全部图形元素,不受MediaBox限制,因此能显示完整的标签内容。

解决方法

以下几种方案均可让PDF查看器直接显示完整无裁剪的图表:

1. 启用自动布局调整

在创建子图时开启tight_layout,让Matplotlib自动调整布局,确保所有元素(包括标签)都在绘图区域内:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(1.75,1.75), dpi=300, tight_layout=True)
ax.scatter(x, y)
ax.set_xlabel("x")
ax.set_ylabel("y")
fig.savefig("fig.pdf")

2. 保存时指定边界参数

调用savefig时添加bbox_inches='tight',强制Matplotlib计算所有可见元素的边界,并调整PDF的显示区域以容纳这些元素:

fig.savefig("fig.pdf", bbox_inches='tight')

3. 手动调整子图间距

通过subplots_adjust手动设置子图的边距,给标签留出足够空间(数值可根据实际尺寸调整):

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(1.75,1.75), dpi=300)
ax.scatter(x, y)
ax.set_xlabel("x")
ax.set_ylabel("y")
# 调整上下左右边距,确保标签不被裁剪
fig.subplots_adjust(left=0.2, bottom=0.2, right=0.9, top=0.9)
fig.savefig("fig.pdf")

内容的提问来源于stack exchange,提问作者Zhengyang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:35:33