如果是论文插图,不建议使用matplotlib 的生成图,建议用专业软件或Visio严格控制图片尺寸和字体字号
需求:
- 多子图排列
- 关闭子图坐标轴显示
- 子图间距适中(紧凑)
- 图像边缘适中(改变布局和大小)
- 矢量图保存(dpi设置)
默认布局:
import matplotlib.pyplot as plt
imgs= get_gray_imgs()
fig, axes = plt.subplots(2, 5)
axes = axes.flatten()
for i in range(10):
axes[i].imshow(imgs[i], cmap="gray")
axes[i].set_title("img" + str(i))
axes[i].set_axis_off()
fig.show()
fig.savefig('imgs.png', dpi=600, format='png')
代码说明:
- 使用matplotlib时,应当返回具体的画布对象
fig
和坐标轴对象ax
,特别简单的绘图显示时才建议直接操作plt
fig, axes = plt.subplots(2, 5)
的具体用法一定要查看官方文档,根据需求,去寻找对应的设置方法:参见 fig画布对象 和 axes轴对象- 用轴对象
ax
设置标题和坐标轴的方法不同于plt
类,还是要看官方文档,而不是在网上找博客 - 文本尺寸会自动选择合适的
- 矢量图保存
fig.savefig
不存在网上所说的玄学,只要操作画布实例fig
,就不会出现保存图片是空白的问题,和代码执行顺序无关。
紧凑布局:
上述代码完成了所需功能,但布局需要调整,仅仅使用fig.set_tight_layout(True)
或者fig.subplots_adjust
是不够的,还应该调整画布的大小。但是画布大小调整函数fig.set_size_inches(34, 9)
的输入参数是 英寸,因此需要手动计算。
不建议模糊设置画布参数,因为很难设置合适文字尺寸,会造成文字图片的比例失调,如下图:
这就需要在默认布局的基础上,获得子图的宽高尺寸(单位:英寸)和文字磅值
- 用 画图工具 编辑的默认布局图
- 选择 文件 -> 属性,单位改为英寸
- 框处某个子图的大小,算出所需紧凑布局的画布大小。
如 示例子图 5.88×4.14,总共 2×5 个子图,那么紧凑布局的画布宽高可以设置为 30×8
- 插入文本,对比当前文字的磅值,如52
完整代码:
import matplotlib.pyplot as plt
imgs= get_gray_imgs()
fig, axes = plt.subplots(2, 5)
fig.set_size_inches(30, 7)
# fig.subplots_adjust(left=0.04, top= 0.96, right = 0.96, bottom = 0.04, wspace = 0.01, hspace = 0.01)
fig.set_tight_layout(True) # subplots_adjust 约束太多,不容易计算,效果不好
axes = axes.flatten()
for i in range(10):
axes[i].imshow(imgs[i], cmap="gray")
axes[i].set_title("img " + str(i), fontsize=52)
axes[i].set_axis_off()
fig.show()
fig.savefig('imgs.png', dpi=600, format='png')
最终效果: