Python绘图之Matplotlib绘图基础

本文最后更新于:4 天前

1. 引言

Matplotlib 是一个非常强大的 Python 绘图工具库。

我们先看一个简单的例子:

1
2
3
4
5
6
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5, 6]
y = [2, 3, 4, 5, 6, 7]
plt.scatter(x, y, color='g', marker='o')
plt.show()

运行代码,我们就可以看到图1所示结果:
图1. Matplotlib散点图示例

2. Matplotlib 使用与设置

通过上面的例子,我们可以使用 Matplotlib 很快地绘制出一个数据图;但是,只使用 Matplotlib 中默认的设置绘制出来的图,往往不适合直接放在文章中。因此,我们需要进行一些设置,对数据图美化,使图中的字体、颜色、大小、样式符合我们的要求。

2.1 导入 Matplotlib 库

使用以下代码即可导入 Matplotlib 库:

1
import matplotlib.pyplot as plt

2.2 全局字体样式设置

通常在一片文章中,我们需要绘制多个数据图,并且图中所使用的字体应该是统一,通常图中元素的字体格式都需要单独设置,十分不方便。因此,我们需要进行全局设置,这样只通过一次设置,就可以统一图中所有元素的字体格式。具体代码如下:

1
2
3
4
5
6
7
config = {
"font.family": 'serif',
"font.serif": ['Times New Roman', ]
"font.size": 12,
"mathtext.fontset": 'stix',
}
plt.rcParams.update(config)

下面将详细介绍每一行代码的意思:

  1. 1-6行表示定义一个字典类型的变量 config 来记录我们的字体格式。

  2. 第2行表示设定字体族 font.familyserifserif代表的是 有衬线字体族,其典型代表为 Times New Roman 字体。

    font.family 可以设置为以下值:

    1. serif (典型代表:Times New Roman 等),
    2. sans-serif (典型代表:Arial、Helvetica 等),
    3. cursive (典型代表:Zapf-Chancery 等),
    4. fantasy (典型代表:Western 等),
    5. monospace (典型代表:Courier 等)。
    • 通常文章中一般常用的字体族为 serif 有衬线字体族 和 sans-serif 无衬线字体族。
  3. 第3行表示指定使用字体族中某一具体字体,其键值根据第2行设置(例如,第2行若为 "font.family": 'sans-serif',则需将 "font.serif" 改为 "font.sans-serif")。可以同时指定多个字体,但只有在本地字体库中存在的字体的第一个有效(例如,第一个字体在本地电脑上存在,则只有第一个有效,若第一个不存在,则匹配第二个;若第二个存在就使用第二个,若还是不存在,则匹配第三个;以此类推…)。

    各字体族默认字体如下:

    1. font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
    2. font.sans-serif: DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
    3. font.cursive: Apple Chancery, Textile, Zapf Chancery, Sand, Script MT, Felipa, cursive
    4. font.fantasy: Comic Neue, Comic Sans MS, Chicago, Charcoal, ImpactWestern, Humor Sans, xkcd, fantasy
    5. font.monospace: DejaVu Sans Mono, Bitstream Vera Sans Mono, Computer Modern Typewriter, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace
    • 通常按照各个期刊的要求选择特定字体即可。
  4. 第4行表示设置字体大小。

  5. 第5行表示设置数学公式的字体,Matplotlib 中可以使用 Latex 编辑输入数学公式。

    mathtext.fontset 包含5种字体:dejavusans (默认字体),dejavuserif, cm (Computer Modern), stix, stixsans

    • 一般我们选择 stixstixsansstix 是有衬线的,与 Times New Roman 相似;stixsans 是无衬线的,与 Arial 相似。
  6. 第7行表示使用该全局设置并使其生效。

2.3 坐标轴样式设置

坐标轴设置通常包括 坐标轴刻度间隔、坐标轴刻度标签、坐标轴起止点、坐标轴名称等。接下来将介绍坐标轴的一些基本设置,更高级的用法设置(例如:指数对数坐标、缩放部分坐标轴等)会在以后的文章中详细介绍。

  1. 设置坐标轴名称

    1
    2
    3
    xylabel_fontdict = {'size': 15, 'color': 'k', 'family': 'Times New Roman'}
    plt.xlabel('Step', fontdict=xylabel_fontdict)
    plt.ylabel('$E_{f}^{prediction}$ (eV/atom)', fontdict=xylabel_fontdict)

    设置坐标轴名称很简单,只要使用 plt.xlabelplt.ylabel 即可。

    • 通过 fontdict 参数可以对 坐标轴名称 的字体样式再次进行设置。
    • 第3行中用 $ 括起来的部分表示使用 Latex 数学公式。
  2. 设置坐标轴刻度

    1
    2
    plt.xticks(ticks=[1, 2, 3, 4, 5], labels=['X', 'Y', 'Z', '$\Gamma$', 'X'])
    plt.yticks(ticks=np.arange(0, 51, 10))

    通过使用 plt.xticksplt.yticks 可以设置坐标轴的刻度以及标签。

  3. 设置坐标轴的起止位置
    通常设置完坐标轴刻度,Matplotlib会在设置的范围上下增加一定的空白,使数据点不会处于坐标轴上,但是在科研绘图的时候我们却不需要这样的设置。因此,我们需要强制制定坐标轴的起止位置。

    1
    2
    plt.xlim(xmin=1, xmax=5)
    plt.ylim(ymin=0, ymax=50)

    通过使用 plt.xlimplt.ylim 可以设置坐标轴的起止范围。如有需要,也可以只设置 最大值最小值 中的一个,例如:

    1
    2
    plt.xlim(xmax=5)
    plt.ylim(ymin=0)
  4. 设置坐标轴刻度间隔
    有时候我们的数据很多,可能不方便甚至无法使用 ticks 来设置坐标轴的间隔。但是为了使图更美观,可能就需要强制设置坐标轴刻度的间隔。

    1
    2
    3
    4
    from matplotlib.pyplot import MultipleLocator

    plt.gca().xaxis.set_major_locator(MultipleLocator(2))
    plt.gca().yaxis.set_major_locator(MultipleLocator(1))

    注意:需要先导入 from matplotlib.pyplot import MultipleLocator

2.4 标题的设置

通常在文章中我们不需要设置图的标题,但是我们在PPT或者其它地方展示数据时,有时候会需要有标题,这样我们就可以通过设置直接加上图的标题(当然也可以后期在PPT中添加)。

1
plt.title('XXX散点图', fontdict=None)

添加标题很简单,就一行代码。同样,我们也可以使用 fontdict 参数对标题的字体样式进行单独设置。

3. 结果

我们将上述设置代码整合在一起,看看设置之后的图与图1的差别。

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
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator

config = {
"font.family": 'serif',
"font.size": 12,
"mathtext.fontset": 'stix',
"font.serif": ['Times New Roman'],
}
plt.rcParams.update(config)

x = [1, 2, 3, 4, 5, 6]
y = [2, 3, 4, 5, 6, 7]
plt.scatter(x, y, color='g', marker='o')

xylabel_fontdict = {'size': 14, 'color': 'k', 'family': 'Times New Roman'}
plt.xlabel('Step', fontdict=xylabel_fontdict)
plt.ylabel('$E_{f}^{prediction}$ (eV/atom)', fontdict=xylabel_fontdict)

plt.xticks([1, 2, 3, 4, 5, 6], labels=['X', 'Y', 'Z', '$\Gamma$', 'A', 'B'])
plt.yticks(np.arange(0, 11, 2))

plt.xlim(xmax=5)

plt.gca().yaxis.set_major_locator(MultipleLocator(0.5))

plt.title('优化后的散点图', fontdict={'size': 16, 'color': 'k', 'family': 'Microsoft Yahei'})

plt.show()

执行代码,得到图2。
图2. 优化后的散点图

我们可以看到:

  • 第22行代码,我们设置的y轴间隔是2;但是通过第26行,我们强制将y轴间隔改为了0.5。
  • 通过第24行,我们可以看到,设置坐标轴起止位置的效果。(虽然有数据点在边框上只显示了一半,但是可以通过设置,使其显示完整,这会在后续文章中进行讲解。)

4. 总结

以上就是Matplotlib的一些基础用法和设置,后续会给大家详细介绍常用的一些数据图及其变种的绘图方法。