【1.1】matplotlib详解图像各个部分

一、基本概念

在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个或者多个Axes对象。每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域。所属关系如下:

  • figure:整个画布,包含一个或多个 axes
  • axes:画布中的某一个图表,包含一个 plot
  • artist:元素,包括图中所示的 label、line 等,也包括 plot

下面以一个直线图来详解图像内部各个组件内容:

其中:title为图像标题,Axis为坐标轴, Label为坐标轴标注,Tick为刻度线,Tick Label为刻度注释。各个对象关系可以梳理成以下内容:

图像中所有对象均来自于Artist的基类。

上面基本介绍清楚了图像中各个部分的基本关系,下面着重讲一下几个部分的详细的设置。

一个"Figure"意味着用户交互的整个窗口。在这个figure中容纳着"subplots"。

当我们调用plot时,matplotlib会调用gca()获取当前的axes绘图区域,而且gca反过来调用gcf()来获得当前的figure。如果figure为空,它会自动调用figure()生成一个figure, 严格的讲,是生成subplots(111)。

1.1 Figures

通过 plt 库进行画布(figure)相关操作 创建一个新的画布或引用一个已有的画布

plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, clear=False) 

重要参数包括:

num:Figure 的编号,可选。如果这个 num 的 figure 已经存在,那么激活这个 figure 并引用,否则生成一个新的 figure
figsize:设置画布的尺寸,默认 [6.4, 4.8],单位英寸
dpi:分辨率,默认 100
facecolor:背景颜色
edgecolor:边线颜色
clear:如果 num 代表的 figure 已经存在,是否要将这个画布清空

更新当前的画布(figure)

plt.draw()

对于支持交互类型(interactive model)的 backend,如果已经开启了交互类型(ion()),则不需要每次调用。

绘制画布(figure)

plt.show()

绘制画布,对于支持交互类型的 backend,没有作用;对于非交互类型(non-interactive model)的 backend,则立即显示画布,直至画布被关闭。

清除当前的画布(figure)

plt.clf()

关闭某个画布

plt.close()

参数可以是:

  • 空,即关闭当前画布
  • Figure 实例
  • 整数,Figure 编号
  • 字符串,Figure 名称
  • ‘all’,所有画布

将画布保存成文件

plt.savefig(fname, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', papertype=None, format=None, transparent=False, metadata=None)

重要参数包括:

fname:一个文件路径或者一个 file 类型的对象
dpi:分辨率,一个整数或者 ‘figure’ 指定使用 figure 的分辨率
facecolor:背景颜色
edgecolor:边线颜色
orientation:方向,‘landscape’ 或 ‘portrait’
papertype:纸张类型,‘letter’, ‘legal’, ‘executive’, ‘ledger’, ‘a0’ 到 ‘a10’, ‘b0’ 到 ‘b10’
format:格式,可能是 ‘png’,‘pdf’,‘ps’,‘eps’,‘svg’ 等,具体取决于当前 backend 所支持的格式
transparent:是否透明
metadata:一些参数,kv 格式的参数
‘png’ 类型支持的参数见 这里
‘pdf’ 类型支持的参数见 这里
‘eps’ 或 ‘ps’ 支持 ‘Creator’ 参数

获取画布信息:

作用 函数
获取当前的画布(figure) plt.gcf()
返回当前所有画布的标签列表 plt.get_figlabels()
返回当前所有画布的编号 plt.get_fignums()
为画布(Figure) 添加标题

plt.suptitle(t, **kwargs)

重要参数说明:

  • t:标题内容
  • x,y:坐标位置,默认 x = 0.5,y = 0.98
  • ha:水平对齐方式,‘center’, ‘left’, ‘right’
  • va:竖直对齐方式,‘top’, ‘center’, ‘bottom’, ‘baseline’

1.2 backend

每一种输出的能力都叫做一种 backend,在我的理解中有点类似渲染器。 IPython 中的魔法语句 %matplotlib xxxx 就是选择 backend。

选用哪种 backend,其优先级选取如下:

matplotlibrc 文件中的 backend
使用 MPLBACKEND 环境变量
使用 matplotlib.use() 函数,需要在导入 pyplot 前使用

backend 从种类上,分为可交互型(user interface)和不可交互型两种(hardcopy),如果希望查看本地支持的 backend 有哪些,可以使用

matplotlib.rcsetup.interactive_bk # 可交互型
matplotlib.rcsetup.non_interactive_bk # 不可交互型
matplotlib.rcsetup.all_backends # 所有 backend

获取当前的 backend 可以使用 matplotlib.pyplot.get_backend()

“交互模式”即代表着这个图标在绘制后可以动态变化,例如预设的动画以及用户的操作。 当开启交互模式后,绘制的图表会自动更新、绘制,如果希望手动更新图表,则使用 draw() 函数;而在非交互模式下,当所有后台绘制完成后,需要使用 show() 函数,才会将最终图表展示出来。

如果希望使用交互模式,需要选用可交互型的 backend。

通过 matplotlib.interactive() 设置交互模式的开启与关闭 通过 matplotlib.is_interactive() 查询当前实发支持交互模式 也可以通过 matplotlib.pyplot.ion() 和 matplotlib.pyplot.ioff() 来开启/关闭交互模式

常用 backend

不可交互型:

AGG:渲染为 png 文件
PS:渲染为 ps 文件
PDF:渲染为 pdf 文件
SVG:渲染为 svg 文件
Cairo:使用 Cairo 引擎渲染

可交互型:

Qt5Agg:使用 Qt5 渲染,IPython 中可使用 %matplotlib qt5
Qt4Agg:使用 Qt4 渲染,IPython 中可使用 %matplotlib qt4
ipympl:使用 ipympl 库,Ipython 中可使用 %matplotlib ipympl
macosx:使用 Cocoa 画布渲染,Ipython 中可使用 %matplotlib osx
nbAgg:Jupyter Notebook 中使用的 backend,Jupyter 中使用 %matplotlib notebook 来激活
WXAgg:使用 wxWidgets 库来渲染,Ipython 中可使用 %matplotlib wx
inline:严格地讲并不是一个 backend,这个 IPython 中的一个语法,表示把图表嵌入笔记中,使用 %matplotlib inline

1.3 子图

1.3.1 Subplots

plt.subplot(221) # 第一行的左图
plt.subplot(222) # 第一行的右图
plt.subplot(212) # 第二整行
plt.show()

注意:其中各个参数也可以用逗号,分隔开。第一个参数代表子图的行数;第二个参数代表该行图像的列数; 第三个参数代表每行的第几个图像。

另外:fig, ax = plt.subplots(2,2),其中参数分别代表子图的行数和列数,一共有 2x2 个图像。函数返回一个figure图像和一个子图ax的array列表。

补充:gridspec命令可以对子图区域划分提供更灵活的配置。

1.3.2 add_axes的方法

add_subplot()方法在生成子图过程,简单明了,而用add_axes()方法,则生成子图的灵活性更强,完全可以实现add_subplot()方法的功能,可以控制子图显示位置,甚至实现相互重叠的效果。

fig = plt.figure()
ax3 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) 
ax4 = fig.add_axes([0.72, 0.72, 0.16, 0.16]) 
print type(ax3) 
plt.show()

axes与subplot区别:

axes简单说来就是灵活的子图,axes是自由摆放的子图,甚至可以相互重叠,而subplot是“自动对齐到网格”。但他们本质上都是子图,也就是说subplot内部其实也是调用的axes,只不过规范了各个axes的排列罢了

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn