概述

Matplotlib库由各种可视化类构成, 其 matplotlib.pyplot是绘制各类可视化图形的命令子库(相当于快捷方式)。
其引入方式为:

1
import matplotlib.pyplot as plt # plt作为别名

快速使用:

1
2
3
plt.plot([3, 2.3, 4, 5, 2]) # 若传入一维列表,则将其作为坐标图中的y值,x轴则是列表的索引(自动生成)
plt.ylabel("grade") # 增加y轴名称
plt.show()

输出结果:

1
2
3
#当传入二维列表,将按X轴和Y轴顺序绘制
plt.plot([0, 2, 4, 5.5, 8], [-1, -3, 0, 3, 9])
plt.axis([-1, 10, -5, 10]) # 参数依次为X轴的起点、终点,Y轴的起点、终点

输出结果:

plot 函数

用法:plot.plot(X轴数据, Y轴数据,format_string, **kwargs)

其中,format_string:控制曲线的格式字符串,可选,由颜色字符、风格字符、标记字符组成:

  • 颜色字符如:b:蓝色;#008000:RGB某颜色;0.8:灰度值字符串;…
  • 风格字符如:-:实线;::虚线;…
  • 标记字符,在曲线中每一个数据点的标记符号,如:.:点标记;o:实心圈标记;v:倒三角标记;…
1
2
3
4
5
6
x = np.arange(10)
plt.plot(x, x * 1.5, 'bo-', # 蓝色点实线
x, x * 2.5, 'rx',# 红色交叉点无实线
x, x * 3.5, '*',
x, x * 10, 'y-.') #黄色折点线
plt.show()

输出结果:

pyplot的子绘图区域

1
2
3
plt.subplot(3, 2, 4) 
# 建立一个网格,高3宽2,即分成6个子网格。
# 而最后一个参数指当前子网格所在位置(从上到下、从左到右)

输出结果:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
def energy_degradation(t):
return np.exp(-t) * np.cos(2* np.pi * t)

x = np.arange(0.0, 5.0, 0.02) # 从0.0到5.0,以0.02依次递增
plt.subplot(2, 1, 1) # 分割为高2宽1的网格,且将第一个子网格激活
plt.plot(x, energy_degradation(x))

plt.subplot(2, 1, 2) # 激活第二个子网格
plt.plot(x, np.cos(x), 'r--') # 绘制余弦曲线,并且是虚线
plt.show()

输出结果:

GridSpec类辅助网格设计

1
2
3
4
5
6
7
8
import matplotlib.gridspec as gridspec

gs = gridspec.GridSpec(3, 3) # 3行3列
ax1 = plt.subplot(gs[0, :]) # 选择第0行,并覆盖所有列
ax2 = plt.subplot(gs[1, :-1]) # 选择第1行,覆盖-1之前的所有列
ax3 = plt.subplot(gs[1:, -1]) # 选择第1行以下的所有行,选择-1列
ax4 = plt.subplot(gs[2, 0])
ax5 = plt.subplot(gs[2, 1])

输出结果:

pyplot的中文显示

方法一:通过 rcParams 修改字体

方法二(推荐):在有中文输出的地方,增加属性:fontproperties

pyplot的文本显示函数

  • plt.xlabel():对X轴增加文本标签。plt.

  • plt.text():在任意位置增加

1
2
3
4
5
6
7
8
9
x = np.arange(0.0, 5.0, 0.01)
plt.title(r'正弦波实例 $y = cos(2\pi x)$', fontproperties='SimHei', fontsize=22) # 支持LaTex语法
plt.xlabel('时间', fontproperties='SimHei', fontsize=20)
plt.ylabel('振幅', fontproperties='SimHei', fontsize=20)
plt.text(2, -0.75, r'$\mu=100$', fontsize=15) # 在点(2,1)处显示该文本

plt.grid(True) # 网格线显示
plt.plot(x, np.cos(2 * np.pi * x), 'r--')
plt.show()

输出结果:

1
2
3
4
5
6
7
plt.plot([3, 2.3, 4, 5, 2]) # 若传入一维列表,则将其作为坐标图中的y值,x轴则是列表的索引(自动生成)
plt.ylabel("grade") # 增加y轴名称
plt.grid(True)

#在图表中增加注释文本,xy为箭头坐标,xytext为文本坐标,arrowprops定义箭头属性,shrink是箭头两侧的缩进
plt.annotate(r'$\mu=100$', xy=(2, 4), xytext=(1.5, 4.5), arrowprops=dict(facecolor='black', shrink=0.1, width=1))
plt.show()

输出结果:

应用

plt.pie 函数绘制饼图

1
2
3
4
5
6
7
8
9
plt.pie(
[45, 30, 15, 10], # 占比
explode=(0, 0.1, 0, 0), # 裂开程度
labels=['Chinese', 'Maths', 'English', 'Politics'],
autopct='%1.2f%%', # 输出格式
shadow=False, # 是否阴影
startangle=90 # 起始角度
)
plt.show()

输出结果:

面向对象绘制散点图(官方推荐)

1
2
3
4
5
ax = plt.subplot() # 不传参则默认为1行1列,ax则是当前绘制子区域对象
ax.plot(np.random.randn(100), 10 * np.random.randn(100), 'o')
# randn()函数返回一组样本(传入参数指定容量,即100),并具有标准正态分布
ax.set_title('Simple Scatter')
plt.show()

输出结果: