《scikit-learn机器学习常用算法原理及编程实战》—2.5 Matplotlib简介

举报
华章计算机 发表于 2019/05/31 16:30:18 2019/05/31
【摘要】 本书摘自《scikit-learn机器学习常用算法原理及编程实战》一书中的第2章,第2.5.1节,编著是黄永昌 .

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左侧为默认样式画出来的正余弦曲线,右侧为调整后的正余弦曲线。

image.png

图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。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。