首先导入相关包:import matplotlib.pyplot as plt
基本原理
使用Matplotlib画图时,第一步需要创建一个图形,然后在这个图形上设置相应的区域,最后在指定的区域进行绘图1
plt.figure() # 创建图形
在图形上设置区域,可以直接设置坐标轴(相当于只有一个子图),也可以设置多个子图区域1
2plt.axes() # 一个子图
plt.subplot(2, 1, 1) # 两行一列的子图区域中的第一个子图
最后就可以用plot()函数进行画图了1
2x = np.linspace(0, 10, 1000)
plt.plot(x, np.sin(x))
两种画图接口
按照上述基本原理,有两种不同风格的画图接口,我们一般建议使用面向对象的接口,因为这种模式逻辑清晰,利于绘制复杂的图像
- Matlab风格接口这种风格的接口会自动维护“当前的”图形和坐标轴,plt的各种绘图操作就会在“当前的”图形和坐标轴上进行。显然,这是一种隐式的区域控制
1
2
3
4
5plt.figure() # 创建图形
plt.subplot(2, 1, 1) # 第一个子图 (行、列、子图编号,也可合并成三位数字)
plt.plot(x, np.sin(x))
plt.subplot(2, 1, 2) # 第二个子图
plt.plot(x, np.cos(x)) - 面向对象接口这种风格的接口把创建的图形和坐标轴以对象的形式返回,我们可以通过对象调用相应的绘图函数,显式地实现在特定的图形和坐标轴上绘图,所以,我们推荐使用面向对象的接口
1
2
3
4
5
6fig = 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 | fig = plt.figure() |
通过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代表不显示,默认Trueset_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
2plt.savefig("figure.jpg")
plt.show()
最终我们绘制出了如下所示的线形图