Matplotlib学习指南1:文档导读与基本函数示例

图形化显示

Matplotlib的官方文档首页略显庞杂,熟悉之后会发现包罗万象,这里是最好的Matplotlib学习场所,所以针对文档的内容做一个简单的导读,最后列出自己总结的作图基本语法,仅供参考。

文档导读

Examples:提供了大量的实际代码案例,几乎囊括了Matplotlib的所有功能。建议找一些初步探索,了解Matplotlib的强大。但是这里不适合初学者学习,建议有了基础训练再来找自己需要的案例。Gallery页面提供了更方便的索引方式,可以直观的看到Examples的所有图像。

Pyplot

Plotting commands summary提供了Pyplot模块作图的命令查询和常见的参数展示。

Docs

这里是整个文档的真正目录索引,如果觉得找起来麻烦,直接点击pdf,下载pdf版本。如果药了解基础知识建议从Usage开始。

Modules & Index

Modules提供了Matplotlib的所有子模块列表,方便查询
Index是整个文档的所有内容索引。

简单例子

首先让自己画出一个最基本的线图,有了直观的新鲜感觉,后面的事情会简单许多。

1
2
3
4
5
6
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.arange(10)
plt.plot(x)

关键定义:Figures、Axes、axis、plot

Matplotlib作图时,各个组件(暂且这么叫)也是有结构关系的,最顶层时稳定的机器环境,简单说是matplotlib.pyplot这个组块,在这一个组块上,利用其他的函数来不断的添加画图时的各个元素。而这个组块的概念和Matlab很类似。
下一层是第一个面向对象的接口层,在这里,pyplot利用较少的特定函数完成类似于新建画布、图像等工作。之后的所有工作主要在这一层实例化的类上进行操作。

在上图中标注了重要的类,下面重点介绍:

  • Figure:即上面红框部分,简单理解是一个画布。一个画布里可以有零个或者多个坐标轴。
  • Axes:即上面蓝色框内的部分,可以理解为坐标系,是我们真正作图的地方,一个画布里可以有多个坐标系,而一个坐标系只能属于一个画布。
  • Axis:坐标轴,如果是二维坐标系有两个坐标轴,三维的会有三个坐标轴。

基本函数

生成画布

罗列生成figure、axes的常用函数和用法。

  • plt.figure:直接生成一个画布,建议和add_axes一起使用,注意,add_axes的参数必填,否则后续作图会报错。

    1
    2
    3
    4
    5
    6
    7
    y = np.random.rand(10)
    x = np.arange(10)

    left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
    fig1 = plt.figure()
    ax1 = fig1.add_axes((left, bottom, width, height), axisbg="#e1e1e1")
    ax1.plot(x,y)
  • plt.axes:单独使用既可生成一个坐标系(默认自动生成了画布)。

    1
    2
    ax2 = plt.axes()
    ax2.plot(x,y)
  • plt.subplot:区别于下面的plt.subplots,这里只会生成一个画布和坐标系,返回的是生成的坐标系。

    1
    2
    ccc = plt.subplot(111)
    ccc.plot(x,y)
  • plt.subplots:该函数会返回一个画布和一个或多个坐标系,在画图中非常常用。

    1
    2
    fig, ax = plt.subplots()
    ax.plot(x, y1);
  • plt.plot:该函数直接使用,默认生成了画布和坐标系。

    1
    2
    3
    x = np.arange(5)
    y = np.arange(5.0)/2
    plt.plot(x,y)

同一个画布中增加多个坐标系

  • 利用subplots直接添加

    1
    2
    fig, axes = plt.subplots(ncols=2, nrows=3)
    fig, axes = plt.subplots(1, 2)
  • 注意:坐标系以多维数组的形式存储在了axes中,调用时要按照数组的方式进行选择。可以考虑for循环的方式增加图形细节,减少重复劳动。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ncols, nrows = 3, 3

    fig, axes = plt.subplots(nrows, ncols)

    for m in range(nrows):
    for n in range(ncols):
    axes[m, n].set_xticks([])
    axes[m, n].set_yticks([])
    axes[m, n].text(0.5, 0.5, "axes[%d, %d]" % (m, n),horizontalalignment='center')
  • 更自定义的方法是在建立了画布之后,对应的画布利用add_axes函数设置,并且可以自定义各个图形的位置和大小。

同一个坐标系中画多幅图

  • 生成了坐标系,可以调用坐标系的plot方法添加需要的图形,可以添加多个。
    1
    2
    3
    4
    ax = plt.subplot(111)
    ax.bar(x,y)
    ax.plot(np.arange(10))
    ax.plot(np.sin(np.linspace(1,5,num=10)))

为图片增加细节

到目前为止画出的图形都还比较“简陋”,下面为图形增加更多的细节内容。

  • 为图片整容:不喜欢默认的图片风格,可以进行一次全面的替换。图片风格在Matplotlib中属于Style子模块,利用下面的代码可以实现风格的变化,能够变化的代码风格利用mpl.style.available可以查看。
    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
    26
    27
    import matplotlib as mpl
    mpl.style.library
    mpl.style.available
    mpl.style.use('bmh')

    # 可以替换的风格
    #u'seaborn-darkgrid',
    #u'seaborn-notebook',
    #u'classic',
    #u'seaborn-ticks',
    #u'grayscale',
    #u'bmh',
    #u'seaborn-talk',
    #u'dark_background',
    #u'ggplot',
    #u'fivethirtyeight',
    #u'seaborn-colorblind',
    #u'seaborn-deep',
    #u'seaborn-whitegrid',
    #u'seaborn-bright',
    #u'seaborn-poster',
    #u'seaborn-muted',
    #u'seaborn-paper',
    #u'seaborn-white',
    #u'seaborn-pastel',
    #u'seaborn-dark',
    #u'seaborn-dark-palette'

图表中可以有丰富的细节,主要有这些内容:图表名称、图例、X轴刻度和标识、Y轴刻度和标识、箭头、文字说明、辅助线(横线、竖线)、图片大小、位置、中文显示(特殊)、线的细节。由于内容庞杂,这里近列出相关的函数和使用案例,必要时进行说明,更具体的说明请参考官方文档或者Jupyter Notebook中的help内容。

  • 图表标题

    1
    axes.set_title("legend(loc=%d)" % (n+1))
  • 图片大小、位置:回到最开始介绍的“生成画布”部分,通过增加如下的属性设置画布的大小。需要注意,下方add_axes中的四个指标: left, bottom, width,height 都是针对画布来设置的,单位可以理解为“一个画布大小”。借用这个方法可以顺带着完成同一个画布设置多个坐标系的工作。

    1
    2
    3
    4
    5
    fig = plt.figure(figesize = (4,2))
    ax1 = fig.add_axes((0,0,1,1))
    ax2 = fig.add_axes((1,1,2,2),axisbg="#e1e1e1")
    ax3 = fig.add_axes((0.5,0.5,0.5,0.5),axisbg="#e1e1e1")
    ax1.plot(x,y);
  • x、y轴的刻度显示和刻度范围限制

    1
    2
    3
    ax.set_ylim(-15, 40)
    ax.set_yticks([-10, 0, 10, 20, 30])
    ax.set_xticks([-4, -2, 0, 2])
  • x、y轴标识

    1
    2
    ax.set_xlabel("$x$", fontsize=18)
    ax.set_ylabel("$y$", fontsize=18)
  • 图例

    1
    ax.legend(loc=0, ncol=3, fontsize=14, frameon=False);
  • 线条:粗细、类型、颜色、标签:ls-line style、 marker-标记,一般是对需要显示的不同标记点、lw-line width、 color-颜色、 label-标签,用于在图例中显示对应内容。

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    ax.plot(x, y1, lw=1.5, color="blue", label=r"$y(x)$")
    ax.plot?

    #结果如下
    The following format string characters are accepted to control
    the line style or marker:
    ================ ===============================
    character description
    ================ ===============================
    ``'-'`` solid line style
    ``'--'`` dashed line style
    ``'-.'`` dash-dot line style
    ``':'`` dotted line style
    ``'.'`` point marker
    ``','`` pixel marker
    ``'o'`` circle marker
    ``'v'`` triangle_down marker
    ``'^'`` triangle_up marker
    ``'<'`` triangle_left marker
    ``'>'`` triangle_right marker
    ``'1'`` tri_down marker
    ``'2'`` tri_up marker
    ``'3'`` tri_left marker
    ``'4'`` tri_right marker
    ``'s'`` square marker
    ``'p'`` pentagon marker
    ``'*'`` star marker
    ``'h'`` hexagon1 marker
    ``'H'`` hexagon2 marker
    ``'+'`` plus marker
    ``'x'`` x marker
    ``'D'`` diamond marker
    ``'d'`` thin_diamond marker
    ``'|'`` vline marker
    ``'_'`` hline marker
    ================ ===============================

    The following color abbreviations are supported:
    ========== ========
    character color
    ========== ========
    'b' blue
    'g' green
    'r' red
    'c' cyan
    'm' magenta
    'y' yellow
    'k' black
    'w' white
    ========== ========

对应的各种线型和Marker的标示展示
line styles
marker_reference1
marker_reference12

  • 辅助线(横线):有两种画法,一种是利用numpy的函数构造出对应的坐标,一种是给出线段的起始点,第二种方法在下面会具体介绍。方法一的好处是直线可以贯穿整个图形,并且根据x轴的取值范围变化。方法二的好处是画线段方便。

    1
    2
    ax.plot(x,np.zero_like(x)+1 , color='black',ls ='--',lw=0.5)
    ax.plot([0,9],[0.4,0.4],ls='--',lw = 1,color = 'red')
  • 辅助线(竖线与其他直线段):下面代码中第一个[x1,x2]里面都是x坐标,第二个[y1,y2]都是y坐标,画出来的是从(x1,y1)到(x2,y2)的线段。基于这个原理,在图中根据需要画线段变得很简单了。

    1
    2
    ax.plot([3,3],[0,5],ls='--',lw = 0.5,color='black')
    ax.plot([3,1],[0,5],ls='--',lw = 0.5,color='black')

图表类型

基本的图表类型:

  • 线型图
  • 条状图(bar)
  • 直方图(hist)
  • 散点图(scatter)
  • 饼图
  • 极坐标
  • 雷达图
  • stem
  • errorbar
  • step

看完了是否已经蠢蠢欲动,赶紧探索起来吧。

声明: 本文转载需标明出处,禁止用于商业目的。

ChangeLog

161203 新建
161205 发布