f',! i吾言应用系列
ggplot2. Elegant Graphics for Data Analysis
ggplot2 :数据分析与图形艺术
〔是]哈德 利 · 威克姆著
Hadley Wickham
统计之都译
殷腾飞审校
.-
西安交通大学出版社
Xi 'an Jiaotong University Press
T ranslalio n from 山e English language edition
gKPlot2. El~ga l1 t Graphic, for Data A >'Ialysis by Hadley Wickham
Copyright Il:l 2009 Springer New York
Sp ringeτNew York is 11 pllrt of Springer Science+ B usine~ !'I Media
Al1 Righu Reservoo
本书 中 文简体字版囱施普林格科学与商业传蝶公司捏权商茸茸通大学出版社独家出版监行 .
未经出版者面先书面许可 , 不相山任何方式草制或直行本书的任何部分 .
院 西省版 权局著作权合同暨记号图字 25 -20 1 2 - 216 号
图书在版篇目 (CIP) 撞撞
g.川。.,.数据分析与图形艺术 /, 荧 〉威克揭
( W i ckham , H.) 著,统计主精译一西安回去
交 通大 学出版社 . 2013.5
书名皿宜 , Ggplot2. degant graphics for data analys i ~
lSBN 978-7 5605 - 4969 -9
I
( g'"
n ①威 @统
田 ①统计分析应用
软件 W ( C8 19
中国版本图书馆 CIP 数街核字 (20 1 3) 第 006344 号
名 ggplot2 盘据分析与固形艺术
者 〈樊〉 哈德利 · 戚克姆
者 提计之都
书
蕃
海
审役 '虫"飞
出版发行 西安置通 大学出版社
周组1
电
〈西安市兴庆南路 1 0 号 邮政编码 7 1 0049)
htlp:// www.xjtupress.com
话 (029)826683盯 82667874 ( 发行中心〉
(029)826683 15 82669096( 总编办〉
传真 (029)82668280
印 刷院西 宝石 主 印务有限责任公司
'* 720mmX 1000mm 1/ 16
'应
0001-3000
开
印
版次印次 2013 年 5 月第 1 版
布号 ISBN 978 - 7 - 5605 - 4969 - 9/C • 107
定价 46.00 元
印张 15.5
字敏 253 千字
20 1 3 年 5 月第 1 1<印刷
该者购书、书店添货、细蛊观印幸在质量问蝠,句'与本社 芷行中心联系、澜'良
lT购热线, (029)82665248
投稿热线 (029)82665397
读者倍箱, banquan1809由 126 .com
(029) 82665249
版极所有侵极必究
中译本序
每当我们看到一个新的软件,第一反应会是:为什么又要发明 一个新软件?
ggpl。但是 R 世界里相对还比较年轻的一个包,在宫之前.官方 R 已经有自己
的基础图形系统 (gr.ph口包)和网格图形系统 (grid 包).并且 D四payan S町kar
也开发了 1 .四ce 包,看起来 R 的世界对图形的支持已经足够强大了 。 那么我们
不禁要间,为什么还要发明一套新的系统?
设计理念
打个比方,想想我们小时候怎样学中文的。 最开始的时候我们要识字 ,不
认识字就没法阅读和写作,但我们并不是一直按照一个个汉字学习的.而是通
过句子和具体的场景故事学习的 3 为什么不在小学时背六年字典呢? 那样可能
认识所有的汉字。原因很简单,光有单字,我们不会说话.也无法阅读和写作 。
我们缺的是什么?答案是对文字的组织能力,或者说语法。
R 的基础罔形系统基本上是一个"纸笔模型
可以在这里画几个点'在那里画几条线,指哪儿画哪儿。 后来 lattìce 包的出现
稍微改善了这种情况.你可以说 , 我要画散点图或直方罔.并且按照某个分类
变量给图中的元素上色,此时数据才在画图中扮演了一定的中心角色.我们不
用去想具体这个点要用什么颜包(颜包会根据变量自动生成)。然而. l attÎCe 继
承了 R 语言的 一个糟糕特征,就是参数设置铺天盖地 足以让人窒息,光是
一份 xyplot ()函数的帮助丈挡,恐怕就够我们消磨一天时间丁,更重要的是,
l attice 仍然面向特定的统计图形,像基础图形系统一样.有直方阁、箱线阁、条
形图等等,它没有一套可以让数据分析者说话的语法。
那么数据分析者是怎样说话的呢?他们从来不会说这条线用 .FE09BE 颜色.
那个点用 三角形状,他们只会说,把图中的线用数据中的职业类型变量上色,
或图中点的形状对应性别变量 。 有时候他们画了 一 幅散点图,但马上他们发现
这幅图太拥挤,最好是能具体看一下里面不同收入阶层的特征,所以他们会说,
把这幅图拆成七幅小图,每幅图对应一个收入阶层 。 然后发现散点图的趋势不
明显,最好加上回归直线,看看回归模型反映的趋势是什么,或者发现图中离
群点太多.最好做一下对数变换,减少大数值对图形的主导性。
从始至终.数据分析者都在数据层面上思考问题.而不是拿着水影笔
和调色板在那里一笔一划作阁 , 而计算机程序员则倾向于画点画线。 Lela.nd
W监i皿佣的著作在理论上改善了这种状况 . 他提出 了一套图形语法,让我们在
考虑如何构建一幅图形的时候不再陷在具体的图形元章里面.而是把图形拆分
为一些互相独立并且可以自由组合的成分。 这套语法提出来之后他自己也做了
一套软件 ,但显然这套软件没有被广泛采用; 幸运的是 , Hadley Wickham 在 R
语言中把这套想法巧妙地实现了 。
为了说明这种语法的思想,我们考虑图形中的一个成分 坐标系 。 常见的
坐标系有两种 笛卡尔坐标系和极坐标系 。 在语法中,它们属于一个成分,可
自由拆匍替换。 笛卡尔坐标赢下的条形图实际上可以对应极坐标系下的饼图,
因为条形图的高可以对应饼罔的角度.本质上没什么区别。因此在目pl。位中,
从一幅条形图过渡到饼图.只需要加极少量的代码,把坐标系换一下就可以了 。
如果我们用纸笔模型,则可以想象,这完全是不同的两幅圈,一幅图里面要画
的是矩形. 另一 幅图要画扇形。
更多的细节在本书中会介绍,这里我们只是简略说明用语法画图对用纸笔
画图来说在思维上的优越性;前者是说话,后者是说字。
发展历程
ggplot2 是 Hadley 在爱荷华州立大学博士期间的作品,也是他博士论文的
主题之一,实际上 回plot2 还有个前身国pl时, 但后来废弃了,某种程度上这
也是 Hadley 写软件的特征.熟悉他的人就知道这不是他第一个 "2" 版本 的包
了(还有田hape2) 。 带 2 的包和原来的包在语法上会有很大的改动.基本上不
兼容。 尽管如此,他的 R 代码风格在 R 社区可谓独树一帜,尤其是他的代码结
构很好,可读性很高,且pl。但是 R 代码抽象的一个杰作 。 读者'若感兴趣,可
以在 GitHub 网站上浏览他的包 httpB: / / gi thub. com/hadley o 在用法方面,
3
ggplot2 也开创了 一种奇特而绝妙的语法.那就是加号 :一 幅图形从背后的设计
来说.是若干阁形语法的叠加,从外在的代码来看,也是若干 R 对象的相加 。
这一点精妙尽管只是回plot2 系统的很小一部分,但我个人认为没有任何程序语
言可比拟 ,它对作为泛型商数的加号的扩展只能用两个字形容绝了 。
至 2013 年 2 月 26 日. ggplot2 的邮件列表 (http://groups .google. com/
group/ggplot2) 订阅成员已达 3394 人,邮件总数为 15 185 封,已经成为一个
丰富、活跃的用户杜区 。 未来自 pl。但 的发展也将越来越依赖于用户的贡献,这
也是很多开源软件最终的走向 。
关于版本更新
原书面世之时.四plot2 的版本号是 0.8.3. 译者开始翻译此书时是 0.9.0 版
本,该版本较之 0.8.3. 内部做了一些大改动 。 此后, ggplot2 频繁升级,目前版
本号是 0 .9. 3. 当然这也给本书的翻译过程带来了相当大的麻烦。 因为译者不但
要修E原书 中大量过时的代码、重新画图 ,还要修正过时的理念,以及处理数
次版本更新的影响 。 所幸.在翻译过程中 , 译者得到丁本书审校殷腾飞博士、
ggplot2 开发者 Hadley Wickham 和 Wistong Chang 的大力帮助。
如果你是老用户.那么可能需要阅读下面的小节 。 之后 ggplot2 有过多次
更新.尤其是 0.9.0 之后. ggplot2 的绘图速度和帮助立档有了质的飞跃 。 关于
0.9.0 的更新.读者可以从 https://github .c。时也wnl oads/hadley/ggplot2/
guide-co l. pdf 下载一份详细的说明文档 . 但原文挡比较长,而且有些内部更
新问题我们也不一定需要丁解,因此这里给一段概述。
• ggplot2 的帮助丈档大大扩充了,过去头疼的问题之一就是一个函数里面不
知道有哪些可能的参数,例如 theme () 函数,现在已经有了详细说明 。
· 新增图例向导函数 guide_legend() 和 guide_colorbarO 前者可以用
来指导图例的排版 .例如可以安排图例中元素排为 n 行 m JiIJ ; 后者增强
丁连续变量图例的展示 例如当我们把颜色映射到一个连续变盘上时过
去生成的图例是离散的.现在可以用这个商数生成连续颜色的图例(渐变
色) 。
· 新增 儿何对象函数 geom_map() (让地图语 法变得更简单). geom_raster
4
。(更高放的 geom_tile() ) . geom_dotplot() (一维点阁 .展示变盐密度分
布)和 geoID_violinO (小提琴,实为密度!曲线) 。
· 新增统计变换函数目前 _sum皿ary2d O (在二维网 梯上计如数据密度 ),
stat_summary _hex O (在六边形"蜂巢" 上计算数据密度 ) , stat_bindot
O(一维点图密度). stat_ydensityO (密度 dll 线.用于小提琴阁) 。
• facet_gridO 支持 x 轴和 y 轴其中一者可以有自由的刻度(根据数据范
固而定),以往要么所有切片使用同样的坐标铀刻度 要么所有都自由 。
• geoID_boxplot ()开始支持画箱线图的 四槽 (notch) ,就像 R 基础罔形系统
中的 boxplot ()函数。
· 新增函数 ggmissingO 用来展示缺失值的分布 , 回order() 按照数据观察
顺序先后面折线图 ggstructure ()展示数据热图 。
另外此次更新涉及到 些函数参数名 称的 变化,如果旧代码在这个版本中
报错说有未使用的参数.那么用户 1'"要再次查看帮助立锚,确保输入的参数在
丽数中存在。 在所有这些表面的更新背后,实际上 ggplot2 很大程度上被重写
了,例如开始使用 R 自带的 S3 泛型函敬设计 .以及将过去 ggpl。但的功能继
续模块化为一些独立的包,一个典型的例子就是标度部分的功能被抽象自Jsc刮目
包巾,从数据映射到颜色、大小等外观属性可以白这个包直接完成。 这种分拆
也使得其他开发者可使用过去 回 plot2 内部的一些功能雨般。
0.9.1 版本主要解决丁 0.9.0 版本中的些漏洞 。 ggplot2 在 2012 年 9 月 4
日 发布了新的版本 0.9.2 ,其中 些特性和更新有必要提及
· 采用了全新的主题 (theme) 系统. optsO 函数已被标记为"不推荐使用"
(dep, ecated) ,将在未来版本中被取消,取而代之的 是 theme() 雨数. 主
题元素 (theme element) 由属性列表构成支持继承,主题之间可以直接进
行合并等操作 。 详情参见 wiki 页面 https:!!github.com!wch!ggplot2!
wiki!New-theme-system。
· 依赖于新的 gtable 包。 用来更方便地调整修改回 plot2 阁 m 中的罔元.
ggplotGrob() 会返回一个 gtable 类, 这个对象可以利用 gtable 包中提供
的函数和接口进行操作 。
· 所有"模饭"类型的图形民数,比如 plotmatrixO , 阻。rder() 等等,已
被标 i己为 不推荐使用 (dep,ecated) ,将在未来版本中取消 。