R数据可视化手册 第2版

978-7-115-55557-1
作者: [美]温斯顿•常(Winston Chang)
译者: 王佳林枫王祎帆张晔
编辑: 杨海玲
分类: R语言

图书目录:

详情

本书基于主题划分章节,每一章归纳总结了对应的常见问题和解决方法。本书第1章是R基础知识,包括包安装和数据加载;第2章是绘图概述,帮助读者快速绘制基本图形;第3章至第6章具体介绍绘制几种不同图形(如条形图、折线图和散点图等)的方法;第7章至第12章讨论如何修改图形的各个元素(如注解、坐标轴、标题、图例和配色等);第13章介绍其他难以清晰分门别类的图形;第14章介绍将R绘制的图形以不同的格式导出的方法;第15章讨论数据处理的相关问题。 本书由浅入深,脉络分明,适合数据分析、数据处理和数据可视化的初学者;此外,本书对有一定数据分析、数据处理和数据可视化工作经验的读者,也是一本方便的速查手册。

图书摘要

版权信息

书名:R数据可视化手册(第2版)

ISBN:978-7-115-55557-1

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [美] 温斯顿•常(Winston Chang)

译    王 佳  林 枫  王祎帆  张 晔

责任编辑 杨海玲

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright ©2019 Winston Chang. All rights reserved.

Simplified Chinese Edition, jointly published by O’Reilly Media, Inc. and Posts & Telecom Press, 2021. Authorized translation of the English edition, 2019 O’Reilly Media, Inc., the owner of all rights to publish and sell the same.

All rights reserved including the rights of reproduction in whole or in part in any form.

本书中文简体版由O’Reilly Media, Inc.授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


本书基于主题划分章节,每一章归纳总结了对应的常见问题和解决方法。本书第1章是R基础知识,包括包安装和数据加载;第2章是绘图概述,帮助读者快速绘制基本图形;第3章至第6章具体介绍绘制几种不同图形(如条形图、折线图和散点图等)的方法;第7章至第12章讨论如何修改图形的各个元素(如注解、坐标轴、标题、图例和配色等);第13章介绍其他难以清晰分门别类的图形;第14章介绍将R绘制的图形以不同的格式导出的方法;第15章讨论数据处理的相关问题。

本书由浅入深,脉络分明,适合数据分析、数据处理和数据可视化的初学者;此外,本书对有一定数据分析、数据处理和数据可视化工作经验的读者,也是一本方便的速查手册。


O’Reilly以“分享创新知识、改变世界”为己任。40多年来我们一直向企业、个人提供成功所必需之技能及思想,激励他们创新并做得更好。

O’Reilly业务的核心是独特的专家及创新者网络,众多专家及创新者通过我们分享知识。我们的在线学习(Online Learning)平台提供独家的直播培训、图书及视频,使客户更容易获取业务成功所需的专业知识。几十年来O’Reilly图书一直被视为学习开创未来之技术的权威资料。我们每年举办的诸多会议是活跃的技术聚会场所,来自各领域的专业人士在此建立联系,讨论最佳实践并发现可能影响技术行业未来的新趋势。

我们的客户渴望做出推动世界前进的创新之举,我们希望能助他们一臂之力。

“O’Reilly Radar博客有口皆碑。”

——Wired

“O’Reilly凭借一系列非凡想法(真希望当初我也想到了)建立了数百万美元的业务。”

——Business 2.0

“O’Reilly Conference是聚集关键思想领袖的绝对典范。”

——CRN

“一本O’Reilly的书就代表一个有用、有前途、需要学习的主题。”

——Irish Times

“Tim是位特立独行的商人,他不光放眼于最长远、最广阔的领域,并且切实地按照Yogi Berra的建议去做了:‘如果你在路上遇到岔路口,那就走小路。’回顾过去,Tim似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。”

——Linux Journal


太上有立德,其次有立功,其次有立言,虽久不废,此之谓不朽。——《左传》

盖文章经国之大业,不朽之盛事。年寿有时而尽,荣乐止乎其身。二者必至之常期,未若文章之无穷。——《典论·论文》

古人著书立说,追求不朽。但是翻译科技书籍,非但不敢言不朽,反而是速朽,因为科技日新月异,需要与时俱进——以本书为例,相比第1版,这一版的第15章重写了所有的代码片段。

因此在翻译本书的过程中,我们几位译者不断思考,翻译这样一本书,到底有什么意义?

本书的意义在于它归纳总结了待解决的问题。虽然解决问题的方法日新月异,但是要解决的问题却始终存在。本书每一章节的内容,如条形图、折线图、散点图以及调整坐标轴、图例等,无一不是数据可视化工作者需要解决的问题。首先,本书可以视作速查手册,基于问题快速检索可行的方法。其次,本书也是进阶的好帮手,它可以帮助数据可视化的初学者度过他们茫然无措的新手期——在这个时期,初学者常常不知道自己应该如何做,甚至在遇到问题的时候,完全不知道如何搜集资料查找解决方案。本书不但指明方向,给出具体的示例,还在“讨论”小节提供更宽广的思路和进一步的阅读材料。善用本书,读者可以举一反三。

能顺利完成本书的翻译,首先要感谢第1版的译者肖楠、邓一硕、魏太云和邱怡轩,本书的翻译建立在第1版坚实的翻译基础上。其次要感谢第2版合译者王佳、林枫和王祎帆,他们朝气蓬勃,斗志昂扬,与他们合作非常愉快。最后,郑重感谢统计之都社区。本书两版的译者都是统计之都成员。不断有新鲜血液加入这个社区,社区也在不断反馈社会,恰如《星际迷航》里瓦肯人的格言一样:生生不息,繁荣昌盛。

此外,还要感谢人民邮电出版社的编辑杨海玲,感谢她专业的意见和帮助。

张晔


本书的第1版面世时,“数据科学”一词才刚刚进入流行词汇行列。如今,涉及科学、新闻或是高科技行业时,都已不可避免地会提到这个词。许多相互关联的发展使人们普遍认识到,理解定量数据具有明显的好处,有关如何实现数据科学有更好、更广泛的教育资源可用,最终,工具已得到了发展,变得更易于使用和入门。

本书的主要目的是帮助你通过可视化的方法更好地理解数据,并将这种理解能力传达给他人。你可以将数据分析视为将原始数据转化为想法的过程。要做到这一点,关键技术之一就是创建数据的可视化。我们的大脑拥有高度发达的视觉模式检测系统,数据可视化是有效利用这些视觉系统将定量信息传入人脑的一种方法。

本书的每个技巧中,都列出了一个问题和对应的解决方法。在大多数情况下,我提供的并不是R中唯一的实现方法,但却是我认为的最佳方案。R如此受欢迎的一个重要原因是,它有很多附加的包,每个包都为R提供了一些独特的功能。在R中也有很多数据可视化方面的包,但本书主要使用ggplot2。

本书并不是罗列五花八门的R数据可视化方法的综合手册,我只是希望,当你想绘制所需图形的时候,本书能够对你有所帮助。或者说,当你不知道绘制什么的时候,翻一翻这本书就可以找到一些可行的方案。

本书面向的读者至少需要对R有一些基本的了解。书中的技巧会让你明白如何解决一些特定的问题。在使用例子的时候,我力图简单明了,这样你就会明白它们的工作机理,并可以方便地把解决方法应用到自己的问题上。

书中的大部分技巧是用ggplot2包绘图、用dplyr包进行数据整理完成的,这两个包都是tidyverse包的一部分。tidyverse是R包的集合,可以更轻松地处理数据。有些技巧需要ggplot2的最新版本3.0.0,这样也就要求有一个相对较新的R版本——可以在R的官方网站获取最新版本的R。

 

 

在对ggplot2有初步理解的基础上即可使用这些技巧,如果想深入了解ggplot2是如何使用的,可阅读附录的内容。

 

安装了R后,你可以再安装一些必要的包。除了tidyverse包,你还可以选择安装gcookbook包(它包含了本书大多数例子的数据集)。你可以通过下列代码安装tidyverse和ggplot2包:

install.packages("tidyverse") 
install.packages("gcookbook")

你可能会被问到选择CRAN(Comprehensive R Archive Network)镜像的问题。一般而言,任何一个镜像都可以正常工作,不过最好选择一个离你更近的,因为这样速度会更快。安装完包后,每次在R会话中使用本书的技巧时,都要先加载ggplot2和dplyr包:

library(ggplot2)
library(dplyr)

本书中的技巧总是假设你已经加载了ggplot2和dplyr,所以不会显示这几行代码。

如果你看到下面这样的错误,意味着你忘记了加载ggplot2:

错误: 找不到函数"ggplot"

英文版R的错误提示是:

Error: could not find function "ggplot"

R的主要运行平台是macOS、Linux和Windows,本书中所有的技巧都可以在这些平台上运行。在保存位图输出文件的时候,会有平台的差异,具体差异会在第14章详细介绍。

本书采用的排版体例如下:

中文楷体

表示新术语。

等宽字体(Constant width

表示代码,在段内表示与代码相关的元素,例如变量或函数名、数据库、数据类型、环境变量、语句和关键字。

粗体等宽字体(Constant width bold

表示命令或其他用户输入的文本

斜体等宽字体(Constant width italic

表示该文本应当由用户提供的值或由用户根据上下文决定的值替换。

 

 

表示一般性注释。

 

我们的联系方式

如果想就本书发表评论或有任何疑问,敬请联系O’Reilly出版社。

美国:

O’Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

我们还为本书建立了一个网页,其中包含了勘误表、示例和其他额外的信息。你可以在O’Reilly官方网站访问本书对应网页。

关于本书的技术性问题或建议,请发送电子邮件到:bookquestions@oreilly.com。

要查看更多我们的书籍、课程、会议和最新动态等信息,可访问O’Reilly官方网站。

没有一本书的诞生可完全归结为个人的成果。本书的完成得到了很多人的帮助。我要感谢R社区创造并培育了一个积极活跃的生态系统。非常感谢Hadley Wickham和tidyverse其他团队成员创建了本书所涉及的软件,并为我提供了许多机会,加深了我对R、数据分析和可视化的理解。我很感激我的雇主RStudio公司,不仅让我有机会与R社区的领军人物合作,而且支付报酬让我们开发整个R社区都可以从中受益的软件。

感谢本书的技术审稿人和第1版的编辑Garrett Grolemund、Thomas Lin Pedersen、Paul Teetor、Hadley Wickham、Dennis Murphy和Erik Iverson。他们渊博的知识和对细节的重视极大地提高了本书的质量。感谢第2版的编辑Jen Wang。

最后,我还要感谢我的妻子Sylia,感谢她一如既往的支持和理解——当然不只是在写本书的时候。


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书提供书中的彩图文件。要获得相关配套资源,请在异步社区本书页面中点击跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100 积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是 contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问 www. epubit.com/selfpublish/submission 即可)。

如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT 专业图书社区,致力于出版精品IT 图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于 2015 年 8 月,提供大量精品IT 技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网 https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT 图书的品牌,依托于人民邮电出版社的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


本章包括以下基础知识:安装包、使用包和加载数据。

本书中的大多数技巧需要安装ggplot2、dplyr和gcookbook包(gcookbook包包含了本书部分示例所使用的数据集,但在实际工作时该包并不是必需的)。如果想快速上手,可以运行下面的命令来安装:

install.packages("tidyverse")
install.packages("gcookbook")

然后,在每个R会话中,需要在运行本书的示例之前先加载它们:

library(tidyverse)
library(gcookbook)

运行library(tidyverse)会加载ggplot2、dplyr和很多其他包。如果想要让R会话更加流畅高效,可以分别加载ggplot2、dplyr和gcookbook:

library(ggplot2)
library(dplyr)
library(gcookbook)

 

 

如果想更深入地理解ggplot2是如何工作的,可以参见附录,获取与ggplot2相关概念的解释。

 

R中的包是一些为了便于分发而封装在一起的函数和(或)数据(可以没有数据集)的集合。在计算机上安装包,便可以扩展R的功能。如果一个R用户编写了一个包并觉得这个包对其他R用户可能有用,那么,这位R用户就可以通过包仓库将该包发布。发布R中的包的最主要的包仓库称为CRAN(Comprehensive R Archive Network),不过也有其他的仓库,如基因组数据相关包的专用仓库Bioconductor。

如果你学习R已经有一段时间了,你也许听说过tidyverse这个用于共享应该如何构建和使用数据等常识的R包合集。基础R包通常是在下载和安装R之后就自动导入的。而tidyverse是一组R插件,它可以使进行数据处理和可视化的相关操作更加简单。本书在多数情况下使用tidyverse,因为我相信它会让你更加快速和方便(但不会影响处理效果!)地使用数据。

如果你以前没有使用过tidyverse,那么你一定要看一下1.7节中的技巧,它可以帮你理解一种陌生的句法——%>%,也就是所谓的管道操作符。

如何从CRAN安装R包?

使用install.packages()函数来安装包,括号中写上要安装的包名。以安装ggplot2包为例,运行:

install.packages("ggplot2")

此时系统可能提示你选择一个下载镜像。

如果想要同时安装多个包,可以用一个包名的向量进行参数传递。例如,用以下命令可以安装本书所使用的绝大多数包:

install.packages(c("tidyverse", "gcookbook"))

当指定R安装一个包时,该包依赖的所有包也都会被自动安装。

如何加载一个已经安装了的包?

使用library()函数,括号中写上要加载的包名。以加载ggplot2包为例,运行:

library(ggplot2)

当然,首先必须确保要加载的包已经被安装了。

本书中的大多数技巧需要在运行代码前加载包,无论是为了绘图(ggplot2包)还是为了加载例子中的数据集(如MASS包和gcookbook包)。

R的一个不寻常之处是包(package)和库(library)的术语区别。尽管我们使用library()函数来加载包,但一个包并不是一个库;如果你不幸犯此错误,可能会激怒一些资深的R用户。

库指的是一个包含了若干包的目录。你既可以拥有一个系统级别的库,也可以针对每个用户单独设立一个库。

如何更新一个已经安装的包?

运行update.packages()命令:

update.packages()

该命令会提示你哪些包可以被更新。如果想要不加提示地更新所有包,可以加入参数ask = FALSE

update.packages(ask = FALSE)

包的作者会发布一些新版本来修复旧版本中的问题并提供一些新特征,通常建议让包更新至最新版本。但是也请读者注意,偶尔有个别包在更新后会引入一些bug或者引起轻微的行为的变化。

如何加载一个以符号分隔的文本文件中的数据?

读取文件中逗号分隔组(Comma-Separated Value,CSV)数据的最常用方法是:

data <- read.csv("datafile.csv")

另一种方法是使用readr包中的read_csv()函数(注意是下划线而不是点)。这个函数的运行速度明显比read.csv()函数快很多,并且更适合处理字符串、日期和时间。

由于数据文件有许多不同的格式,为了加载它们,提供了很多对应的选项。如果一个数据文件首行没有列名:

data <- read.csv("datafile.csv", header = FALSE)

那么得到的数据框的列名将是V1V2等。想要手动重命名列:

# 手动为列名赋值
names(data) <- c("Column1", "Column2", "Column3")

可以用sep参数来设置分隔符。如果是以空格分隔,使用参数sep = " "。如果是以制表符分隔,sep参数值应设置为\t,如下所示:

data <- read.csv("datafile.csv", sep = "\t")

在默认情况下,数据中的字符串会被视为因子(factor)处理。假设下面是你的数据文件,然后,你用read.csv()来读取:

"First","Last", "Sex", "Number"
"Currer","Bell","F",2
"Dr.","Seuss","M",49
"","Student",NA,21

得到的数据框将会把FirstLast等存储为因子,尽管此时将它们视为字符串(或使用R术语中的字符向量)更为合理。为了区别这一点,可以设置stringsAsFactors = FALSE。如果有些列应该被处理为因子,可以再对其逐个转换:

data <- read.csv("datafile.csv", stringsAsFactors = FALSE)

# 转为因子类型
data$Sex <- factor(data$Sex)
str(data)
#> 'data.frame': 3 obs. of 4 variables:
#> $ First : chr "Currer" "Dr." ""
#> $ Last : chr "Bell" "Seuss" "Student"
#> $ Sex : Factor w/ 2 levels "F","M": 1 2 NA
#> $ Number: int 2 49 21

还可以在加载的时候不做设置(字符串自动转换为因子),加载之后再对需要的列进行因子到字符串的转换。

read.csv()是对read.table()更便捷的封装函数。如果需要更细致地操控文本输入,可以通过?read.table命令获取更多细节。

如何从Excel文件中加载数据?

readxl包中的read_excel()函数可以用于读取.xls和.xlsx等Excel文件。下面的代码将会读取Excel中的第一个工作表:

# 只需要安装一次
install.packages("readxl")

library(readxl)
data <- read_excel("datafile.xlsx", 1)

使用read_excel()函数,既可以通过为sheet指定序数也可以通过为sheet指定名字从其他工作表中加载数据:

data <- read_excel("datafile.xls", sheet = 2)

data <- read_excel("datafile.xls", sheet = "Revenues")

read_excel()使用工作表的第一行作为列名。如果不想以第一行为列名,可以设置参数col_names = FALSE。相应地,各列会被命名为X1X2等。

在默认情况下,read_excel()会自行判断每一列的数据类型。假如我们想要规定每一列的类型,可以使用col_types参数。我们也可以通过将某些列的类型设置为"blank"来丢弃它们。

# 去除第一列,并且指定之后3列的类型
data <- read_excel("datafile.xls",
                   col_types = c("blank", "text", "date", "numeric"))

输入?read_excel来查看关于文件读取的更多选项。

还有一些其他包可以用于读取Excel文件。gdata包中有一个函数read.xls()能够读取.xls文件,而xlsx包中的函数read.xlsx()则可以读取.xlsx文件。要使用这些包需要先在计算机上安装其他软件:read.xls()需要安装Java,而read.xlsx()需要安装Perl。

如何从SPSS或其他统计软件如SAS和Stata的文件中加载数据?

haven包的函数read_sav()可以读取SPSS文件。若要从SPSS文件中加载数据,可以使用以下方法:

# 只需要在第一次安装
install.packages("haven")

library(haven) 
data <- read_sav("datafile.sav")

haven包囊括了各种读取其他格式文件的函数。

你也可以选择使用foreign包来代替haven包,它同样支持SPSS和Stata文件,但是该包的函数不像haven包那样会保持更新。例如,它只支持Stata 12之前的文件版本,而haven则可以支持到Stata 14(当前最新的文件版本)。

foreign包也支持读取一些其他格式的文件,包括:

输入ls("package:foreign")可以查看foreign包中所有函数的列表。

如何以一种易读的方式调用一个函数并将其结果传递给另一个函数?

使用管道操作符%>%。例如:

library(dplyr) # 管道操作符由dplyr包提供

morley # 来看一下morley数据集
#> Expt Run Speed
#> 001 1 1 850
#> 002 1 2 740
#> 003 1 3 900
#> ...<94 more rows>...
#> 098 5 18 800
#> 099 5 19 810
#> 100 5 20 870

morley %>% 
  filter(Expt == 1) %>% 
  summary()
#> Expt Run Speed
#> Min. :1 Min. : 1.00 Min. : 650
#> 1st Qu.:1 1st Qu.: 5.75 1st Qu.: 850
#> Median :1 Median :10.50 Median : 940
#> Mean :1 Mean :10.50 Mean : 909
#> 3rd Qu.:1 3rd Qu.:15.25 3rd Qu.: 980
#> Max. :1 Max. :20.00 Max. :1070

上述代码加载了morley数据集并将其传递给dplyr包中的filter()函数,仅仅保留了数据中Expt值为1的那些行。之后,该结果被传递给summary()函数,由该函数计算数据的某些统计结果。

如果不使用管道操作符,前面的代码可以写成:

summary(filter(morley, Expt == 1))

在上面这行代码中,函数的调用是自内向外依次处理的。从数学的观点来看,这种写法很好,但是并不利于代码的可读性,特别是有很多嵌套函数调用的情况下,反而会让人觉得困惑难懂。

这种带有%>%操作符的模式广泛应用于tidyverse的包中,因为它们包含了很多功能相对简单的函数。这些函数就像一块块积木,可以由用户自行组合、调用,来得到他们想要的结果。

我们可以用一个很简单的例子来清楚地展示管道操作符的机制。这里有两段等价的代码:

f(x)

# 等价于:
x %>% f()

管道操作符本质上是将操作符左侧的内容作为右侧函数调用的第一个参数。它可以用于链式地调用多个函数:

h(g(f(x)))

# 等价于:
x %>% 
  f() %>% 
  g() %>% 
  h()

在一个函数链中,函数调用的词法顺序和它们的计算顺序是一致的。

如果想要保存最终结果,可以在一开始使用<-操作符。例如,下面的代码将会用函数链的最终结果替代原来的x

x <- x %>% 
  f() %>% 
  g() %>% 
  h()

如果函数调用需要额外的参数,在使用管道操作符的情况下这些参数应移至操作符右侧。让我们回到前面第一个例子的代码中,这两种表达方式是等价的:

filter(morley, Expt == 1)

morley %>% filter(Expt == 1)

管道操作符实际上来自magrittr包,但dplyr包也导入了该管道操作符,因此在调用library(dplyr)时也可以使用管道操作符。

关于在数据处理中使用%>%的更多例子见第15章。


相关图书

R语言编程:基于tidyverse
R语言编程:基于tidyverse
R语言医学多元统计分析
R语言医学多元统计分析
Python与R语言数据科学实践
Python与R语言数据科学实践
R数据挖掘实战
R数据挖掘实战
R语言机器学习实战
R语言机器学习实战
R语言高效能实战:更多数据和更快速度
R语言高效能实战:更多数据和更快速度

相关文章

相关课程