matplotlib保存eps格式时第二列子图外框缺失问题排查
matplotlib导出EPS时第二列子图外边框丢失问题
问题复现
以下代码可以复现该异常:7行2列共14个子图,导出为eps格式后第二列所有子图的外边框缺失。
import numpy as np from matplotlib import pyplot as plt a=np.random.rand(14,100) x = np.arange(0,100) plt.rcParams['figure.autolayout'] = True fig, axs = plt.subplots(7, 2,figsize=(11,22)) axs[0, 0].plot(x, a[0,:], color='black') axs[0, 1].plot(x, a[1,:], color='black') axs[1, 0].plot(x, a[2,:], color='black') axs[1, 1].plot(x, a[3,:], color='black') axs[2, 0].plot(x, a[4,:], color='black') axs[2, 1].plot(x, a[5,:], color='black') axs[3, 0].plot(x, a[6,:], color='black') axs[3, 1].plot(x, a[7,:], color='black') axs[4, 0].plot(x, a[8,:], color='black') axs[4, 1].plot(x, a[9,:], color='black') axs[5, 1].plot(x, a[10,:], color='black') axs[5, 0].plot(x, a[11,:], color='black') axs[6, 0].plot(x, a[12,:], color='black') axs[6, 1].plot(x, a[13,:], color='black') for ax in axs.flat: ax.set(xlabel='Time (s)', ylabel= 'Load (kN)') for row in axs: for ax in row: ax.grid(b=True, which='major', color='#666666', linestyle='-') plt.savefig("test.eps", dpi=1200) plt.show()
异常效果截图:
问题原因
- 全局开启的
figure.autolayout自动布局存在微小计算偏差,第二列子图的右边缘刚好超出EPS格式默认定义的画布边界 - EPS是标准矢量格式,会对页面范围外的所有元素做硬裁剪,不会像PNG等位图格式那样自动保留溢出边缘的内容,代码里设置的1200dpi高导出分辨率,还会进一步放大这个边界偏移的影响
解决方法
按优先级尝试,一般第一种方法就能解决问题:
- 方法1:导出时添加
bbox_inches='tight'参数,让导出逻辑自动计算所有绘图元素的实际边界,把完整内容都包含进导出文件,修改后的保存代码如下:
plt.savefig("test.eps", dpi=1200, bbox_inches='tight')
- 方法2:如果加了上述参数仍有边框显示异常,把全局自动布局换成手动调用紧凑布局接口,这个接口的边界计算精度更高:
- 删除原代码里的
plt.rcParams['figure.autolayout'] = True - 在
plt.savefig()之前添加一行代码:
plt.tight_layout() - 删除原代码里的
- 方法3:如果做完前两步还是有子图边缘贴边、被裁剪的情况,可以给紧凑布局设置留白参数,手动预留足够的边距:
plt.tight_layout(pad=0.8)
pad数值越大,子图和画布边缘的留白越多,可以根据实际导出的效果调整数值大小。
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

