Python数据可视化之美:专业图表绘制指南(全彩)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3章 数据可视化基础

所谓“一图抵千言”(A picture is worth a thousand words)。数据可视化,就是关于数据视觉表现形式的科学技术研究。其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽提出来的信息,包括相应信息单位的各种属性和变量。根据Edward R.Tufte在The Visual Display of Quantitative Information[3]Visual Explanations[4]中的阐述,数据可视化的主要作用有两个方面。

(1)真实、准确、全面地展示数据;

(2)揭示数据的本质、关系、规律。

数据可视化的经典案例莫过于南丁格尔玫瑰图的故事。19世纪50年代,英国、法国、奥斯曼帝国和俄罗斯帝国进行了克里米亚战争,英国的战地战士死亡率高达42%。弗罗伦斯·南丁格尔主动申请,自愿担任战地护士。她率领38名护士抵达前线,在战地医院服务。当时的野战医院卫生条件极差,各种资源极度匮乏,她竭尽全力排除各种困难,为伤员解决必需的生活用品和食品问题,对他们进行认真的护理。仅仅半年左右,伤病员的死亡率就下降到2.2%。每个夜晚,她都手执风灯巡视,伤病员们亲切地称她为“提灯女神”。战争结束后,南丁格尔回到英国,被人们推崇为民族英雄。出于对资料统计的结果不受人重视的忧虑,她发展出一种色彩缤纷的图表形式,让数据能够更加让人印象深刻(见图3-0-3)。这种图表形式有时也被称作“南丁格尔的玫瑰”,是一种圆形的直方图。南丁格尔自己常昵称这类图为鸡冠花(coxcomb)图,并且用以表示军队医院季节性的死亡率,对象是那些不太能理解传统统计报表的公务人员。她的方法打动了当时的高层,包括军方人士和维多利亚女王本人,于是医事改良的提案才得到支持。这就是数据可视化第一个主要作用的佐证。

图3-0-1 第一幅南丁格尔玫瑰图

Matthew O.Ward也提出,可视化的终极目标是洞悉蕴含在数据中的现象和规律,这包括多重含义:发现、决策、解释、分析、探索和学习[5]。表3-0-1所示的原始数据是31组x-y的二维数据。仅仅只从数据的角度去观察,很难发现x与y之间的具体关系。将实际的数据分布情况使用二维可视化的方法呈现,如图3-0-2所示,则可以快速地从数据中发现数据内在的模式与规律。所以,有时使用数据可视化的方法也可以很好地帮助我们去分析数据。

表3-0-1 四组二维数据点集(相同的x变量,不同的y变量:y1,y2,y3,y4)

图3-0-2 四个不同规律的二维数据点集的可视化案例

在数据可视化方面,Python还是与R有一定差距的。但是,Python也有matplotlib、Seaborn和plotnine等静态图表绘制包,可以在很大程度上实现R语言ggplot2及其拓展包的数据可视化效果。matplotlib是Python数据可视化的基础包,Seaborn和plotnine也都是基于matplotlib发展而来的。我们首先来对这3个包做一个对比,使用相同的数据集绘制的散点图、统计直方图和箱形图如图3-0-3、图3-0-4和图3-0-5所示。通过图表参数的调整,三种不同风格的图表都可以转换。但是就默认的图表风格而言,plotnine的美观程度优于matplotlib和seaborn;而且,通过使用theme_*()函数,plotnine可以轻松地转换不同图表风格,以适用于不同的应用场景。

图3-0-3 使用matplotlib包绘制的图表示例

图3-0-4 使用Seaborn包绘制的图表示例

图3-0-5 使用plotnine包绘制的图表示例

使用matplotlib、Seaborn和plotnine包绘制的散点图、统计直方图和箱形图的具体代码如表3-0-2所示。df是一个包含SOD、tau和Class(Control、Impaired和Uncertain)三列的数据框(DataFrame)。其中,matplotlib图表绘制函数最大的问题就是参数繁多、条理不清,尤其在绘制多数据系列图表时语法尤为烦琐,但是可以实现不同的坐标系,包括二维、三维直角坐标系以及极坐标系;Seaborn中各个图表绘制函数之间的参数不统一,难以梳理清晰,但是可以绘制更多的统计分析类图表。而plotnine的语法相对来说很清晰,可以绘制很美观的个性化图表,但暂时只能实现二维直角坐标系。本书将会以图表类型为导向,详细地介绍常用的图表绘制方法,包括plotnine、matplotlib和Seaborn等包的图形语法。

表3-0-2 不同图形语法的代码示例