Matplotlib是Python的一个2D图形库,能够生成各种格式的图形,且生成图形质量较高。pyplot是Matplotlib的一个模块,使得Matplotlib的使用方式类似于MATLAB,常在深度学习中用于数据可视化。
官网:matplotlib.org
源代码:github matplotlib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 若在jupyter notebook中运行,可添加如下的魔术命令,使图形在展示时嵌入Out[]中
%matplotlib inline
# 要显示高清矢量图,还需进行如下设置
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')
目录
1 快速入门
1.1 绘制图像
通过函数plt.figure()
创建图形窗口(figure),使用绘图函数(如plot()
)绘制线型图
fig1 = plt.figure() # 创建新图窗
x = [1, 2, 3, 4, 5] # 数据的x值
y = [1, 5, 19, 52, 137] # 数据的y值
plt.plot(x, y) # plot函数:先描点,再连线
1.2 保存图像
使用方法.savefig()
保存图像,具体参数如下:
fig1.savefig(fname, dpi=None, format=None, **kwargs)
- filename:要保存的文件名(绝对路径或相对路径)
- dpi:可选参数,指定分辨率,默认为None,即使用默认分辨率
- format:可选参数,指定保存的图像格式。若未指定则根据文件扩展名自动推断
- kwargs:其他可选参数,用于传递给底层图像库的选项
可保存为eps、jpg、pdf、png、ps、svg等格式,建议用svg矢量格式,例如
fig1.savefig(r'/Users/Example/Pictures/my_pic.jpg')
1.3 两种画图方式
Matplotlib中有两种画图方式:Matlab方式和面向对象方式。两种方式通常可以相互转化。
1.1中的绘图操作为Matlab方式,如下所示
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y)
面向对象方式中,用函数plt.axes()
返回坐标轴(axes),其调用绘图方法(如.plot()
)来进行相似的绘图操作
# 面向对象方式
fig1 = plt.figure()
ax1 = plt.axes()
ax1.plot(x, y)
2 多图绘制
画一幅图需在一个代码块内完成,不得分块。
# 准备数据
x = [1, 2, 3, 4, 5]
y1 = [1, 2, 3, 4, 5]
y2 = [0, 0, 0, 0, 0]
y3 = [-1, -2, -3, -4, -5]
2.1 绘制多线条
在同一个图窗内绘制多线条
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
# 面向对象方式
fig1 = plt.figure()
ax1 = plt.axes()
ax1.plot(x, y1)
ax1.plot(x, y2)
ax1.plot(x, y3)
2.2 绘制多子图
在不同图窗内显示每条曲线
Matlab方式中,使用函数plt.subplot(nrows, ncols, index, **kwargs)
创建指定位置的子图,紧接其后进行绘图操作
# Matlab方式:
fig1 = plt.figure()
plt.subplot(3, 1, 1), plt.plot(x, y1)
plt.subplot(3, 1, 2), plt.plot(x, y2)
plt.subplot(3, 1, 3), plt.plot(x, y3)
面向对象方式中,可用函数plt.subplots(nrows=1, ncols=1, ...)
返回图窗和一系列子图,代替了plt.figure()
和plt.axes()
# 面向对象方式
fig1, ax1 = plt.subplots(3)
ax1[0].plot(x, y1)
ax1[1].plot(x, y2)
ax1[2].plot(x, y3)
3 图表类型
matplotlib提供5类基本图表:二维图、网格图、统计图、轮廓图、三维图。常用的图表函数如下所示
3.1 二维图
二维图需要两个向量来绘图,以下仅演示plot()
线型图函数
# 准备数据
x = [1, 2, 3, 4, 5]
y1 = [0, 1, 2, 3, 4]
y2 = [1, 2, 3, 4, 5]
y3 = [2, 3, 4, 5, 6]
y4 = [3, 4, 5, 6, 7]
y5 = [4, 5, 6, 7, 8]
线型图通过设置以下属性,可替代其它所有二维图
3.1.1 设置颜色
plot()
函数的color
参数可以设置线条的颜色
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, color='#7CB5EC')
plt.plot(x, y2, color='#F7A35C')
plt.plot(x, y3, color='#A2A2D0')
plt.plot(x, y4, color='#F6675D')
plt.plot(x, y5, color='#47ADC7')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, color='#7CB5EC')
ax1.plot(x, y2, color='#F7A35C')
ax1.plot(x, y3, color='#A2A2D0')
ax1.plot(x, y4, color='#F6675D')
ax1.plot(x, y5, color='#47ADC7')
3.1.2 设置风格
plot()
函数的linestyle
参数可以设置线条的风格:-
表示实线,--
表示虚线,-.
表示点虚线,:
表示点线,
表示隐藏该线条
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, linestyle='-')
plt.plot(x, y2, linestyle='--')
plt.plot(x, y3, linestyle='-.')
plt.plot(x, y4, linestyle=':')
plt.plot(x, y5, linestyle='')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, linestyle='-')
ax1.plot(x, y2, linestyle='--')
ax1.plot(x, y3, linestyle='-.')
ax1.plot(x, y4, linestyle=':')
ax1.plot(x, y5, linestyle='')
3.1.3 设置粗细
plot()
函数的linewidth
参数可以设置线条的粗细,数字表示磅数,一般以0.5~3为宜。
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, linewidth=0.5)
plt.plot(x, y2, linewidth=1)
plt.plot(x, y3, linewidth=1.5)
plt.plot(x, y4, linewidth=2)
plt.plot(x, y5, linewidth=2.5)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, linewidth=0.5)
ax1.plot(x, y2, linewidth=1)
ax1.plot(x, y3, linewidth=1.5)
ax1.plot(x, y4, linewidth=2)
ax1.plot(x, y5, linewidth=2.5)
3.1.4 设置标记
plot()
函数的marker
参数可以设置线条的标记,标记的尺寸由markersize
参数调整,其值以 3 至 9 为宜
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, color='#7CB5EC', linestyle='-', linewidth=2, marker='o', markersize=6)
plt.plot(x, y2, color='#F7A35C', linestyle='--', linewidth=2, marker='^', markersize=6)
plt.plot(x, y3, color='#A2A2D0', linestyle='-.', linewidth=2, marker='s', markersize=6)
plt.plot(x, y4, color='#F6675D', linestyle=':', linewidth=2, marker='D', markersize=6)
plt.plot(x, y5, color='#47ADC7', linestyle=' ', linewidth=2, marker='o', markersize=6)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, color='#7CB5EC', linestyle='-', linewidth=2, marker='o', markersize=6)
ax1.plot(x, y2, color='#F7A35C', linestyle='--', linewidth=2, marker='^', markersize=6)
ax1.plot(x, y3, color='#A2A2D0', linestyle='-.', linewidth=2, marker='s', markersize=6)
ax1.plot(x, y4, color='#F6675D', linestyle=':', linewidth=2, marker='D', markersize=6)
ax1.plot(x, y5, color='#47ADC7', linestyle=' ', linewidth=2, marker='o', markersize=6)
3.2 网格图
网格图需要一个矩阵来绘图,以下仅演示imshow()
函数
# 准备数据
x = np.linspace(0,10,1000)
I = np.sin(x) * np.cos(x).reshape(-1,1)
Matlab方式中可以配置颜色条,面向对象方式无此功能
# Matlab方式
fig1 = plt.figure()
plt.imshow(I)
plt.colorbar() # 设置颜色条
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.imshow(I)
3.3 统计图
统计图一般做数据分析时使用,以下仅演示hist()
函数
# 创建10000个标准正态分布的样本
data = np.random.randn(10000)
对生成的直方图求积分,结果即为个体总数,即10000。
# Matlab方式
fig1 = plt.figure()
plt.hist(data)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data)
3.3.1 区间个数
hist()
函数的bins
参数为区间划分的数量,默认为10
# Matlab方式
fig1 = plt.figure()
plt.hist(data, bins=30)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, bins=30)
3.3.2 透明度
hist()
函数的alpha
参数表示透明度,默认为1
# Matlab方式
fig1 = plt.figure()
plt.hist(data, alpha=0.5)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, alpha=0.5)
3.3.3 图表类型
hist()
函数的histtype
属性表示类型,默认为bar
,可改为stepfilled
,使图形浑然一体
# Matlab方式
fig1 = plt.figure()
plt.hist(data, histtype='stepfilled')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, histtype='stepfilled')
3.3.4 直方图颜色
hist()
函数的color
属性表示直方图的颜色
# Matlab方式
fig1 = plt.figure()
plt.hist(data, color='#A2A2D0')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, color='#A2A2D0')
3.3.5 边缘颜色
hist()
函数的edgecolor
表示直方图边缘的颜色
# Matlab方式
fig1 = plt.figure()
plt.hist(data, bins=30, alpha=0.5, color='#7CB5EC', edgecolor='#FFFFFF')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, bins=30, alpha=0.5, color='#7CB5EC', edgecolor='#FFFFFF')
4 图窗属性
4.1 坐标轴上下限
手动设置坐标轴上下限的各种方法如下
# 准备数据
x = [1, 2, 3, 4, 5] # 数据的 x 值
y = [1, 8, 27, 64, 125] # 数据的 y 值
4.1.1 lim法
Matlab方式中通过plt.xlim()
、plt.ylim()
函数来修改x、y轴坐标上下限,如下所示
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y)
plt.xlim(1, 5)
plt.ylim(1, 125)
面向对象方式中则使用对应的以.set_
开头的方法来设置
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_xlim(1, 5)
ax1.set_ylim(1, 125)
4.1.2 axis法
使用函数plt.axis()
进行设置,所传序列中元素应对应各轴上下限,注意观察
还可使用plt.axis('equal')
,使得x轴与y轴的比例达到1:1,长度等长
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y)
plt.axis([1, 5, 1, 125])
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.axis([1, 5, 1, 125])
4.2 标题与轴名称
使用4.1中的数据
Matlab方式使用plt.title()
、plt.xlabel()
、plt.ylabel()
函数来修改各属性
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y)
plt.title("For Example")
plt.xlabel("x")
plt.ylabel("y")
面向对象方式中则使用对应的以.set_
开头的方法来设置(参考4.1.1)
统一设置:ax1.set(xlim=(), ylim=(), title=' ', xlabel=' ', ylabel=' ')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("For Example")
ax1.set_xlabel("x")
ax1.set_ylabel("y")
# ax1.set(...)
4.3 图例
一般在二维图与统计图中使用图例,网格图中则用颜色条。
# 准备数据
x = [1, 2, 3, 4, 5]
y1 = [1, 2, 3, 4, 5]
y2 = [0, 0, 0, 0, 0]
y3 = [-1, -2, -3, -4, -5]
用plt.legend(**kwag)
函数显示图例,有3个常用关键字参数:
- loc:图例位置,可取值为
upper
/center
/lower
和left
/center
/right
中各取1个的组合,也可为best
。默认在角落。 - frameon:是否显示图例边框,默认为True。
- ncol:图例的列数,默认为1。
有以下两种显示方式,结果基本一致:
- 法1:通过给绘图函数传入
label
属性来设置曲线在图例中的名称,再使用legend()
显示
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, label='y=x')
plt.plot(x, y2, label='y=0')
plt.plot(x, y3, label='y=-x')
plt.legend()
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, label='y=x')
ax1.plot(x, y2, label='y=0')
ax1.plot(x, y3, label='y=-x')
ax1.legend()
- 法2:给
legend()
传入一个列表,列表中每个元素对应于每条曲线的图例
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.legend(['y=x', 'y=0', 'y=-x'])
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1)
ax1.plot(x, y2)
ax1.plot(x, y3)
ax1.legend(['y=x', 'y=0', 'y=-x'])
4.4 网格
用grid()
显示网格,亦可以设置color
与linestyle
参数(同plot()
中的用法)
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.grid()
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1)
ax1.plot(x, y2)
ax1.plot(x, y3)
ax1.grid()