Matplotlib如何导出矢量文字+栅格绘图的混合PDF文件?
Matplotlib导出混合矢量+栅格PDF的解决方案
Matplotlib原生支持对指定绘图内容做栅格化处理,同时保留文字、刻度、坐标轴等元素为矢量格式,可直接满足你的需求。
实现方法
你可以选择以下两种方案中的任意一种:
方案1:按图层优先级批量栅格化
- 对使用了
pcolormesh等高数据量绘图接口的坐标轴,设置set_rasterization_zorder阈值,所有zorder低于该阈值的元素都会被栅格化导出。 - 绘图时将
pcolormesh、imshow等需要栅格化的元素zorder设为低于阈值,文字、刻度等默认zorder高于阈值,会自动保留矢量格式。 - 导出PDF时设置
dpi参数控制栅格部分的清晰度,平衡体积和显示效果。
代码示例:
import matplotlib.pyplot as plt import numpy as np # 创建3行2列画布 figure, axes = plt.subplots(nrows=3, ncols=2, figsize=(10, 15)) # 给第一个子图设置栅格化阈值:zorder < 0的元素自动栅格化 axes[0,0].set_rasterization_zorder(0) # 绘制pcolormesh时设置zorder=-1,低于阈值,会被栅格化 test_data = np.random.randn(1000, 1000) axes[0,0].pcolormesh(test_data, zorder=-1) # 文字、标签、刻度默认zorder高于0,保留矢量格式 axes[0,0].set_xlabel('X轴标签') axes[0,0].set_ylabel('Y轴标签') axes[0,0].set_title('子图标题') # 导出PDF,dpi设150-300即可满足绝大多数场景需求 figure.savefig('output.pdf', dpi=200, bbox_inches='tight')
方案2:指定单个图层栅格化
如果需要更灵活的控制,可以直接在绘图函数中加rasterized=True参数,强制当前绘图元素栅格化,不需要调整zorder:
# 直接指定pcolormesh图层栅格化 axes[0,0].pcolormesh(test_data, rasterized=True)
补充说明
- 如果多个子图都用到高数据量绘图接口,给每个子图单独配置即可。
- 最终导出的PDF中文字、刻度放大不会模糊,高数据量绘图内容被压缩为栅格嵌入,文件体积远小于全矢量导出的PDF。
内容的提问来源于stack exchange,提问作者dimitsev
相关产品推荐
相关产品推荐

