ggplot2:可视化设计师的神器,了解一下
关于作者
余政彦,常常自称90后,但其实差点成为80后,他生于屏东,在台北住了六年、北京两年,未来两年将继续在波士顿探索人生。他搞过科研,做过公关,当过记者,目前醉心于数据可视化。
其实,犹豫了好几个礼拜,在想要不要写这一篇文章,毕竟这个信息图没用到多么高深复杂、酷炫炸天的可视化,分析也不够深入。但,这几天看到了某R语言的公众号发了一篇文章,介绍如何画直条图。对,就是很常见的那种直条图,读者的反响还不错,我突然觉得这篇文章可以写一下了
废话不多说,先上图。
这篇文章会大致讲解如何使用Adobe Illustrator、R语言的ggplot2、QGIS制作这个信息图,以及分析思路,并在文章的最后分享几个学习ggplot2的资源。
这个信息图为美国东北大学Information Design and Visualization项目2017年春季的一门课程的作业,这门课程叫做信息设计的研究方法(Information Design Research Methods)。课程分成两个部分,针对定性数据(qualitative data)与定量数据(quantitative data)进行研究。但因为这是开给设计学生的课,所以没有太深入,不论是在代码或是数据分析上。在课程进行到后半部时(课程大概三个多月,所以学习R语言并制作信息图的时间大概一个半月),我们需要自己找一份数据集,并使用R语言进行可视分析。这是我第一次学R语言,在这之前有一点点d3.js的基础。
先谈谈信息图的普遍限制
在2016年年底的时候,我分享了如何用Adobe Illustrator设计如下的信息图:
《信息图表是如何炼成的:媒体使用情况》(可点击链接)展示了个人搜集一周的数据,并可视化展现出来:
《信息图表是如何炼成的:阶层结构与isometric》(可点击链接)展示了,在给定一个国家的经济数据,如何用不同的方式呈现十几种不同的数据,并考量到可视化的整体排版:
(这里举例的两个作品,跟文章里展示的作品稍微有所不同,因为我在2017年暑假的时候有修改过)
这两个作品有个特点,就是数据量很小。所以在可视化数据时,可以使用软件一个一个拉出来,也就是说上面这两个信息图都是手动拉出来的,相当耗时耗力。但问题来了,
数据量过大的时候,怎么办?
需要对数据进行预处理(例如分组加总)再可视化的时候,怎么办?
此时若用excel计算数据,再用鼠标一个一个拉,已经是不可行了。适当的编程是解决这问题最好的方法。
为什么选择ggplot2?
ggplot2是R的一个包,有几个优点:
首先,好上手。跟python比起来,适合没有学过编程语言的人,但对有编程背景的人来说可能会觉得R的代码逻辑很奇怪。ggplot2更是R语言里面,最好学习的包,可能有之一😂。在《R for Data Science》这本入门级神书中,可视化被摆在第二个章节(第一章是开篇介绍),因为这本书的作者(也是ggplot2的作者)认为,操作ggplot2进行可视化非常简单。
再来,R语言很强大。就我稍会的功能举一些例子,R语言可以:操作数据库(例如,mongolite),爬虫与数据清洗(例如,正则),数据分析(例如,统计推论),导出pdf(例如,markdown)等。从数据抓取、清洗、储存、分析、可视化、汇出等一系列的流程,皆可以使用R(更准确的来说,是RStudio)来完成,可以说非常强大。虽然跟python比起来部分功能是短板,但这不是这篇讨论的重点了。
最后,可以导出svg。这大概是设计师最关心的部分了。没有svg的图表设计,设计师选择死亡。
当然,可以导出svg的可视化工具不止ggplot2,例如RAW Graphs这个工具也不错,菜单操作易上手,但跟ggplot2比起来,很明显,限制很多,像是无法预处理数据。
数据来源
这个信息图用到的数据是美国政府搜集的公开数据:Fatality Analysis Reporting System,每一年度都会汇整出一份数据组。我挑选当时最新的2015年数据组,数据组里有一个以交通事故发生情况为主的数据,共有56个变量,三万多条数据条目。
分析思路、制图过程
既然选定了一份以交通事故发生情况为主的数据,找出具体原因是我认为最主要的目标。哪些洲有较高的交通事故发生?也就是说,为什么在这些州开车会相对比较危险。还有,哪些原因可能导致这些州较高的交通事故发生,像是地理位置、气候、出行时间等因素,也是我感兴趣的部分。
信息图分成三个部分:Part1 热力图;Part2 地图;Part3 散点图、Mosaic图、直条比例图,分别有不同的可视化、不同的分析目的。
Part1 热力图:快速看出在哪些州开车比较危险
上图左上显示美国各州在12个月份里面的死亡车祸发生次数。从这个图很明显可以看出有三条横杆颜色最深,分别是德克萨斯州、佛罗里达州、加利福尼亚州。
但这些州人口量多,有较多的车祸事故发生并不让人意外。所以我就又找了一份数据当年的驾驶司机数量来平均一下,如上图右。上图左下呈现的是标准化之后的结果,可以明显看出可视化有不同,并且较危险的州已经变成怀俄明州、蒙大拿州、密西西比州。
热力图在RStudio里面导出后,是长这样的:
是不是被丑哭了,不过没关系,我们可以导出pdf:
然后用Adobe Illustrator修改:
热力图的代码:
Part2 地图:找出最危险的州与最安全的州,它们事故发生地点
从热力图找出了最危险的州与最安全的州(各三个)后,要继续往下分析啦。这时候我关心的是,这些交通事故的发生地点,是发生在快速道路上比较多呢,还是发生在城里比较多?亦或是某些山路有较高的事故发生?这时候地图就需要来支援了。
此时应该是继续用ggplot2或是gg家族的ggmap来画地图,显得比较有一致性,不过,很遗憾的,我当时用ggplot2一直画不出我想要的效果。代码能力不够,只好机智来凑hhh,想到使用QGIS来辅助画图。QGIS是一个很好使用的地理信息可视化开源软件,一样可以导出svg做二次修改。
在原始数据里,56个变量里包含了经纬度,导入QGIS时是长这样的:
因为在前面的热力图里,已经挑选出六个州深入分析,所以筛选这里显示的数据,分别筛选出六个州的数据,具体如何筛选,顾及文章篇幅的关系,这里就不多解释了,网上有许多关于这个的教程。
以马萨诸塞州为例,先在RStudio里面画出马萨诸塞州的主要道路:
数据叠加之后,再稍微修改一下:
道路地图代码(这里代码不是用ggplot2):
但必须承认一下这样做不是完全准确的,因为我是用手动叠加,后续有时间我会继续修正。
补上用ggplot2画的地图,虽然这制图效果不是我想要的,但在叠加数据时,有参考这图:
ggplot2画的地图代码:
Part3 散点图、Mosaic图、直条比例图
有时候除了地图之外,可视分析还需要其他图表来辅助。我想知道在较安全的州与较危险的州,还有哪些因素可能造成事故发生。在此,我用散点图(上图第一行)来分析时间维度对事故发生的影响;用Mosaic图(上图第二行)来分析酒驾与事故发生时间的关系;最后用条形比例图(上图第三行)来呈现事故发生时的天气状况。
1️⃣散点图
时间调整为一天,我想知道以每日的时间维度之下,哪些时候是车祸高峰时段,哪些时候是低峰时段。从图中可知,高峰时段是每日的下午三点到晚上八点之间。低峰时段是每日的凌晨五点左右。
散点图代码:
2️⃣Mosaic图
驾驶酒醉情况在密西西比州的情况如何?酒驾与否对车祸发生时间有什么关系呢?从图中可以看出,密西西比州的车祸事故发生多为非酒驾,且事故发生时间较多在午后与傍晚时段。
Mosaic图代码:
3️⃣长条比例图
这里显示的是六个州的长条比例图,假设所有车祸事故发生总数为1,那么事故发生时的不同天气占比为多少?天气代码1是晴天。有个分析点可以注意的是,虽然晴天占了较多的事故比例,可能是这些州的天气较多为晴天,但也有部分可能是在晴天时,驾驶对于路况比较松懈,从而导致车祸发生。
长条比例图代码:
从开始学习R语言到完成信息图,大概六七个个礼拜的时间,当时交出的作品如下图,因为觉得不太满意,所以暑假的时候,又花了十几个小时修改设计部分。下图跟首图比较之下,设计上很明显的有许多的不同(此处省略一万字😂)。
当时选定要分析的数据时,刚好碰上了学校一年一度的专案比赛,这个专案比赛可以选择任何的题材,所以我跟班上的两个同学一起合作(Divya,柳桦樱杨),设计了一个移动app产品,基于同样的数据但选择了不同的数据维度,彼此分工了数据分析、界面设计、体验设计,花了大概一个月的时间:
比赛当天的报道截图:
不知不觉已经过了一年多,现在回想起这段过程倒还是历历在目。很开心的是,当时的战友们都已经拿到了很不错的工作offer,一位去了西雅图的微软做体验设计师,一位去了新加坡的MIT感知城市实验室。愿你们在未来一切顺利。
最后再放一张图,来怀念一下当时最后一节课的上课情形。授课老师除了自己点评了班上每一个同学的作品,也邀请其他课程的老师来给评论。
其他学习资源
数据分析的热门语言,虽然近年被Python追赶过去,网上有许多的学习资源,ggplot2也不例外。
The R Graph Gallery
https://www.r-graph-gallery.com/
这个网站陈列了许多富有创意的可视化图表,皆是用R语言来实现(有针对用ggplot2的图表分类)。
ggplot2的cheat sheet(小抄表)
https://www.rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf
ggplot2很实用的小抄表,跟着这个表一步一步走,很容易画出可视化。
欢迎任何反馈建议,以上。
大家都在看
公众号后台回复关键字即可学习
回复 R R语言快速入门及数据挖掘
回复 Kaggle案例 Kaggle十大案例精讲(连载中)
回复 文本挖掘 手把手教你做文本挖掘
回复 可视化 R语言可视化在商务场景中的应用
回复 大数据 大数据系列免费视频教程
回复 量化投资 张丹教你如何用R语言量化投资
回复 用户画像 京东大数据,揭秘用户画像
回复 数据挖掘 常用数据挖掘算法原理解释与应用
回复 机器学习 人工智能系列之机器学习与实践
回复 爬虫 R语言爬虫实战案例分享