matplotlib保存图片边框粗细不均如何设置四边等宽边框
问题根源
- 你在
plt.subplots()中传入的linewidth、edgecolor参数是给画布(Figure)对象设置外边框,并非绘图区坐标轴的边框。双轴模式下twinx()生成的第二坐标轴会覆盖右侧、上侧边的渲染层级,弹窗预览时渲染边距充足所以显示正常,保存图片时默认的裁剪逻辑会把画布边缘的边框裁掉一部分,直接导致边框粗细不一致。 - 加
bbox_inches='tight'参数后,程序会自动计算紧贴绘图内容的裁剪边界,画布本身的外框处于绘图内容的外围区域,会被直接裁掉大半,就会出现右侧边框完全消失、顶部边框变细的问题。 - 其他脚本中设置大linewidth也看不到边框,本质也是画布边框被保存时的裁剪逻辑完全切掉导致的。
修复方法
放弃给Figure画布设置边框的思路,直接对两个坐标轴的所有脊线(也就是绘图区四边边框)统一设置样式,从根源避免裁剪冲突,可直接替换使用的完整代码如下:
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [1000,2000,500,8000,3000] y1 = [1050,3000,2000,4000,6000] # 仅设置画布背景色,不再给Figure传linewidth、edgecolor参数 fig, ax1 = plt.subplots(facecolor="orange") ax2 = ax1.twinx() # 统一配置两个坐标轴的四边边框:线宽、颜色 border_linewidth = 2 border_color = "black" for ax in [ax1, ax2]: for spine in ax.spines.values(): spine.set_linewidth(border_linewidth) spine.set_color(border_color) ax1.bar(x, y) ax2.plot(x, y1, 'o-', color="red" ) ax1.set_xlabel('X data') ax1.set_ylabel('Counts', color='g') ax2.set_ylabel('Detection Rates', color='b') # 常规保存即可,不需要额外裁剪参数 plt.savefig(r"C:\Users\moys\Desktop\qqq.jpg", dpi=150) plt.show()
补充说明
- 需要调整边框粗细时,直接修改
border_linewidth的数值即可,哪怕设置为10也能正常显示,不会出现边框消失的问题。 - 如果业务必须使用
bbox_inches='tight'自动裁剪空白,需要额外传入pad_inches=0.2给边框预留足够的裁剪余量,避免切到边框,示例写法:plt.savefig(r"./data/qqq.jpg", bbox_inches='tight', pad_inches=0.2) - 不要同时给Figure画布加外框、给坐标轴设置spine样式,否则会出现两层边框叠加,视觉上反而会出现粗细不均的问题。
内容的提问来源于stack exchange,提问作者moys
相关产品推荐
相关产品推荐

