《scikit-learn机器学习常用算法原理及编程实战》—2.5 Matplotlib简介
2.5 Matplotlib简介
Matplotlib是Python数据可视化工具包。IPython为Matplotlib专门提供了特殊的交互模式。如果要在IPython控制台使用Matplotlib,可以使用ipython --matplotlib命令来启动IPython控制台程序;如果要在IPython notebook里使用Matplotlib,则在notebook的开始位置插入%matplotlib inline魔术命令即可。IPython的Matplotlib 模式有两个优点,一是提供了非阻塞的画图操作,二是不需要显式地调用show()方法来显示画出来的图片。
Matplotlib下的pyplot子包提供了面向对象的画图程序接口。几乎所有的画图函数都与MATLAB类似,连参数都类似。在实际开发工作中,有时候甚至可以访问MATLAB的官方文档cn.mathworks.com/help/matlab来查询画图的接口和参数,这些参数可以直接在pyplot下的画图函数里使用。使用pyplot的习惯性写法是:
from matplotlitb import pyplot as plt
在机器学习领域中,我们经常需要把数据可视化,以便观察数据的模式。此外,在对算法性能进行评估时,也需要把模型相关的数据可视化,才能观察出模型里需要改进的地方。例如,我们把算法的准确度和训练数据集大小的变化曲线画出来,可以清晰地看出训练数据集大小与算法准确度的关系。这就是我们需要学习Matplotlib 的原因。
2.5.1 图形样式
通常使用IPython notebook的Matplotlib模式来画图,这样画出来的图片会直接显示在网页上。要记得在notebook的最上面写上魔术命令%matplotlib inline。
使用Matplotlib的默认样式在一个坐标轴上画出正弦和余弦曲线:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-np.pi, np.pi, 200)
C, S = np.cos(x), np.sin(x)
plt.plot(x, C) # 画出余弦曲线
plt.plot(x, S) # 画出正弦曲线
plt.show()
接着,通过修改Matplotlib的默认样式,画出我们需要的样式图片。如图2-8左侧为默认样式画出来的正余弦曲线,右侧为调整后的正余弦曲线。
图2-8 正弦余弦曲线
接下来,我们演示逐步从左侧图片过渡到右侧图片的过程。
(1)把正余弦曲线的线条画粗,并且定制合适的颜色:
# 画出余弦曲线,并设置线条颜色,宽度,样式
plt.plot(X, C, color="blue", linewidth=2.0, linestyle="-")
# 画出正弦曲线,并设置线条颜色,宽度,样式
plt.plot(X, S, color="red", linewidth=2.0, linestyle="-")
(2)设置坐标轴的长度:
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.1, C.max() * 1.1)
(3)重新设置坐标轴的刻度。X轴的刻度使用自定义的标签,标签的文本使用了LaTeX来显示圆周率符号π。
# 设置坐标轴的刻度和标签
plt.xticks((-np.pi, -np.pi/2, np.pi/2, np.pi),
(r'$-\pi$', r'$-\pi/2$', r'$+\pi/2$', r'$+\pi$'))
plt.yticks([-1, -0.5, 0, 0.5, 1])
(4)把左侧图片中的4个方向的坐标轴改为两个方向的交叉坐标轴。方法是通过设置颜色为透明色,把上方和右侧的坐标边线隐藏起来。然后移动左侧和下方的坐标边线到原点(0, 0)的位置。
# 坐标轴总共有4个连线,我们通过设置透明色隐藏上方和右方的边线
# 通过 set_position() 移动左侧和下侧的边线
# 通过 set_ticks_position() 设置坐标轴的刻度线的显示位置
ax = plt.gca() # gca 代表当前坐标轴,即 'get current axis'
ax.spines['right'].set_color('none') # 隐藏坐标轴
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom') # 设置刻度显示位置
ax.spines['bottom'].set_position(('data',0)) # 设置下方坐标轴位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0)) # 设置左侧坐标轴位置
(5)在图片的左上角添加一个铭牌,用来标识图片中正弦曲线和余弦曲线。
plt.legend(loc='upper left')
(6)在图片中标识出。不但把这个公式画到图片上,还在余弦曲线上标识出这个点,同时用虚线画出这个点所对应的X轴的坐标。
t = 2 * np.pi / 3
# 画出 cos(t) 所在的点在 X 轴上的位置,即使用虚线画出 (t, 0) -> (t, cos(t)) 线段
plt.plot([t, t], [0, np.cos(t)], color='blue', linewidth=1.5, linestyle="--")
# 画出标示的坐标点,即在 (t, cos(t))处画一个大小为50的蓝色点
plt.scatter([t, ], [np.cos(t), ], 50, color='blue')
# 画出标示点的值,即 cos(t) 的值
plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
其中,plt.annotate()函数的功能是在图片上画出标示文本,其文本内容也是使用LaTex公式书写。这个函数参数众多,具体可参阅官方的API说明文档。使用相同的方法,可以在正弦曲线上也标示出一个点。
(7)定制坐标轴上的刻度标签的字体,同时为了避免正余弦曲线覆盖掉刻度标识,在刻度标签上添加一个半透明的方框作为背景。
# 设置坐标刻度的字体大小,添加半透明背景
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(16)
label.set_bbox(dict(facecolor='white', edgecolor='None',
alpha=0.65))
这样就完成了一个Matplotlib样式配置的过程,把默认的样式修改成我们需要的样式。读者可参阅随书代码ch02.04.ipynb。
- 点赞
- 收藏
- 关注作者
评论(0)