阅读 121

DatistEQ之ggplot2包简介

引至《ggplot2数据分析与图形艺术》

每当我们看到一个新的软件,第一反应会是:为什么又要发明一个新软件?ggplot2是R世界里相对还比较年轻的一个包,在它之前,官方R已经有自己的基础图形系统(graphics包)和网格图形系统(grid包),并且Deepayan Sarkar也开发了lattice包,看起来R的世界对图形的支持已经足够强大了。那么我们不禁要问,为什么还要发明一套新的系统?

设计理念

打个比方,想想我们小时候怎样学中文的。最开始的时候我们要识字,不认识字就没法阅读和写作,但我们并不是一直按照一个个汉字学习的,而是通过句子和具体的场景故事学习的。为什么不在小学时背六年字典呢?那样可能认识所有的汉字。原因很简单,光有单字,我们不会说话,也无法阅读和写作。我们缺的是什么?答案是对文字的组织能力,或者说语法。

R的基础图形系统基本上是一个“纸笔模型”,即:一块画布摆在面前,你可以在这里画几个点,在那里画几条线,指哪儿画哪儿。后来lattice 包的出现稍微改善了这种情况,你可以说,我要画散点图或直方图,并且按照某个分类变量给图中的元素上色,此时数据才在画图中扮演了一定的中心角色,我们不用去想具体这个点要用什么颜色(颜色会根据变量自动生成)。然而,lattice 继承了R 语言的一个糟糕特征,就是参数设置铺天盖地,足以让人窒息,光是一份xyplot() 函数的帮助文档,恐怕就够我们消磨一天时间了,更重要的是,lattice 仍然面向特定的统计图形,像基础图形系统一样,有直方图、箱线图、条形图等等,它没有一套可以让数据分析者说话的语法。

那么数据分析者是怎样说话的呢?他们从来不会说这条线用#FE09BE 颜色,那个点用三角形状,他们只会说,把图中的线用数据中的职业类型变量上色,或图中点的形状对应性别变量。有时候他们画了一幅散点图,但马上他们发现这幅图太拥挤,最好是能具体看一下里面不同收入阶层的特征,所以他们会说,把这幅图拆成七幅小图,每幅图对应一个收入阶层。然后发现散点图的趋势不明显,最好加上回归直线,看看回归模型反映的趋势是什么,或者发现图中离群点太多,最好做一下对数变换,减少大数值对图形的主导性。

从始至终,数据分析者都在数据层面上思考问题,而不是拿着水彩笔和调色板在那里一笔一划作图,而计算机程序员则倾向于画点画线。Leland Wilkinson 的著作在理论上改善了这种状况,他提出了一套图形语法,让我们在考虑如何构建一幅图形的时候不再陷在具体的图形元素里面,而是把图形拆分为一些互相独立并且可以自由组合的成分。这套语法提出来之后他自己也做了一套软件,但显然这套软件没有被广泛采用;幸运的是,Hadley Wickham 在R语言中把这套想法巧妙地实现了。

为了说明这种语法的思想,我们考虑图形中的一个成分:坐标系。常见的坐标系有两种:笛卡尔坐标系和极坐标系。在语法中,它们属于一个成分,可自由拆卸替换。笛卡尔坐标系下的条形图实际上可以对应极坐标系下的饼图,因为条形图的高可以对应饼图的角度,本质上没什么区别。因此在ggplot2 中,从一幅条形图过渡到饼图,只需要加极少量的代码,把坐标系换一下就可以了。如果我们用纸笔模型,则可以想象,这完全是不同的两幅图,一幅图里面要画的是矩形,另一幅图要画扇形。

发展历程

ggplot2是Hadley在爱荷华州立大学博士期间的作品,也是他博士论文的主题之一,实际上ggplot2还有个前身ggplot,但后来废弃了,某种程度上这也是Hadley写软件的特征,熟悉他的人就知道这不是他第一个“2”版本的包了(还有reshape2)。带2的包和原来的包在语法上会有很大的改动,基本上不兼容。尽管如此,他的R代码风格在R社区可谓独树一帜,尤其是他的代码结构很好,可读性很高,ggplot2是R代码抽象的一个杰作。读者若感兴趣,可以在GitHub网站上浏览他的包:https://github.com/hadley在用法方面,ggplot2也开创了一种奇特而绝妙的语法,那就是加号:一幅图形从背后的设计来说,是若干图形语法的叠加,从外在的代码来看,也是若干R对象的相加。这一点精妙尽管只是ggplot2系统的很小一部分,但我个人认为没有任何程序语言可比拟,它对作为泛型函数的加号的扩展只能用两个字形容:绝了。

至2013年2月26日,ggplot2的邮件列表(http://groups.google.com/group/ggplot2 )订阅成员已达3394人,邮件总数为15185封,已经成为一个丰富、活跃的用户社区。未来ggplot2的发展也将越来越依赖于用户的贡献,这也是很多开源软件最终的走向。

引自《R语言:从数据思维到数据实战》

为什么要用ggplot2?如果只需要一个理由,那就是很多人用它。它画出的图与基本款完全不同,且不论ggplot2可以画出诸如自画像类的高能图,单从基本图的呈现对比就可初见端倪(见图1和图2)。

图1 这是基本款
图2 这是升级款

关于ggplot2的设计理念,统计之都创始人谢益辉曾在《ggplot2:数据分析与图形艺术》这本书的中译本序中有过一段精彩论述:“R的基础绘图系统基本就是一个纸笔模型,即一块画布摆在面前,可以在这里画几个点,在那里画几条线,指哪儿画哪儿,但这不是让数据分析者说话的方式,数据分析者不会说这条线用#FE09BE颜色,那个点用三角形状,他们只会说,把图中的线用数据中的职业类型变量上色,或者图中点的形状对应性别变量,这是数据分析者的说话方式,而ggplot2正是以这种方式来表达的。”

接下来介绍ggplot2的画图理念。具体来讲,ggplot2画图的核心是采用了图层叠加的设计方式,它基于一整套完整的图形语法,这套语法能让你使用相似的元素,包括数据、数据所对应的几何对象以及坐标系来绘制不同的图形。图3是Data Visualization with ggplot2 CheatSheet一书中的示意图。

图3 ggplot2图层映射原理

如图3所示,数据集中包含F,M,A三列变量,将F映射到x轴,A映射到y轴,再设置这两列变量映射为图中的点,就画出了一幅两个变量的散点图。还可以将数据集中的某些属性映射为图中几何对象的属性,比如将变量F映射到点的颜色属性,把变量A映射为点的形状属性,就可以画出如图4的样式。

图4 使用ggplot2将变量映射为点的形状和颜色属性

在这个实现过程中,只需要设置把F变量映射为点的颜色,但是无须具体规定映射为什么颜色。这就是ggplot2的另一个小优点:它会帮你把细节自动处理好,比如颜色选择、图例添加,都会以一种默认颜色和位置输出,如果你对它的设置不满意,也可以自己修改。不过在最初画图探索阶段,它的这项技能可以帮助有效减少对细节的考虑,专注于图形所表达的内容。

ggplot2有以下特点(黄宝臣):

  • 核心理念是将绘图与数据分离,数据相关的绘图与数据无关的绘图分离
  • 按图层作图
  • 保有命令式作图的调整函数,使其更具灵活性
  • 将常见的统计变换融入到了绘图中
ggplot2图层函数的示意图

参考文献

  1. ggplot2数据分析与图形艺术
  2. R语言:从数据思维到数据实战
  3. https://www.jianshu.com/p/79d52b98a94b

作者:了无_数据科学

原文链接:https://www.jianshu.com/p/58854be2c205

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐