一张图看懂matplotlib的绘图结构

介绍matplotlib绘图基础结构,绘图基础流程,以及绘图通用属性设置。

刚开始接触python matplotlib绘图的朋友可能对figure,axes,axis等等名词感到迷糊,到底什么对应什么,弄不清怎么才能绘制出自己满意的图形结构,那么借用官方提供的一张图,可以清晰的展现一个完整的图片的层次结构。

首先声明,本文是为了助于大家理解绘图的结构,所以会用一些粗浅的比喻,尽量避免让人迷惑的专业词汇。所以这篇文章会非常的:unprofessional。

一、 Figure结构

image-20200528144651404

  1. 首先找到位于左下角的“Figure”,这一整张图形,就是一个Figure,Figure包含了全部,可以想象成你画画的桌子
  2. “Figure”右边不远,有一个Axes,每一个Axes都是一张用来画画的纸,这些纸可以铺在桌子上的任何位置,也可以叠起来,一张压着一张,随你怎么摆放
  3. 除此之外,这张图圈起来的其他所有属性,都是建立在Axes之上的,也就是在画纸上进行的。

那么在理解了绘制一个Figure的要素之后,就可以顺着这个流程来绘图了。

二、绘图流程

  1. 建立Figure

    1
    2
    import matplotlib.pyplot as plt
    fig = plt.figure(figsize=(12,8))#12,8为图片长宽
  2. 建立Axes

    2.1 这一步有很多方法,比如最常见的,通常也是比较便捷的,像制定表格一样,指明摆放几行几列(顺序为从上到下从左到右)的画纸:

    1
    2
    3
    4
    ax1 = fig.add_subplot(221)#2行2列第一个位置
    ax2 = fig.add_subplot(222)#2行2列第一个位置
    ax3 = fig.add_subplot(223)#2行2列第一个位置
    ax4 = fig.add_subplot(224)#2行2列第4个位置

    2.2 第二种方法更加灵活自由,但是需要自己指定精确的坐标位置(这是我最喜欢的一种方法,虽然比较麻烦,但是灵活呀)

    1
    ax = fig.add_axes([0.1, 0.2, 0.3, 0.4])#在figure中x=0.1,y=0.2的位置,建立一个长0.3宽0.4的Axes
  3. 调用相应的绘图函数绘制图层,比如折线图里的折线,散点图里的散点,填色图里的色斑等等,这部分不在这里细讲

  4. 设置Axes属性,图题,坐标标签,图例,等等

三、通用属性设置

通用属性,指的是绘图对象均可设置的属性,比如说透明度alpha,标签可以设置透明度,折线可以设置透明度,图例也可以设置透明度,这就属于通用属性,通用指的是对Artist的通用,总之,你在Axes上看到的一切,都姑且可以当做Artist来对待。

Artist通用属性 作用
alpha 透明度,0为透明,1为不透明
clip_box 裁剪框
clip_on 是否裁剪
clip_path 裁剪路径
label 文本标签
transform 坐标转换(绘制带地图投影的图形需要)
visible 是否可见/隐藏(通常用于隐藏Spines,也就是隐藏掉边框)
zorder 绘图顺序(用于设置多图层的绘图顺序,比如先填色,再打点,再加图例)

最常用的alpha,label,transform,visible,zorder。

四、图像核心要素设置

4.1 与坐标轴有关的设置
  1. 设置x,y轴范围

    1
    2
    ax1.set_xlim(x1, x2)
    ax1.set_ylim(y1, y2)
  2. 设置刻度及标签

    1
    2
    3
    #将x轴1,2,3,4对应位置标签改为a,b,c,d。y轴同理,x->y即可
    ax1.set_xticks([1,2,3,4])
    ax1.set_xticklabels(['a','b','c','d'])
  1. 设置坐标轴不显示,这里就展示到了刚刚通用属性的用法

    1
    2
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    image-20200528153307572

    4.设置坐标轴名称

    1
    2
    ax.set_xlabel('x axis')
    ax.set_ylabel('y axis')
4.2 常用属性设置(颜色,线性,标记符号)
颜色 代码 线型 代码 标记 代码
‘b’ 实线 ‘-’ ‘.’
绿 ‘g’ 虚线 ‘–’ x ‘x’
‘r’ 虚点 ‘-.’ 圆圈 ‘o’
‘c’ 点线 ‘:’ 三角 ‘v’
‘p’ 方块 ‘s’
‘y’ ‘*’
‘k’ 加号 ‘+’
‘w’ 菱形 ‘D’

使用很简单,以最基础的plot函数为例:

1
ax.plot(x,y, color='k', linestyle='-', alpha=0.3)

甚至可以将color=’k’, linestyle=’-‘缩写为’-k’

4.3 标题
1
ax.set_title('abc')

标题的设置同样也可以添加一些参数:

loc: {‘center’, ‘left’, ‘right’},设置标题显示的位置

pad: 设置标题距离图像上边缘距离

fontsize: 设置字体大小

color: 设置字体颜色

五、示例

这边给一个完整的示例,将上面的要素尽量融合(由matplotlib官方例子改编)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#生成绘图数据部分,跳过即可
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]
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))
#绘图开始
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
ax.plot(x, y_est, '-')
ax.fill_between(x, y_est - y_err, y_est + y_err, alpha=0.2)
ax.plot(x, y, 'o', color='r')
#添加属性
ax.set_xlabel('x axis',fontsize =16)
ax.set_ylabel('y axis',fontsize =16)
ax.set_title('example',loc='left')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.set_xlim(0,20)
ax.set_yticks([0,5,10])
ax.set_yticklabels(['zero','five','ten'])
plt.show()
image-20200528160025451

添加属性部分去掉任何一句话都不影响脚本的正确性,因此大家可以尝试逐句注释,来看看每句话控制着那些要素。