Matplotlib快速上手

首先导入相关包:import matplotlib.pyplot as plt

基本原理

使用Matplotlib画图时,第一步需要创建一个图形,然后在这个图形上设置相应的区域,最后在指定的区域进行绘图

1
plt.figure() # 创建图形

在图形上设置区域,可以直接设置坐标轴(相当于只有一个子图),也可以设置多个子图区域
1
2
plt.axes() # 一个子图
plt.subplot(2, 1, 1) # 两行一列的子图区域中的第一个子图

最后就可以用plot()函数进行画图了
1
2
x = np.linspace(0, 10, 1000)
plt.plot(x, np.sin(x))

两种画图接口

按照上述基本原理,有两种不同风格的画图接口,我们一般建议使用面向对象的接口,因为这种模式逻辑清晰,利于绘制复杂的图像

  • Matlab风格接口
    1
    2
    3
    4
    5
    plt.figure() # 创建图形
    plt.subplot(2, 1, 1) # 第一个子图 (行、列、子图编号,也可合并成三位数字)
    plt.plot(x, np.sin(x))
    plt.subplot(2, 1, 2) # 第二个子图
    plt.plot(x, np.cos(x))
    这种风格的接口会自动维护“当前的”图形和坐标轴,plt的各种绘图操作就会在“当前的”图形和坐标轴上进行。显然,这是一种隐式的区域控制
  • 面向对象接口
    1
    2
    3
    4
    5
    6
    fig = plt.fiture() # 创建图形
    ax = fig.add_subplot(211) # 在图形中划分子图区域
    # -------------------------------------------------------------------
    fig, ax = plt.subplots(2) # 或者一次性创建图形和子图区域,ax包含两个Axes对象
    ax[0].plot(x, np.sin(x)) # 在每个对象上调用plot()方法
    ax[1].plot(x, np.cos(x))
    这种风格的接口把创建的图形和坐标轴以对象的形式返回,我们可以通过对象调用相应的绘图函数,显式地实现在特定的图形和坐标轴上绘图,所以,我们推荐使用面向对象的接口

图形风格设置

1
2
3
fig = plt.figure()
ax = plt.axes()
ax.plot(x, np.sin(x), color='r', linestyle='--')

通过color、linestyle、marker三个参数调整图形的颜色、线形风格与标记符号

颜色字符 说明 颜色字符 说明
‘b’/‘blue’ 蓝色 ‘m’/‘magenta’ 洋红色
‘g’/‘green’ 绿色 ‘y’/‘yellow’ 黄色
‘r’/‘red’ 红色 ‘k’/‘black’ 黑色
‘c’/‘cyan’ 青绿色 ‘w’/‘white’ 白色
‘#008000’ RGB某颜色 ‘0.8’ 灰度值
风格字符 说明 风格字符 说明
‘-‘ 实线 ‘—‘ 虚线
‘-.’ 点划线 ‘:’ 点线
‘’ ‘ ‘ 无线条
标记字符 说明 标记字符 说明 标记字符 说明
‘.’ 点标记 ‘1’ 下花三角标记 ‘h’ 竖六边形标记
‘,’ 像素标记(极小点) ‘2’ 上花三角标记 ‘H’ 横六边形标记
‘o’ 实心圈标记 ‘3’ 左花三角标记 ‘+’ 十字标记
‘v’ 倒三角标记 ‘4’ 右花三角标记 ‘x’ 叉标记
‘^’ 上三角标记 ‘s’ 实心方形标记 ‘D’ 菱形标记
‘>’ 右三角标记 ‘p’ 实心五角标记 ‘d’ 瘦菱形标记
‘<’ 左三角标记 ‘*‘ 星形标记 ‘\ 垂直线标记

可以把三者组合成字符串作为参数传入plot( ),如:”g-o”(绿色实线圆点)、”—c”(青色虚线)

显示中文

确保能正确显示中文,需要加入一行代码

1
plt.rcParams["font.family"]="SimHei"

|rcParams属性|说明|
|—————-|——|
|’font.family’|用于显示字体的名字:’SimHei’(黑体)、’Kaiti’(楷体)、’LiSu’(隶书)、
‘FangSong’(仿宋)、’YouYuan’(幼圆)、’STSong’(宋体)|
|’font.style’|字体风格:’normal’(正常)、’italic’(斜体)|
|’font.size’|字体大小,整数字号或者’large’、’x-small’|

丰富图示

丰富图示包括添加坐标轴上的标签、表头以及图例等说明信息,另外设置坐标轴的上下限、刻度,以及对刻度设置标签与刻度线,甚至在图示中增加文字说明,从而使所绘制的图像更易于阅读与理解

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
# 准备数据
potato = [70, 73, 58, 68, 83, 92, 96]
tomato = [61, 54, 62, 55, 76, 87, 91]
x = np.arange(1, 8)

# 绘制线形图
ax.plot(x, potato, "-r", label="土豆")
ax.plot(x, tomato, ":b", label="番茄")

# 设置坐标轴的上下限
ax.set_xlim(0.9, 7.1) # x轴从1到7.1
ax.set_ylim(40, 100) # y轴从40到100

# 设置显示的刻度
ax.set_xticks(np.linspace(1, 7, 7))
ax.set_yticks(np.linspace(50, 100, 6))

# 设置刻度标签
ax.set_xticklabels(["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", \
"星期日"], rotation=30)
ax.set_yticklabels(["50kg", "60kg", "70kg", "80kg", "90kg", "100kg"])

# 设置刻度线
ax.tick_params("x", left=False, pad=8, direction="in", length=2, width=3, \
color="b", labelsize=12)

# 设置坐标轴的标签
ax.set_xlabel("星期")
ax.set_ylabel("销售量", fontsize=16)

# 设置表头(标题)
ax.set_title("蔬菜销量统计",fontsize=18, backgroundcolor='#d1ffdb', \
fontweight='bold', color='r', verticalalignment="baseline")
# 设置图例
ax.legend(loc=4, labelspacing=0.5, handlelength=2, \
fontsize=14, shadow=True)

# 增加文字说明
ax.text(7, 97, "max:96", fontsize=14, color="g", alpha=1)

# 增加标注
ax.annotate(s="min:70", xy=(1,70), xytext=(1.3,66), \
arrowprops=dict(facecolor="y", shrink=0.05, \
headwidth=12, headlength=6, width=4), \
fontsize=12)

一些值得关注的参数解释:

  • trick_params()函数:
    — axis:可选”x”,”y”,”both”,默认”both”对两个轴都操作
    — direction:可选 “in”,”out”,”inout”代表,刻度线显示在坐标轴里面,坐标轴外边,双边
    — pad:刻度线与刻度标签之间的间隔
    — bottom, top, left, right四个参数对应四个边框,它们的取值为布尔类型,True表示显示对应边框上的刻度线,False代表不显示,默认True

  • set_title()函数:
    — verticalalignment:设置水平对齐方式 ,可选参数 :’center’, ‘top’, ‘bottom’, ‘baseline’

  • legend()函数:
    — loc:可取”best”,1(“upper right”),2(“upper left”),3(“lower left”),4(”lower right”)代表放不同位置
    — labelspacing:图例中条目之间的距离
    — handlelength:图例句柄的长度

  • text()函数:
    — alpha:透明度,参数值0至1之间
    — rotation:旋转角度,可选参数为:vertical,horizontal,也可以为数字

  • annotate()函数:
    — arrowprops:此参数中提供箭头属性字典来绘制从文本到注释点的箭头。{ width: 箭把宽度, frac: 箭头头部所占的比例, headwidth: 箭头头部宽度, headlength: 箭头长度, facecolor: 填充色, shrink: 使箭头离注释点和文本具有一定距离 }

保存与呈现

最后,将绘制的图片进行呈现或保存;如果呈现与保存需要同时进行,代码中应该先保存后show()

1
2
plt.savefig("figure.jpg")
plt.show()

最终我们绘制出了如下所示的线形图