第5章 可视化

俗话说得好,“一图胜千言”,可见图像给我们带来的震撼效果。生活如此,机器学习也如此,图的直观、简单明了同样给我不一样的感觉和理解。那么,如何把数据变成图?如何把一些比较隐含的规则通过图像展示出来呢?
本章主要介绍几个基于Python、TensorFlow开发的可视化的强大工具,具体包括:
♦ matplotlib
♦ pyecharts
♦ Tensorboard

5.1 matplotlib

matplotlib 是 Python 中最著名的2D绘图库,它提供了与 matlab 相似的 API,十分适合交互式绘图,简单明了,功能强大,而且可以方便地作为绘图控件,嵌入 GUI 应用程序中。下面我们进入matplotlib的世界,开始我们的数据可视化之旅。

5.1.1 matplotlib的基本概念

在介绍matplotlib前,首先要保证环境中安装了Python。建议使用Anaconda安装,因为Anaconda安装包中包含很多常用的工具包,如matplotlib、NumPy、Pandas、Sklearn等,并且后续的更新维护也非常方便。
在绘制我们的第一个图形之前,我们先来了解几个matplotlib的非常重要的概念,以帮助我们更快地理解matplotlib的各种API,以及能让你和你的同事使用一种大家都能听得懂的语言以及术语进行沟通。
matplotlib设置坐标主要参数配置详细说明及示例说明如下。
1)导入绘图相关模块;
2)生成数据;
3)plot绘制图形,(选 - 线条设置)设置线linestyle或标记marker;
4)(选 - 坐标轴设置 - 添加坐标标签)给x轴添加标签xlabel和y轴添加标签ylabel;
5)(选 - 坐标轴设置 - 添加坐标刻度)设置x轴的刻度xlim()和y轴的刻度ylim();
6)(选 - 图例设置label)设置图例legend();
7)输出图形show()。
下面来看一个使用matplotlib绘图的实例,具体如下:

使用matplotlib对数据进行可视化的示例的运行结果如图5-1所示。
图5-1 使用matplotlib对数据进行可视化
也可以把图5-1拆成两个图,代码如下。

把图5-1拆成两个图的运行结果如图5-2所示。
图5-2 把图5-1拆成两个图

5.1.2 使用matplotlib绘制图表

matplotlib能绘制出各种各样的图表,所以开发人员可根据需要展示的数据格式、内容以及要用图表来达到的效果来选择合适的图形种类。下面我们通过日常工作中最常用的4种图表来做一个演示。
1.柱状图
柱状图是指用一系列高度不等的纵向条纹或者线段直观地显示统计报告来帮助人们理解数据的分布情况。在绘制柱状图时,我们可以使用plt.bar(x,y,tick_label),给出x,y坐标值,同时给出x坐标轴上对应刻度的含义等,示例如下。

绘制出的柱状图如图5-3所示。
图5-3 柱状图
2. 折线图
折线图通常用来显示随时间变化而变化的连续的数据,它非常适用于展示在相等的时间间隔下的数据的变化趋势。比如,使用折线图展示一个系统从2010年到2020年的每年的注册人数。在绘制折线图时,我们可以使用plt.plot()。 下面我们用折线图来显示系统注册人数的变化情况。

绘制出的折线图如图5-4所示。
图5-4 折线图
从图5-4中我们可以直观地看到,系统的注册人数在2011年进入了一个谷值,而2014是峰值。
3. 饼图
饼图常常用来显示一个数据系列中各项的大小及其在整体中的占比。比如我们可以用下面的饼图来展示每个人的月收入,并显示他们的月收入占总体收入的比例。

绘制出的饼图如图5-5所示。

图5-5 饼图
4. 散点图
散点图是指在回归分析中数据点在坐标系平面上的分布图,用于表示因变量随自变量变化而变化的大致趋势,从而帮助我们根据其中的关系选择合适的函数对数据点进行拟合。下面我们绘制一张身高和体重关系的散点图。

绘制出的散点图如图5-6所示。
图5-6 散点图
除了上述介绍的4种图形,matplotlib还可以绘制其他图形,比如线箱图、极限图、气泡图等。感兴趣的读者可以自行查阅matplotlib的网站或者源代码,以了解更多内容。

5.1.3 使用rcParams

rcParams用于存放matplotlib的图表全局变量,我们可以用它来设置全局的图表属性,当然在进行具体图表绘制的时候,我们也可以对全局变量进行覆盖。下面介绍几个常用的全局变量。注意,如果想在图表中显示中文内容,比如显示中文标题,则需要在matplotlib的全局变量rcParams里进行设置。
1)没设置rcParams属性。

运行结果如图5-7所示。

图5-7 没有设置rcParams属性的情况
如图5-7所示,中文标题没有正确显示,而是随机变成几个方框。此时,通过rcParams设置文字属性即可使标题正确显示。

运行结果如图5-8所示。

图5-8 设置rcParams属性的情况
更多关于rcParams的设置问题,请参照matplotlib官网(https://matplotlib.org/stable/api/matplotlib_configuration_api.html#matplotlib.RcParams)。

5.2 pyecharts

我们接下来要介绍的pyecharts正是Python版本的eCharts。
相较于经典的matplotlib,pyecharts可以在保证易用、简洁、交互性的基础上让开发人员绘制出种类更加丰富(比如3D,和地图模块的集成)、样式更加新颖的图表。下面我们先来看如何安装pyecharts 。

5.2.1 pyecharts安装

pyecharts 是一个用于生成 ECharts 图表的类库,官网为https://pyecharts.org/。
pyecharts有两个大的版本,v0.5.x 以及 v1.x。其中, v0.5.x 支持 Python 2.7 以及Python 3.4, v1.x 支持Python 3.6及以上版本。考虑到v0.5版本已经不再维护,而且大多数公司已经升级到Python 3.7及以上版本,所以本节只介绍1.x版本,并且以最新版v1.9为基础进行讲解。pyecharts安装主要有两种方式,通过源码或者pip安装,这里以pip安装为例进行讲解:

【说明】安装pyecharts时,可改用国内的安装源,如清华安装源,以提高下载速度,具体代码如下:

5.2.2 使用pyecharts绘制图表

我们先来用一个简单的例子直观地了解如何使用pyecharts绘图,体会它的便利性和优雅。

绘制出的pyecharts的柱状图如图5-9所示。

图5-9 pyecharts的柱状图
上述代码显示了苏州XX渔具店在2020年和2021年各种子品类的销售金额。 首先我们创建了一个Bar类型的图表,添加了X轴(add_xaxis)来代表各种品类,之后添加了两个Y轴的数据(add_yaxis)来代表2020年以及2021年的业绩。为了让图表更加容易理解,我们增加了标题以及副标题(title以及subtitle)。
用Pyecharts画的柱状图非常优雅,当然,用它画其他图形同样如此。绘制出的图形如下:
1. 仪表盘(Gauge)
我们第一个例子来模拟汽车的仪表盘,仪表盘上显示这辆汽车的最高时速,以及当前行驶速度,汽车仪表盘还会使用醒目的红色提醒驾驶员不要超速行驶,我们把这些信息一并添加到我们需要绘制的图形里面。

运行结果:
图5-10 仪表盘
大家可以从上图看到,仪表盘图形(Gauge)非常适合展示进度或者占比信息,通常我们会把几个仪表盘图形组合成一个组合图表进行展示,这样能让使用者对全局的信息有个快速的了解。不如,我们可以用几个仪表盘图形展示我们集群里面各个节点的健康状态,它们的CPU的使用率,IO的吞吐是不是在一个可承受的范围内等等。
2、地理坐标系(Geo)
这几年,各大app推出一个显示用户出行轨迹的应用广受各位旅游达人以及飞人的喜欢,在一张中国地图或者世界地图上,用箭头代表自己的飞行路径,线段的粗细代表了飞行这条航线的频率,让用户对自己过去一年的行踪有个直观的认识,也当做是在朋友圈凡尔赛的资料。接下来,我们用pyecharts来大概模拟这个功能。

运行结果:
图5-11 从上海出发的飞行路线图
pyecharts内嵌了中国以及各个省份的矢量图,可以方便的绘制出你想要的区域,使用者可以通过使用坐标或者城市名称的形式标定出具体的位置,进而用不同的颜色代表特殊的含义。

5.3 TensorBoard

在我们学习神经网络和使用TensorFlow的大多数时候,大多数人都会感觉很吃力,因为整个过程不可见。我们很难理清楚神经网络内部的结构,以及数据的流转情况,这给神经网络原理的理解和进一步使用带来了很大的挑战。TensorBoard就是为了解决整个问题而研发出来,它是TensorFlow内置的一个可视化工具,它利用TensorFlow运行时所产生的日志文件可视化指标,如培训和验证数据的损失和准确性、权重和偏差、模型图等,从而极大地帮助我们进行调试和优化等工作。
那么,我们应该如何使用TensorBoard呢?首先,我们来定义一个简单的计算图。
1)导入数据。

2)构建模型。

3)训练模型

在Windows的命令行启动Tensorboard 服务,指定日志读写路径,如果是linux环境,请根据实际情况,修改logdir的值。

(1)Tensorboard Scalar
将显示了每个循环(epoch)后损失和准确度的变化——当整个数据集通过神经网络正向和反向传播时——随着训练的进行,了解损失和准确度很重要,因为了解这些指标在什么时候趋于稳定,有助于防止过拟合。本例对应的准确率随迭代次数变化的情况,如图5-12所示。
图5-12 使用Tensorboard显示的标量(Scalar)图
(2)Tensorboard Graphs
模型图显示了模型的设计,默认情况下,操作(op)级别图为默认值,可以通过在标记上选择其他级别,左边的Tag使用默认状态,可以看到如图5-13所示结果。
图5-13 Tag改为Default看到的计算图
如左边的Tag更改为“Keras”。操作级别图显示TensorFlow对程序的理解,可以看到如图5-14所示的主干图。

图5-14Tag改为Keras看到的计算图
(3)Tensorboard Distribution
用于显示了张量的分布,显示每个循环(epoech)权重和偏差的分布情况。

图5-15 权重和偏差的分布图
(4)Tensorboard Histograms
直方图用于显示张量的分布,显示每个循环(epoech)中权重和偏差的分布情况。

图5-16 权重和偏差的分布图

5.4小结

可视化往往能锦上添花,所以无论是数据分析还是深度学习,都非常重视可视化。这里我们介绍了3种可视化工具,matplotlib是基础、常用、适应范围广;pyecharts功能强大,容易制成动态图像,外观丰富多彩;Tensorboard是TensorFlow为深度学习定制一个可视化工具。