Matplotlib基础(3):图片存储格式及参数设置

初步小结一下图形保存本地的常用设置(可用于论文出图),通过参数设置可以输出非常高质量清晰的且长宽格式的图片或pdf文件,主要介绍png、svg及pdf格式,以A4纸的宽度21cm或一半10cm为例测试。对于具体图形、文字、线条等尺寸的大小控制及文件格式可见上篇

需要说明的是,这一步是fig.save(),即保存画布的步骤,这时已经无法再调画布上的ax的图形,通常只能调节

  1. 画布的背景颜色facecolor、边框颜色edgecolor
  2. 图形四周默认的空白间距pad_inches,精细调节则bbox_inches,,多个ax的紧凑程度bbox_inches
  3. 保存文件的文件格式及路径、清晰度dpi

常规出图png即可,论文成图简单可png,较复杂细节多的可出无损矢量图svg eps或pdf,此外svg格式的结果可以在Adobe Illustrator中调节,下文简单介绍。(地图保存也可以输出问svg或pdf,ArcMap&QGIS均可)

1
2
3
4
5
6
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
mpl.rcParams['figure.dpi'] = 120
mpl.rcParams['font.size']=10.5
cm = 1/2.54
1
2
3
4
5
#0.5代表1.27cm的间距
fig, (ax1, ax2) = plt.subplots(nrows =1 ,ncols=2, figsize=(21*cm,10*cm), facecolor='w')
fig.savefig('./test.png',dpi=300,bbox_inches='tight',pad_inches=0.5)
fig.savefig('./test.svg',dpi=300,bbox_inches='tight',pad_inches=0.5)
fig.savefig('./test.pdf',dpi=300,bbox_inches='tight',pad_inches=0.5)

出图对比

出图举例:此处目的是展示出图,从官网拉两张图拼接示意f1f2,导入模块,修改路径运行代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
fig, (ax1, ax2) = plt.subplots(nrows =1 ,ncols=2, figsize=(21*cm,10*cm), facecolor='w')
# 图一参考
N = 21
x = np.linspace(0, 10, 11)
y = [3.9, 4.4, 10.8, 10.3, 11.2, 13.1, 14.1, 9.9, 13.9, 15.1, 12.5]
# fit a linear curve an estimate its y-values and their error.
a, b = np.polyfit(x, y, deg=1)
y_est = a * x + b
y_err = x.std() * np.sqrt(1/len(x) +(x - x.mean())**2 / np.sum((x - x.mean())**2))

ax1.plot(x, y_est, '-')
ax1.fill_between(x, y_est - y_err, y_est + y_err, alpha=0.2)
ax1.plot(x, y, 'o', ms=4, color='tab:red')
# 图2
sc = ax2.scatter([1, 2], [1, 2], c=[1, 2])
ax2.set_ylabel('YLabel', loc='top')
ax2.set_xlabel('XLabel', loc='left')
cbar = fig.colorbar(sc)
cbar.set_label("ZLabel", loc='top')

plt.show()

fig.savefig(r'./f1.png',dpi=300,bbox_inches='tight',pad_inches=0.5)
fig.savefig(r'./f1.svg',dpi=300,bbox_inches='tight',pad_inches=0.5)
fig.savefig(r'./f1.pdf',dpi=300,bbox_inches='tight',pad_inches=0.5)

png

结果图,置入word刚好合适,四周边距还可以根据要求调整

细节矢量图svg

使用浏览器打开即可预览,或者可以打开AI,进行进一步地拼图或调整图层等操作

细节矢量图pdf

如下图,按设定画布固定大小的pdf,其实期刊论文的发表附图都要求使用pdf等矢量格式,因为高清无损!正文不方便,但在论文支撑材料/附件中可以生成PDF最后拼接即可。

多页pdf

单个figure保存至pdf,比如我这里绘制了一幅6行3列的组图,保存为一页pdf文件,当然也可以直接保存为png或其他格式:

1
2
3
4
5
6
7
save_pdf = "./figure/test.pdf"
fig, axes = plt.subplots(nrows =6 ,ncols=3, figsize=(21*cm,29.7*cm),facecolor='w')
axes = axes.flatten()
for ax in axes:
ax.plot(...)
ax.text(...)
fig.savefig(save_pdf,format='pdf')

多个figure保存为多页pdf,PdfPages

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

save_pdf = "./figure/test.pdf"
pdf = PdfPages(save_pdf) # 打开文件
for col in df.columns.to_list():
values = df[col].to_numpy()
fig, ax = plt.subplots(figsize=(21*cm,29.7*cm),facecolor='w')
ax.hist(values,50)
fig.savefig(pdf,format='pdf') # 保存
plt.close()
pdf.close() # 保存