0.1 简介
Matplotlib 是 Python 下基础的 2d 绘图库(也可以绘制 3d,但是需要额外安装工具包),它的起源是模仿 MATLAB 的图形命令,尽管看起来与 MATLAB 很相似但是它们并不相关,它可以绘制高质种图形,包含条形图、盒图、直方图、散点图、饼图等等。
在机器学习中,通常使用 Matplotlib 来展现数据,观察数据,从而分析出数据模型。在数据分析领域它有很知名的地位,而且具有丰富的拓展,能够实现强大的功能。
在 API 方面,Matplotlib 提供了一个名为 matplotlib.pyplot 的工具集,开发者可以需要几行代码就可以绘制精致的图形,关于matplotlib.pyplot 的更详细的说明可以参见官方文档:
https://matplotlib.org/api/pyplot_api.html
0.2 安装
Matplotlib 是 python 库,因此我们建议使用 3.6 版本的 Python。通过 Python 自带的包管理工具 pip 可以很轻松的安装 Matplotlib,安装时我们可以在 cmd 输入并执行下面的命令:
pip install –i <https://pypi.tuna.tsinghua.edu.cn/simple> matplotlib
-i 及后面的链接代表我们从清华的 pypi 镜像下载安装。通常情况下在国内使用镜像安装能有更快的下载速度。
0.3 导入
我们通过 import 语句导入 matplotlib.pyplot:
import matplotlib.pyplot as plt
plt
输出
<module 'matplotlib.pyplot' from 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\pyplot.py'>
如果是在 juypter notebook 中,则可以使用下面的命令将绘制的图像嵌入到 notebook 里:
%**matplotlib** inline
0.4 基本绘图
首先我们使用 plot() 函数绘制一个折线图,在函数中我们需要传入 2 个数组,分别代表 x 轴与 y 轴的取值,然后我们要使用 show() 函数来显示图像。
import matplotlib.pyplot as plt
plt.plot([1,2,3,4,5],[2,3,4,2,6])
0.5 绘制多个线条
我们也可以在一张图中绘制多个线条:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1,5,num = 5)
for i in range(5):
plt.plot(x, x + i)
plt.show()
0.6 格式字符串
在 plot() 函数中前两个参数为数组或常量,那么第三个参数可以指定颜色标记与线条样式。
颜色指线条的颜色,标记是用指定的样式来标记数组中的点,线条样式则有实线、虚线、点线等等。
格式字符串由颜色,标记和线条的部分组成:fmt = ’[color][marker][line]’
例如我们需要设置颜色为绿色(用 g 表示),标记为点(用. 表示),线条用虚线(用--表示), 那么 fmt = ‘g.--’
如 果 需 要 完 整 的 格 式 字 符 串 的 列 表, 我 们 可 以 去 参 考 官 方 文 档:
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html
上述程序如下:
import matplotlib.pyplot as plt
plt.plot([1,2,3,4,5], [1,2,3,4,5], 'g.--')
plt.show()
当然我们可以省略格式字符串中某些项,那么映射到图上同样也省略了该项,不指定线类型时,默认是直线:
import matplotlib.pyplot as plt
plt.plot([1,2,3,4,5], [1,2,3,4,5], 'g')
plt.show()
0.7 标记可以单独指定
marker 指定标记的形状,markerfacecolor 指定标记颜色,marksize 指定标记大小:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5,5,50)
y = np.cos(x)
plt.plot(x, y, 'g', marker = 'D', markerfacecolor = 'c', markersize = 10)
plt.show()
0.8 线宽
通过 linewidth 参数调整线的宽度:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5)
for i in range(1,5):
plt.plot(x, i*x, linewidth = i)
plt.show()
0.9 标题
通过 plt.title() 函数给图片加上标题,fontsize 参数设置字体大小(中文显示,请尝试自行搜索解决方法)
import matplotlib.pyplot as plt
x = range(5)
plt.plot(x,x)
plt.title('y = x',fontsize = 20)
plt.show()
0.10 轴标
通过 plt.xlabel() 和 plt.ylabel() 可以给横纵坐标轴加上标签,同样 fontsize 可以设置字体大小:
import matplotlib.pyplot as plt
plt.plot([1,2,3,4,5], [5,4,3,2,1])
plt.xlabel('X-label', fontsize = 20)
plt.ylabel('Y-label', fontsize = 20)
plt.show()
0.11 标注
通过 plt.annotate() 函数进行标注,参数 xy 与 xytext 表示标注的点与标注的文本所在的位置,arrowprops 设置标注箭头的属性,fontsize 设置字体大小:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3)
y = 2*x**2+1
plt.plot(x, y)
plt.annotate('(0, 1)', xy = (0, 1), xytext = (0.2, 5),
arrowprops = dict(facecolor = 'black', shrink = 0.05), fontsize = 20)
plt.show()
0.12 图例
在 Matplotlib 中,图例用来描述所绘制的对象,图例由若干个条目组成,每个条目又分为左边的标记和右边的文本:
import matplotlib.pyplot as plt
import numpy as np
x = (1,2,3,4,5)
y = x
plt.plot(x, y, 'r', label="line1")
plt.legend(loc = 'best',fontsize = 25)
plt.show()
在 Matplotlib 中,通过 legend() 函数绘制图例,它有多种用法,最常用的做法是:
在调用 plt.plot() 时通过指定 label 参数给正在绘制的对象增加标签通过 plt.legend() 绘制图例,Matplotlib 会根据所有对象的特征和标签自动生成图例条目,进而生成整个图例 legend() 有很多参数,常用的参数有:
通过 loc 参数指定图例的位置,如果取值为 0 或 best,则会放置到最合适的位置, 取值 1 为右上角,2 为左上角通过 ncol 定义图例有几列通过 fontsize 指定图例中文本的大小更多 lengend() 的用法,请参见官方文档 https://matplotlib.org/users/legend_guide.html
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
x = np.linspace(-5, 5)
plt.plot(x,x**2-10,label='$y = x^2-10$')# 标签内可以使用 LaTeX 语法
plt.plot(x,x,label='y = x')
plt.legend(loc=0,ncol=2,fontsize = 15)
plt.show()
0.13 子图
通过 matplotlib.pyplot.subplot() 创建一个子图
参数 nrows, ncols, index 表示将整个绘图区视为 nrows x ncols 个区域,当前要绘制到第 index 个区域
三个参数可以写在一起,比如 221 表示 2x2 个区域中的第 1 个例如绘制两行一列的图组
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5)
y = x**2
# 将整个画布视为 2x1 的区域,绘制第 1 个区域
plt.subplot(211)
plt.plot(x, y, 'b')
# 将整个画布视为 2x1 的区域,绘制第 2 个区域
plt.subplot(212)
plt.plot(x, y, 'r')
plt.show()
下面是比较复杂的实例:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5)
y = np.sin(x)
# 将整个画布视为 2x3 的区域,绘制第一个区域
plt.subplot(231)
plt.plot(x, y, 'b')
# 将整个画布视为 2x3 的区域,绘制第三个区域
plt.subplot(232)
plt.plot(x, y, 'y')
# 将整个画布视为 2x1 的区域,绘制第二个区域
plt.subplot(212)
plt.plot(x, y, 'r')
plt.tight_layout() # 调整子图的间距
plt.show()
0.14 散点图
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None,vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None,data=None, **kwargs)
常用的参数与基本绘图的使用方法相同
import matplotlib.pyplot as plt
import numpy as np
# 这里使用 multivariate_normal 方法多元正态分布矩阵,
# np.random.multivariate_normal 方法用于根据实际情况生成一个多元正态分布矩阵
# multivariate_normal(mean, cov, size=None, check_valid=None, tol=None)
# mean:mean 是多维分布的均值维度为 1;
# cov:协方差矩阵,注意:协方差矩阵必须是对称的且需为半正定矩阵;
# size:指定生成的正态分布矩阵的维度(例:若 size=(1, 1, 2),则输出的矩阵的-
# shape 即形状为 1X1X2XN(N 为 mean 的长度));
# check_valid:这个参数用于决定当 cov 即协方差矩阵不是半正定矩阵时程序的处理-
# 方式,它一共有三个值:warn,raise 以及 ignore。当使用 warn 作为传入的参数时,
# 如果 cov 不是半正定的程序会输出警告但仍旧会得到结果;当使用 raise 作为传入的-
# 参数时,如果 cov 不是半正定的程序会报错且不会计算出结果;
# 当使用 ignore 时忽略这个问题即无论 cov 是否为半正定的都会计算出结果;
# tol:检查协方差矩阵奇异值时的公差,float 类型;
x = np.random.multivariate_normal([0, 0], [[2, 0], [0, 2]], 150)
plt.scatter(x[: , 0], x[ :, 1 ])# 绘制散点图
plt.show()
0.15 点的标注
import matplotlib.pyplot as plt
xs = [0.21, 0.56, 0.34]
ys = [0.15, 0.46, 0.34]
plt.scatter(xs, ys, marker = 's', color = 'g', s = 100)
for x,y in zip(xs, ys):
plt.annotate('(%s, %s)'%(x, y), xy = (x, y), xytext = (0, -15),
textcoords = 'offset points', ha = 'center', fontsize = 10)
plt.show()
0.16 点的大小
import matplotlib.pyplot as plt
import numpy as np
# 这里使用 multivariate_normal 方法多元正态分布矩阵
x = np.random.multivariate_normal([0, 0], [[2, 0], [0, 2]], 500)
fig = plt.figure(figsize=(15,6))
R = x**2
R_sum = R.sum(axis = 1)
#s 定义点的 size,可以取标量或者数组,alpha 指点的透明度
plt.scatter(x[:,0], x[:,1], s=10*R_sum, color='g', marker='s', alpha=0.5)
plt.show()
0.17 直方图
plt.hist(arr, bins=10, normed=0, facecolor=’black’, edgecolor=’black’,alpha=1,histtype=’bar’)
arr: 需要计算直方图的一维数组
bins: 直方图的柱数,可选项,默认为 10
normed: 是否将得到的直方图向量归一化。默认为 0
facecolor: 直方图颜色
edgecolor: 直方图边框颜色
alpha: 透明度
histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfifilled’
import matplotlib.pyplot as plt
import numpy as np
x = np.random.normal(size=5000)
# 绘制直方图,通过图形的长相,就可以快速的判断数据是否近似服从正态分布
plt.hist(x, bins=50, facecolor = 'green')
plt.show()
0.18 3D 图
使用 matplotlib 绘制 3D 图形,需要通过创建一个新的 axes 对象——Axes3D 来实现,与二维图像不同的是,绘制三维图像主要通过 mplot3d 模块实现。但是,使用 Matplotlib 绘制三维图像实际上是在二维画布上展示,所以一般绘制三维图像时,同样需要载入 pyplot 模块。如果需要更详细的了解 mplot3d 可以访问官方文档。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 绘制 3D 坐标的函数
# 创建一个绘图对象
fig1=plt.figure()
# 用这个绘图对象创建一个 Axes 对象 (有 3D 坐标)
ax=Axes3D(fig1)
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
x = np.arange(-1, 1, 0.02)
y = np.arange(-1, 1, 0.02)
# meshgrid 函数将两个输入的数组 x 和 y 进行扩展,前一个的扩展与后一个有关,
# 后一个的扩展与前一个有关,前一个是竖向扩展,后一个是横向扩展。
X,Y = np.meshgrid(x,y)
Z = X**2 + Y**2
# cmap 为色彩映射,可选值参见官方文档
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='ocean')
# 第一个参数为仰角,第二个为方位角
ax.view_init(45, 15)
plt.show()
0.19 3D 曲线图
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
c = np.linspace(-1,1,100)**2 + 0.5
x = c*np.sin(np.linspace(-10, 10, 100))
y = c*np.cos(np.linspace(-10, 10, 100))
z = np.linspace(-10, 10, 100)
# 给定 3 个坐标数组
ax.plot(x,y,z,color = 'g')
plt.show()
0.20 子图与布局
import matplotlib.pyplot as plt
# 第一个元组参数代表将画布分为 3 行 3 列,第二个元组代表在第一行第一列开始绘制。
# 第一个参数从 1 开始,第二个从 0 开始取值
ax1 = plt.subplot2grid((3, 3), (0, 0))
#colspan 代表占几行,rowspan 代表占几列
ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (1, 1), rowspan=2, colspan=2)
ax1.plot([1, 2, 3], [3, 2, 3], label = 'ax1')
ax2.plot([1, 2, 3], [6, 2, 3], label = 'ax2')
ax3.plot([1, 2, 3], [3, 5, 2], label = 'ax3')
ax4.plot([1, 2, 3], [2, 1, 5], label = 'ax4')
plt.tight_layout() # 调整子图间距
plt.show()
0.21 子图
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1,10,1000)
y1 = np.cos(x)
y2 = np.sin(x)
fig, ax1 = plt.subplots()
left,bottom,width,height = [0.55, 0.23, 0.3, 0.35]
ax2 = fig.add_axes([left,bottom,width,height])
ax1.plot(x,y1)
ax2.plot(x,y2)
plt.show()
0.22 结尾
本文档是对机器学习领域中常用的绘图进行总结,在实际应用中我们应当了解常用的方法,并且针对具体案例时再具体查找官方文档等相关的资料,达到融会贯通的工作状态,工具是其次,解决问题才是你的主要目的。
Matplotlib是Python的2D绘图库,用于创建高质量图表。本文档介绍了如何安装、导入,以及如何使用matplotlib.pyplot进行基本绘图、绘制多个线条、设置格式、添加标题和轴标、标注、图例、子图、散点图、直方图和3D图。在机器学习和数据分析中,Matplotlib是展现和理解数据的重要工具。
916





