Python机器学习库笔记(2)——matplotlib.pyplot
matplotlib是Python数据科学中常用的绘图工具库,我们常用到的是其中一个叫pyplot的子库,它能让我们作出像matlab中的图。掌握matplotlib.pyplot是机器学习项目中数据可视化的关键。
基本用法
1 | import numpy as np |
设置中文
当不改变参数时,matplotlib作的图上的中文会变成方框,因此需要手动修改字体。
1 | import matplotlib as mpl |
图形实例
通常先创建一个figure()实例,之后可以操作这个图形的名称、坐标轴、图例等。
figure()可以接收多个参数,以下列出几个常用的参数:
num:指定画布的编号,如果使用pycharm等IDE,它也是画布窗口的名称。figsize:指定画布的大小。dpi:指定图形的分辨率。facecolor:指定画布的背景色。
1 | plt.figure(num=0, figsize=(5, 5), dpi=72, facecolor='k') |
当调用figure()时,除了创建画布对象外,还会获得当前的绘图区域,之后进行的操作默认在当前绘图区域进行。如果figure()不传入任何参数,实际上是在subplot(111)上作图。
折线图
plt.plot()前两个参数接收X轴和Y轴的变量,此外还可以接受多个参数以改变图形主体的外观:
color(可简写为c):指定曲线的颜色,可以用常用颜色的英文(或其首字母),也可以制定RGB值(如#00FFFF)。marker:指定数据点的类型,如o代表圆点,s代表方块,x代表叉号,等等。linewidth:指定曲线的宽度。linestyle:指定曲线的类型,如-代表实线,--代表虚线,-.代表点划线,等等。alpha:指定曲线的透明度。
1 | x = np.sort(np.random.rand(100)) |
用于设定外观的的参数可以用简写,例如下面这个"bx--"参数相当于color='b', marker='x', linestyle='--':
1 | # plt.plot(x, y, color='b', marker='x', linestyle='--') |
散点图
用plt.scatter()来绘制散点图,除了上述在折线图可用的参数外,散点图还有其他一些可选参数:
s:点的大小,可以设置为与数据数组大小相同的数组来指定每个点的大小。(同样,颜色也可以这样指定)
1 | x = np.random.randn(50) |
柱状图
plt.bar()用于绘制柱状图,它还可以接受如下的参数:
height:用数组指定每个柱子的高度。width:指定柱子的宽度。align:设置对齐方式,默认是center。
1 | n = 5 |
在一个坐标系中显示多组数据,可以用如下的方法:
1 | n = 5 |
箱线图
plt.boxplot()可以用于绘制箱线图,它默认的构造方法已经足够使用。以下列出一些其他可能用到的参数:
vert:布尔型,指定图的方向,True为纵向,False为横向。patch_artist:布尔型,指定四分位框内是否填充,True为填充。
1 | x = np.random.randn(100).reshape(20, 5) |
饼图
plt.pie()用于绘制饼图,它可接收如下参数:
explode:当要把某一部分凸出时,将对应的值设为0.1就够。labels:对应每个部分的标签。autopct:显示百分比的格式。shadow:是否显示阴影。startangle:起始角度,从X轴起逆时针旋转的度数。
1 | x = [10, 30, 20, 40] |
热图
plt.imshow()可以用于生成热图,分析变量间相关性时常用此图。imshow()主要接收如下参数:
x:即数据,可以是二维浮点型(灰度)、三维浮点型或unit8(RGB)或者四维浮点型或unit8(RGBA)数组。cmap:用于指定颜色图谱,默认为RGB(A)色彩空间,其余用的比较多的有gray、jet等。interpolation:插值方法,默认为nearest(不同版本可能有差异),用其他方法可以平滑色块边缘。
通常还会定义一个plt.colorbar()用于标识颜色。
shrink:设置Bar的长度(比例)。
1 | x = np.random.rand(10, 10) |
显示图像
plt.imshow()也能够显示栅格图像,一个很常见的例子是用于显示MNIST的手写数字。
1 | a = np.random.rand(1024).reshape(32, 32) |
图形的其他元素
坐标轴
坐标轴可以手动设置范围、刻度等。以X轴为例:
plt.xlim:设置坐标轴的范围。plt.xlabel:设置坐标轴的名称。plt.xticks:设置坐标轴的刻度,可以接收一个数组,也可以接受一对数组及其对位的刻度。
1 | x = np.linspace(-5, 5, 100) |
利用plt.gca()(Get Current Axis)可以对当前绘图区域的坐标轴进行更多操作,例如将两条坐标轴置于中间变成十字形。
ax.set_title:设置图表标题。ax.set_xlabel:设置坐标轴的名称。ax.set_xticks:设置坐标轴的刻度。ax.set_xticklabels:设置上面所设置刻度对应的标签。ax.spines['left']:一幅图共有四个坐标轴,分别用left、right、top、bottom表示。ax.spines['left'].set_color:设置该轴颜色,将颜色设置为none可以隐藏该轴。ax.spines['left'].set_position:设置坐标轴的位置,用'data'将坐标轴移动到第二个参数指定的数据处。如设置到坐标原点即ax.spines['left'].set_position(('data', 0))。ax.xaxis.set_ticks_position:设置刻度相对于坐标轴的位置。
1 | x = np.linspace(-5, 5, 100) |
标题、图例、网格
一幅完整的图还包括标题、图例。
标题可以通过plt.title()方法设置,同时可以传入参数设置标题的颜色、字体等。
图例可以通过plt.legend()方法显示,前提是创建图形时传入了label参数。还可以接收loc参数来指定图例的位置,一般指定为best即可,图例会被自动放在最合适的位置。
如果要显示网格,可以通过plt.grid()方法显示。通过传入axis参数可以指定显示'x'、'y'或者'both'方向上的网格线。网格线也可以使用color等参数。
1 | x = np.linspace(-5, 5, 100) |
标注
当需要特别标注出图上一个点时,先需要标出该点,过该点向坐标轴引一条垂线,再用箭头将其标注出来。matplotlib提供了annotate()的方法来让我们实现这一功能。
annotate()第一个参数接收一组字符串作为显示的标注文字,其余部分参数如下:
xy:被标注的点坐标。xytext:标注文字的坐标。arrowprops:字典类型的参数,定义箭头的属性。arrowstyle:arrowprops的一个键,用于设置箭头的形状,如'->'。
1 | x = np.linspace(-5, 5, 100) |
绘制子图
subplot()用法
pyplot提供了subplot这一方法来在一幅画布中绘制多个子图。plt.subplot(m,n,k)表示将画布分成m行n列,此图位于第k个位置(先从左往右、再从上往下数)。
1 | x = np.linspace(-5, 5, 100) |
plt.subplot(m,n,k)的参数中的逗号可以省略。并且每幅子图并不一定要大小一致,例如:
1 | plt.figure() |
subplots()用法
plt.subplots()是另一种创建子图的方法。返回的类型是元组,第一个是画布对象,第二个是子图的集合。
传入sharex和sharey参数可以决定子图的X轴、Y轴的范围是否一致。
1 | fig, ax = plt.subplots(2, 2, sharex=True, sharey=False) |
共享坐标轴
有时需要在一幅子图中展示两组数据,可以用twinx()或者twiny()的方法。
1 | x = np.linspace(-5, 5, 100) |