Matplotlib 如何保存无侧边填充的n_pixel×n_pixel正方形图像
Matplotlib 导出正方形无填充图像的实现方案
核心需求
使用Matplotlib导出图像时需要同时满足两个约束:
- 导出图像为严格的正方形像素尺寸,两个维度的像素数量完全一致
- 导出图像边缘不存在任何多余填充区域
初始代码的问题
最初的测试代码运行后,默认导出288x288像素的正方形图像,但边缘存在多余填充:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi, 400) y = np.sin(x ** 2) fig, ax = plt.subplots(figsize=(4,4)) ax.set_ylim(-1, 1) ax.axis('off') ax.plot(x,y) fig.savefig("try.png", #pad_inches=-0.2 #bbox_inches='tight' ) plt.close(fig)

如果开启savefig方法中的bbox_inches='tight'参数,虽然可以消除边缘填充,但导出的图像尺寸会变为237x231像素,不再满足正方形尺寸要求。
可行解决方法
经过测试,添加fig.subplots_adjust(left=0, right=1, bottom=0, top=1)配置即可同时满足两项约束,调整后的完整代码如下:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi, 400) y = np.sin(x ** 2) fig, ax = plt.subplots(figsize=(4,4)) ax.set_ylim(-1, 1) ax.axis('off') ax.plot(x,y) # 关键配置:让绘图区完全占满整个画布,消除默认预留边距 fig.subplots_adjust(left=0, right=1, bottom=0, top=1) fig.savefig("try.png", #pad_inches=-0.2 bbox_inches='tight' ) plt.close(fig)
配置逻辑说明:默认状态下Matplotlib的绘图区不会完全占满画布,会在四周预留固定边距。开启
bbox_inches='tight'时会自动裁剪掉所有非绘图区的边距,若绘图区本身的占比不是正方形,裁剪后的图像就会出现长宽不等的问题。将绘图区边距全部设为0、让绘图区刚好占满正方形画布后,再做裁剪操作,就不会出现长宽偏差,最终导出的图像既无多余填充,也能保持严格的正方形像素尺寸。
内容的提问来源于stack exchange,提问作者ecjb
相关产品推荐
相关产品推荐

