Matplotlib 优雅绘图

第一步 创建容器类对象

容器类对象有四类:Figure,Axes,Axis,Tick。这四个是由层级顺序的,一个Figure包含多个Axes,一个Axes包含多个Axis,一个Axis包含多个Tick。

Figure和Axes是作图必备,Axis和tick则是精细调整时才需要考虑的。因此高效作图第一步就是,先把Figure和Axes创建出来。

# 优雅地创建图和坐标系
layout = (3, 2) # 坐标系的布局
fig, axes = plt.subplots(*layout) # 添加图和坐标系

# 坐标系索引的两种方式
# 1. 矩阵索引
ax1 = axes[0][0] #第一个坐标系
ax2 = axes[0][1] #第二个坐标系

# 2. 遍历
for ax in axes.flat:
    pass

第二步 添加基础类对象

基础类对象就是图中所有的点、线、图例、标题这些。需要注意的是,基础类是寄生于容器类的。因此,添加基础类对象时,要先声明容器类对象,也就是说,画画时必须先说清楚在哪里画。

# 图
fig.legend() # 图-图例

# 坐标系
ax.plot() # 坐标系-线
ax.scatter() # 坐标系-点
ax.grid() #坐标系-网格
ax.legend() # 坐标系-图例
ax.text() # 坐标系-文字
ax.set_title('Title') # 坐标系-标题

# 坐标轴
ax.set_xlabel('xlabel')  # 坐标系-坐标轴-标签

# 刻度
ax.set_xticklabels(['one', 'two', 'three', 'four', 'five']) # 坐标系-坐标轴-刻度-标签

作为一个优雅的人,如果需要设置很多属性值(property),写一堆ax.就太不优雅了,这时候可以使用ax.set()来统一设置,简化代码:

# 优雅地添加基础类对象
props = {'title': 'Title', # 坐标系-标题
      'xlabel': 'xlabel', # 坐标系-坐标轴-标签
      'xticklabels':xticklabels_list} # 坐标系-坐标轴-刻度-标签
ax.set(**props)

美化格式,无非就是美化元素的属性值,包括字体、字号、子图边距、网格类型等。全局美化有两种方式,一是通过plt.style.use()使用官方预定义的样式,二是通过mpl.rcParams自定义样式。

官方预定义的样式有很多,用plt.style.available可以查看所有可用样式。第二种方法,可以把自己想要的格式显示地声明出来,每个细节都是自己掌控的。用mpl.rcParams.keys()可以查看所有可以全局定义的属性,用mpl.rcParams.update()可以实现一行代码更新参数。

第三步 按格式导出图片

Matplotlib导出的图可以有很多格式,论文作图时,一定要导出矢量图,也就是以.svg或者.pdf为后缀的,这类图片放大时不会失真。一般而言,SVG格式用于Word,PDF格式用于LaTeX。

还需要注意的是,为了去掉Matplotlib作图时多余的空白部分,导出图片时要传入bbox_inches='tight'参数。导出图片的代码如下:

fig.savefig('example.pdf', format='pdf', bbox_inches='tight')

最后更新于