R数据可视化手册(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-10 17:02:28

点击下载

作者:【美】Winston Chang

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

R数据可视化手册

R数据可视化手册试读:

前言

、第1章和第12~15章。三位译者均是统计之都(http://cos.name/)的成员,他们也是当前国内R语言社区的领军人物,曾翻译了许多R语言的经典教材和书籍,并通过组织中国R语言会议、开办COS数据分析沙龙、参与论坛问题讨论、撰写博客、整理文档、编写软件包等多种方式为R语言社区做出了诸多贡献。值得一提的是,本书13.1节中介绍的corrplot软件包,正是由译者之一的魏太云开发完成的。统计之都团队作为国内R语言最早的一批布道者之一,有幸见证了R语言在国内兴起的整个过程。从网站创始人谢益辉开始在个人博客上连载R语言的教程和心得,到2008年第一届中国R语言会议的召开,再到如今众多R语言中文版书籍的面世,我相信其中的每一步都是国内统计学、以及更广义的数据科学不断向前发展的印记。我们也希望更多的有志之士加入到统计之都的团队之中,为国内统计学和数据科学贡献自己的力量。

本书的译者力求使翻译准确、生动,但疏漏之处在所难免,欢迎读者予以指正。为了让读者方便地获取和提交勘误信息,我们建立了本书的翻译项目页面:https://github.com/cosname/gcookbook-translation。读者也可以在统计之都的图书出版栏目(http://cos.name/books/)留言或提问。

本书的出版离不开众多人士的大力帮助,我们要郑重感谢爱荷华州立大学的王芯同学、中国人民大学的陈森同学和浙江大学的张政同学,他们在本书的翻译过程中提出了很多中肯的意见。没有他们的帮助,本书很难完成。此外,我们还要感谢人民邮电出版的杨海玲女士和编辑们,他们的专业精神让我叹服。邱怡轩2013年12月于普渡大学前言

几年前读研时我开始用R,主要用来分析我在科研工作中收集到的数据。我使用R首先是想摆脱SPSS这样的统计软件的禁锢,即严格的环境和死板的分析。更何况,R是免费的,所以我用不着说服别人为我购买一套这样的软件——这对一个穷研究生来说是相当的重要!此后,随着我对R的了解不断深入,我才发现原来R还可以绘制出非常优秀、动人的数据图形。

本书的每个“技巧”中,都列出了一个问题和对应的解决方法。在大多数情况下,我提供的并不是R中唯一的实现方法,但却是我认为的最佳方案。R如此受欢迎的一个重要原因是它有很多附加的软件包,每一个软件包都为R提供了一些独特的功能。在R中也有很多可视化方面的软件包,但本书主要使用ggplot2(声明:我现在工作的一部分就是开发ggplot2;但是,在我还没意识到我可能会从事与ggplot2相关的工作之前,我已经完成了本书的大部分工作)。

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

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

书中的大部分“技巧”都是用ggplot2完成的,有些“技巧”需要ggplot2的最新版本0.9.3,这样也就要求有一个版本相对较新的R——你可以在R的官方网站获取最新版本的R。如果你对ggplot2不熟悉,请参阅附录A,那里对该包有

一个简要的说明。

安装了R后,你可以再安装一些必要的包。除了ggplot2之外,你还可以选择安装gcookbook包(它包含了本书大多数例子的数据集)。要同时安装这两个包,只需运行命令:install.packages("ggplot2")install.packages("gcookbook")

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

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

如果你看到这样的错误,意味着你忘记了加载ggplot2。错误:找不到函数"ggplot"

英文版R的错误提示是:Error: could not find function "ggplot"

R的主要运行平台是Mac OS X、Linux和Windows,本书中所有的“技巧”都可以在这些平台上运行。在保存位图输出的时候,会有平台的差异,详情参见第14章。本书的排版约定

本书采用的体例如下:● 等宽字体(Constant width):表示程序清单,以及段落中引用的

程序元素,如变量或 函数名、数据库、数据类型、环境变量、

语句和关键字。● 加粗的等宽字体(Constant width bold):表示需要用户手动输入

的命令或其他文本。● 斜的等宽字体(Constant width italic):表示应该用用户所提供

的值或根据上下文确定的值来替换的文本。这个图标表示一个提示、建议或者一般的注记。代码示例的使用

本书的目标是帮助你完成工作。一般而言,你可以在自己的程序和文档中使用本书中的代码,如果你要复制的不是很大一部分代码,则无须取得我们的许可。例如,你可以在程序中使用本书中的多个代码块,无须获取我们许可。但是,要销售或分发来源于O’Reilly图书中的示例的光盘则必须得到许可。通过引用本书中的示例代码来回答问题时,不需要事先获得我们的许可。但是,如果你的产品文档中融合了本书中的大量示例代码,则需要取得我们的许可。

我们很欢迎引用时给出署名,但不做要求。署名一般包括书名、作者、出版社和ISBN。例如“R Graphics Cookbook by Winston Chang (O'Reilly). Copyright 2013 Winston Chang, 978-1-449-31695-2”。

如果你觉得你对例子代码的使用已经超出了合理程度或者上文所述的许可范围,请通过permissions@oreilly.com联系我们。我们的联系方式

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

美国:

  O’Reilly Media Inc.

  1005 Gravenstein Highway North

  Sebastopol, CA 95472

中国:

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

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

关于本书的技术性问题或建议,请发邮件到:

  bookquestions@oreilly.com

欢迎登录我们的网站(http://www.oreilly.com),查看更多我们的书籍、课程、会议和最新动态等信息。

我们的其他联系方式如下:

  Facebook: http://facebook.com/oreilly

  Twitter: http://twitter.com/oreillymedia

  YouTube: http://www.youtube.com/oreillymedia致谢

没有一本书的诞生可完全归结为个人的成果。本书的完成得到了很多人直接或间接的帮助。我要感谢R社区创造并培育了一个积极活跃的生态系统。非常感谢Hadley Wickham的诸多帮助:他编写了本书所依赖的软件包ggplot2,并在O’Reilly出版社考虑出版R图形书籍的时候推荐了我,他还为我打开了一扇深入了解R的窗户。

感谢本书的技术审稿人Paul Teetor、Hadley Wickham、Dennis Murphy和Erik Iverson。他们渊博的知识和对细节的重视极大地提高了本书的质量。我还要感谢O’Reilly出版社积极推进此书的编辑们:Mike Loukides 在初始阶段给了我很多指导,Courtney Nash伴我走到了最后。此外,我还要郑重感谢O’Reilly的Holly Bauer及制作团队的其他成员,他们从头到尾耐心地做了很多细致的编辑工作,并为此书增添了不少特色。

最后,我还要感谢我的妻子Sylia,感谢她一贯的支持和理解——当然不只是在写本书的时候。第1章 R基础

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

如果你想快速上手,本书大多数技巧都需要安装ggplot2和gcookbook包。运行下面命令来安装:install.packages(c("ggplot2", "gcookbook"))

然后,在每个R会话中,你需要在运行本书的例子之前先加载它们:library(ggplot2)library(gcookbook)附录A提供了一个关于ggplot2绘图包的简介,主要是面

向不熟悉ggplot2的读者。

R中的包是一些为了便于分发和传播而封装在一起的函数和(或)数据集(可以没有数据集)的集合。在你的电脑中安装软件包,便可以扩展R的功能。如果一个R用户编写了一个包并觉得这个包对其他R用户可能有用,那么,这位R用户就可以通过软件包仓库将该包发布。发布R软件包的最主要的软件包仓库是CRAN(Comprehensive R Archive Network),不过也有其他的仓库,如Bioconductor和Omegahat。1.1 安装包问题

如何从CRAN安装R包?方法

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

此时系统可能提示你选择一个下载镜像,可以选择离你最近的一个;如果想要确保包的版本是最新的,那就选择Austria站点,因为这是CRAN的主服务器。讨论

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

CRAN是R包的仓库,在全球范围内有很多镜像,它是R默认使用的库。此外,还有几个软件包仓库,如Bioconductor,它是与基因组数据分析相关的包的软件包仓库。1.2 加载包问题

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

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

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

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

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

软件库指的是一个包含了若干软件包的目录。你既可以拥有一个系统级别的软件库,也可以针对每个用户单独设立一个软件库。1.3 加载分隔符式的文本文件问题

如何加载一个分隔符式的文本文件中的数据?方法

加载逗号分隔组(CSV)数据的最常用方法是:data <-read.csv("datafile.csv")讨论

由于数据文件有许多不同的格式,为了加载它们,提供了很多对应的选项。如果一个数据集首行没有列名:data <-read.csv("datafile.csv", header=FALSE)

得到的数据框的列名将是V1、V2等,你可能想要重命名列:#手动为列名赋值names(data) <-c("Column1","Column2","Column3")

还可以用sep参数来设置分隔符号。如果是空格分隔,使用sep=" ";如果是制表符分隔,使用\t。data <-read.csv("datafile.csv", sep="\t")

默认情况下,数据集中的字符串(string)会被视为因子(factor)处理。假设下面是你的数据文件,然后,你用read.csv()来读取:"First","Last","Sex","Number""Currer","Bell","F",2"Dr.","Seuss","M",49"","Student",NA,21

得到的数据框将会把First、Last等存储为因子,尽管此时将它们视为字符串(或使用R中的术语,字符:character)更为合理。为了区别这一点,可以设置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。1.4 从Excel文件中加载数据问题

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

xlsx包中的函数read.xlsx()可以读取Excel文件,下面的代码将会读取Excel中的第一个工作表:#只需要安装一次install.packages("xlsx")library(xslx)data <-read.xlsx("datafile.xlsx", 1)

如果需要阅读老版本的Excel文件(.xls格式),gdata包提供了函数read.xls():# 只需要安装一次install.packages("gdata")library(gdata)# 读取第一张工作表data <-read.xls("datafile.xls")讨论

使用read.xlsx()加载工作表时,既可以用序数参数sheetIndex来指定,也可以用工作表名参数sheetName来指定:data <-read.xlsx("datafile.xls", sheetIndex=2)data <-read.xlsx("datafile.xls", sheetName="Revenues")

使用read.xls()加载工作表时,可以用序数参数sheet来指定:data <-read.xls("datafile.xls", sheet=2)

安装xlsx和gdata包时需要在电脑上安装其他软件。对于xlsx包,需要安装Java;对于gdata包,需要安装Perl。Perl在Linux和Mac OS X上是系统自带的,但在Windows上没有。如果是在Windows上,你需要安装ActiveState Perl,其社区版本可以免费获得(http://www.activestate.com/activeperl)。

如果你不想这样折腾,更简单的替代方案是打开Excel文件后另存为标准的文本格式,比如CSV。另见

输入?read.xls和?read.xlsx来查看更多关于读取文件的选项。1.5 从SPSS文件中加载数据问题

如何从SPSS文件加载数据?方法

foreign包中的函数read.spss()可以读取SPSS文件。若要读取SPSS文件中的第一张表:#只需首次使用时安装install.packages("foreign")library(foreign)data <-read.spss("datafile.sav")讨论

foreign包中还有很多读取其他格式文件的函数,包括以下几种。● read.octave():Octave和MATLAB。● read.systat():SYSTAT。● read.xport():SAS XPORT。● read.dta():Stata。另见

输入ls("package:foreign")可以查看该包中的所有函数的列表。第2章 快速探索数据

虽然本书中大部分图形都是通过ggplot2包绘制的,但这并不是R绘制图形的唯一方法。要快速探索数据,有时使用R基础包中的绘图函数会很有用。这些函数随R软件默认安装,无需另行安装附加包。它们简短易输入,处理简单问题时使用方便,且运行速度极快。

如果你想绘制较为复杂的图形,那么,转用ggplot2包通常是更好的选择。部分原因在于ggplot2提供了一个统一的接口和若干选项来替代基础绘图系统中对图形的修修补补和各种特例。一旦掌握了ggplot2的工作机制,你就可以应用这些知识来绘制从散点图、直方图到小提琴图和地图等各种统计图形了。

本章介绍的技巧演示了用基础绘图系统绘制统计图形的方法,也对如何用ggplot2中的qplot()函数绘制同样的图形做出了说明。qplot()函数的语法与基础绘图系统类似,对于每一个由qplot()函数绘制的图形,技巧中也提供了用更强大的ggplot()函数来绘图的等价解决方案。

如果你已经知道如何使用基础图形系统,那么当你想绘制更复杂的图形时,可以将这些例子放在一起进行对比以帮助你过渡到ggplot2系统。2.1 绘制散点图问题

如何绘制散点图?方法

使用plot()函数可绘制散点图(见图2-1),运行命令时依次传递给plot()函数一个向量x和一个向量y。plot(mtcars$wt,mtcars$mpg)图2-1 基础绘图系统绘制的散点图

对于ggplot2系统,可用qplot()函数得到相同的绘图结果(见图2-2):library(ggplot2)qplot(mtcars$wt, mtcars$mpg)图2-2 使用ggplot2包中qplot()函数绘制的散点图

如果绘图所用的两个参数向量包含在同一个数据框内,则可以运行下面的命令:qplot(wt,mpg,data=mtcars)# 这与下面等价ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point()另见

更多关于绘制散点图的详细内容可参见本书第5章。2.2 绘制折线图问题

如何绘制折线图?方法

使用plot()函数绘制折线图(见图2-3左图)时需向其传递一个包含x值的向量和一个包含y值的向量,并使用参数type="l":plot(pressure$temperature, pressure$pressure, type="l")图2-3 左图:基础绘图系统绘制的折线图 右图:向图形中添加数据点和另一条折线

如果要向图形中添加数据点或者多条折线(见图2-3右图),则需先用plot()函数绘制第一条折线,再通过points()函数和lines()函数分别添加数据点和更多折线:plot(pressure$temperature, pressure$pressure, type="l")points(pressure$temperature,pressure$pressure)lines(pressure$temperature, pressure$pressure/2, col="red")points(pressure$temperature, pressure$pressure/2, col="red")

在ggplot2中,可以使用qplot()函数并将参数设定为geom="line"得到类似的绘图结果(见图2-4):library(ggplot2)qplot(pressure$temperature, pressure$pressure, geom="line")图2-4 左图:ggplot2中的qplot()函数绘制的折线图 右图:添加数据点的折线图

如果函数的两个参数向量已包含在同一个数据框中,则可以运行下面的语句:qplot(temperature,pressure, data=pressure, geom="line")# 这等价于下面的命令ggplot(pressure, aes(x=temperature, y=pressure)) + geom_line()# 添加数据点qplot(temperature, pressure, data=pressure, geom=c("line", "point"))# 这等价于下面的命令ggplot(pressure, aes(x=temperature, y=pressure)) + geom_line() + geom_point()另见

更多关于绘制折线图的详细内容可参见本书第4章。2.3 绘制条形图问题

如何绘制条形图?方法

对变量的值绘制条形图(见图2-5左图),可以使用barplot()函数,并向其传递两个向量作为参数,第一个向量用来设定条形的高度,第二个向量用来设定每个条形对应的标签(可选)。

如果向量中的元素已被命名,则系统会自动使用元素的名字作为条形标签:barplot(BOD$demand, names.arg=BOD$Time)

有时候,“条形图”表示的是分组数据中各个元素的频数(见图2-5右图)。这种条形图跟直方图有些类似,不过,其用离散取值的x轴替代了直方图中连续取值的x轴。要计算向量中各个类别的频数,可以使用table()函数。table(mtcars$cyl) 4 6 8 11 7 14 # 值为4的频数为11,6的为7,8的为14图2-5 左图:基础绘图系统绘制的条形图 右图:向量元素的频数条形图

只需将上面的表格结果传递给barplot()函数即可绘制频数条形图:# 生成频数表barplot(table(mtcars$cyl))

对于ggplot2系统,可以使用qplot()函数得到类似的绘图结果(见图2-6)。绘制变量值的条形图时需将参数设定为geom="bar"和stat="identity"。注意变量x分别为连续取值和离散取值时输出结果的差异。library(ggplot2)qplot(BOD$Time, BOD$demand, geom="bar", stat="identity")# 将x转化为因子型变量,令系统将其视作离散值qplot(factor(BOD$Time), BOD$demand, geom="bar", stat="identity")图2-6 左图:qplot()函数绘制的连续变量x的变量值条形图 右图:将变量x转化为因子型变量(注意,横坐标上没有6这个类别)

qplot()函数也可以用来绘制分组变量的频数条形图(见图2-7),事实上,这是ggplot2绘制条形图的默认方式,它比绘制变量值条形图的命令更简短。再提醒一次,注意连续x轴和离散x轴的差异。# cyl是连续变量qplot(mtcars$cyl)# 将cyl转化为因子型变量qplot(factor(mtcars$cyl))图2-7 左图:qplot()函数绘制的连续变量x的频数条形图 右图:将cyl转化为因子型变量

如果参数向量包含在同一个数据框内,则可以运行下面的语句:# 变量值条形图,这里用BOD数据框中的Time列# 和demand列分别作为x和y参数qplot(Time, demand, data=BOD, geom="bar", stat="identity")# 这与下面的语句等价ggplot(BOD, aes(x=Time, y=demand)) + geom_bar(stat="identity")# 频数条形图qplot(factor(cyl), data=mtcars)# 这与下面的语句等价ggplot(mtcars, aes(x=factor(cyl))) + geom_bar()另见

更多关于绘制条形图的详细内容可参见本书第3章。2.4 绘制直方图问题

如何绘制直方图来查看一维数据的分布特征?方法

可以使用hist()函数绘制直方图(见图2-8),使用时需向其传递一个向量:hist(mtcars$mpg)# 通过breaks参数指定大致组距hist(mtcars$mpg,breaks=10)图2-8 左图:基础绘图系统绘制的直方图 右图:使用更多分组。注意:由于组距变小,每组对应的样本数有所减少

对于ggplot2包,可以使用qplot()函数得到同样的绘图结果(见图2-9):qplot(mtcars$mpg)图2-9 左图:ggplot2中qplot()函数绘制的直方图,组距为默认值 右图:组距更大的直方图

如果参数向量在同一个数据框内,则可以使用下面的语句:library(ggplot2)qplot(mpg, data=mtcars, binwidth=4)# 这等价于ggplot(mtcars, aes(x=mpg)) + geom_histogram(binwidth=4)另见

更多关于绘制直方图的内容参见6.1节和6.2节。2.5 绘制箱线图问题

如何绘制箱线图以对不同分布进行比较?方法

使用plot()函数绘制箱线图(见图2-10)时向其传递两个向量:x和y。当x为因子型变量(与数值型变量对应)时,它会默认绘制箱线图:plot(ToothGrowth$supp, ToothGrowth$len)

当两个参数向量包含在同一个数据框中时,也可以使用公式语法。公式语法允许我们在x轴上使用变量组合,如图 2-10 所示。# 公式语法boxplot(len ~ supo, data = ToothGrowth)# 在x轴上引入两变量的交互boxplot(len ~ supp + dose, data = ToothGrowth)图2-10 左图:基础绘图系统绘制的箱线图 右图:基于多分组变量的箱线图

对于ggplot2包,你可以使用qplot()函数绘制同样的图形(见图2-11),使用时将参数设定为geom="boxplot":library(ggplot2)qplot(ToothGrowth$supp, ToothGrowth$len, geom="boxplot")图2-11 左图:qplot()函数绘制的箱线图 右图:基于多分组变量的箱线图

当两个参数向量在同一个数据框内时,则可以使用下面的语句:qplot(supp, len, data=ToothGrowth, geom="boxplot")# 这等价于ggplot(ToothGrowth, aes(x=supp,y=len)) + geom_boxplot()

使用interaction()函数将分组变量组合在一起也可以绘制基于多分组变量的箱线图,如图2-11右图所示。本例中,dose变量是数值型,因此,我们必须先将其转化为因子型变量,再将其作为分组变量:# 使用三个独立的向量参数qplot(interaction(ToothGrowth$supp, ToothGrowth$dose), ToothGrowth$len,geom="boxplot")# 也可以以数据框中的列作为参数qplot(interaction(supp, dose), len, data=ToothGrowth, geom="boxplot")# 这等价于ggplot(ToothGrowth, aes(x=interaction(supp, dose), y=len)) + geom_boxplot()你可能会注意到基础绘图系统绘制的箱线图与ggplot2

略有不同。这是因为两者在绘图过程中调用的计算分位数的

方法略有差异。运行?geom_boxplot和?boxplot.base命令可

以得到更多关于两者差异的细节信息。另见

更多关于绘制箱线图的内容参见6.6节。2.6 绘制函数图像问题

如何绘制函数图像?方法

可以使用curve()函数绘制函数图像,如图2-12左图所示。使用时需向其传递一个关于变量x的表达式:curve(x^3 - 5*x, from=-4, to=4)

你可以绘制任何一个以数值型向量作为输入且以数值型向量作为输出的函数图像,包括你自己定义的函数,如图2-12右图所示。图2-12 左图:基础绘图系统绘制的函数图像 右图:绘制用户自定义的函数

将参数设置为add=TRUE可以向已有图形添加函数图像:# 绘制用户自定义的函数图像myfun <- function(xvar) {   1/(1 + exp(-xvar + 10))    }curve(myfun(x), from=0, to=20)# 添加直线curve(1-myfun(x), add = TRUE, col ="red")

对于ggplot2,可以使用qplot()函数绘制得到同样的结果(见图2-13)。使用时需设定stat="function"和geom="line",并向其传递一个输入和输出皆为数值型向量的函数:library(ggplot2)# 将x轴的取值范围设定为0到20qplot(c(0, 20), fun=myfun, stat="function", geom="line")# 这等价于ggplot(data.frame(x=c(0, 20)), aes(x=x)) + stat_function(fun=myfun, geom="line")图2-13 qplot()函数绘制的函数图像另见

更多关于绘制函数图像的内容参见13.2节。第3章 条形图

条形图也许是最常用的数据可视化方法,通常用来展示不同的分类下(在x轴上)某个数值型变量的取值(在y轴上)。例如,条形图可以用来形象地展示四种不同商品的价格情况,但不适宜用来展示商品价格随时间的变动趋势,因为这里时间是一个连续变量——尽管我们也可以这么做,后面会看到这种情形。

绘制条形图时需特别注意一个重要的细节:有时条形图的条形高度表示的是数据集中变量的频数,有时则表示变量取值本身。牢记这个区别——这里极易混淆,因为两者与数据集的对应关系不同,但又对应同样的术语。本章将对此进行深入讨论,并分别介绍这两类条形图的绘图技巧。3.1 绘制简单条形图问题

你有一个包含了两列数据的数据框,其中一列数据表示条形在x轴上的位置,另一列表示每个条形在y轴上对应的高度,基于此,如何绘制条形图?方法

使用ggplot()函数和geom_bar(stat="identity")绘制上述条形图,并分别指定与x轴和y轴对应的变量(见图3-1)。library(gcookbook) #为了使用数据ggplot(pg_mean, aes(x=group, y=weight)) + geom_bar(stat="identity")图3-1 x轴为离散时,针对变量值绘制的条形图(参数stat="identity")讨论

当x是连续型(数值型)变量时,条形图的结果与上图会略有不同。此时,ggplot不是只在实际取值处绘制条形,而将在x轴上介于最大值和最小值之间所有可能的取值处绘制条形,如图3-2所示。我们可以使用factor()函数将连续型变量转化为离散型变量。# 没有Time == 6的输入BOD Time demand   1  8.3   2  10.3   3  19.0   4  16.0   5  15.6   7  19.8# Time是数值型(连续型)变量str(BOD)'data.frame': 6 obs. of 2 variables: $ Time : num 1 2 3 4 5 7 $ demand: num 8.3 10.3 19 16 15.6 19.8 - attr(*, "reference")= chr "A1.4, p. 270"ggplot(BOD, aes(x=Time, y=demand)) + geom_bar(stat="identity")# 使用factor()函数将Time转化为离散型(分类)变量ggplot(BOD, aes(x=factor(Time), y=demand)) + geom_bar(stat="identity")图3-2 左图:针对变量值绘制的条形图(参数stat="identity"),x轴对应的是连续型变量  右图:将x转化为因子型变量之后绘制的条形图(注意此处缺失了取值为6的条形)

本例中,数据集中包含两列分别对应于x和y变量。如果你想让条形图的高度与每组变量的频数相对应,可参见3.3节的内容。

默认设置下,条形图的填充色为黑灰色且条形图没有边框线,我们可通过调整fill参数的值来改变条形图的填充色;可通过colour参数为条形图添加边框线。在图3-3中,我们将填充色和边框线分别指定为浅蓝色和黑色。图3-3 所有条形的填充色和边框线颜色均为单色ggplot(pg_mean, aes(x=group, y=weight)) +  geom_bar(stat="identity", fill="lightblue", colour="black")在ggplot2中,颜色参数默认使用的是英式拼写colour,

而非美式拼写color。然而,ggplot2会在底层将美式拼写重

映射为英式拼写,因此输入美式拼写的参数并不影响函数的

运行。另见

如果你想让条形图的高度对应于每组变量的频数,可参见3.3节的内容。

根据另一个变量值重排因子水平顺序的内容可参见15.9节。手动更改因子水平顺序的内容,可参见15.8节。

更多关于图形着色的内容,可参见本书第12章。3.2 绘制簇状条形图问题

如何绘制基于某个分类变量的簇状条形图?方法

将分类变量映射到fill参数,并运行命令geom_bar(position="dodge")。

下面以cabbage_exp数据集为例演示一下绘图过程,cabbage_exp数据集包含两个分类变量Cultivar和Date及一个连续型变量Weight。library(gcookbook) #为了使用数据cabbage_exp Cultivar Date Weight    c39 d16 3.18    c39 d20 2.80    c39 d21 2.74    c52 d16 2.26    c52 d20 3.11    c52 d21 1.47

我们分别将Date和Cultivar映射给x和fill(见图3-4)。图3-4 簇状条形图ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +  geom_bar(position="dodge",stat="identity")讨论

最简单的条形图通常只对应一个绘制在x轴上的分类变量和一个绘制在y轴上的连续型变量。有时候,我们想额外添加一个分类变量跟x轴上的分类变量一起对数据进行分组。此时,可通过将该分类变量映射给fill参数来绘制簇状条形图,这里的fill参数用来指定条形的填充色。在这一过程中必须令参数position="dodge"以使得两组条形在水平方向上错开排列,否则,系统会输出堆积条形图(参见3.7节)。

与映射给条形图x轴的变量类似,映射给条形填充色参数的变量应该是分类变量而不是连续型变量。

我们可以通过将geom_bar()中的参数指定为colour="black"为条形添加黑色边框线;可以通过scale_fill_brewer()或者scale_fill_manual()函数对图形颜色进行设置。在图3-5中,我们使用RColorBrewer包中的Pastel1调色盘对图形进行调色。图3-5 添加了黑色边框线的簇状条形图,这里用了新的调色板ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) +  geom_bar(position="dodge", stat="identity", colour="black") +  scale_fill_brewer(palette="Pastel1")

其他图形属性诸如颜色colour(指定条形图的边框线颜色)和线型(linestyle)也能用来对变量进行分组,不过,填充色(fill)也许是最合人心意的图形属性。

注意,如果分类变量各水平的组合中有缺失项,那么,绘图结果中的条形则相应地略去不绘,同时,临近的条形将自动扩充到相应位置。删去上例数据中的最后一行后,可得到图3-6。ce <- cabbage_exp[1:5,] #复制删除了最后一行的数据集ceCultivar Date Weight    c39 d16 3.18    c39 d20 2.80    c39 d21 2.74    c52 d16 2.26    c52 d20 3.11  ggplot(ce, aes(x=Date, y=Weight, fill=Cultivar)) +  geom_bar(position="dodge",stat="identity", colour="black") +  scale_fill_brewer(palette="Pastel1")图3-6 缺失条形的簇状条形图——临近的条形自动扩充到相应位置

如果你的数据与上面类似,那么,你可以在分类变量组合缺失的那一项为变量y手动输入一个NA值。另见

更多关于条形图着色的内容,可参见3.4节。

根据另一个变量值重排因子水平顺序的内容可参见15.9节。3.3 绘制频数条形图问题

如果数据集中每行数据对应于一个样本,如何针对样本频数绘制条形图?方法

使用geom_bar()函数,同时不要映射任何变量到y参数(见图3-7)。ggplot(diamonds, aes(x=cut)) + geom_bar()# 等价于使用geom_bar(stat="bin")图3-7 频数条形图讨论

diamonds数据集共有53 940行数据,每行数据对应于一颗钻石的品质信息:diamonds   carat cut color clarity depth table price  x  y  z1   0.23   Ideal  E  SI2   61.5   55  326  3.95 3.98 2.432  0.21 Premium  E  SI1   59.8  61  326  3.89 3.84 2.313  0.23   Good  E  VS1   56.9  65  327  4.05 4.07 2.31...53539 0.86 Premium  H  SI2   61.0  58  2757  6.15 6.12 3.7453540 0.75  Ideal  D  SI2   62.2  55  2757  5.83 5.87 3.64

geom_bar()函数在默认情况下将参数设定为stat="bin",该操作会自动计算每组(根据x轴上面的变量进行分组)变量对应的观测数。从图中可以看到,切工精美的钻石大概有23 000颗。

本例中,x轴对应的是离散型变量。当x轴对应于连续型变量时,我们会得到一张直方图,如图3-8所示。ggplot(diamonds, aes(x=carat)) + geom_bar()图3-8 x轴对应于连续型变量的条形图,也即常说的直方图

在这个例子中,使用geom_bar()和geom_histogram()具有相同的效果。另见

如果不想让ggplot()函数自动计算每组数据的行数绘制频数条形图,而是想通过数据框中的某列来指定y参数的话,可以参见3.1节的内容。

当然,也可以通过先计算出每组数据的行数,再将计算结果传递给ggplot()函数来绘制上图。更多关于数据描述的内容,可参见15.17节。

更多关于直方图的内容,可参见6.1节。3.4 条形图着色问题

如何将条形图中的条形设定为不同的颜色?方法

将合适的变量映射到填充色(fill)上即可。

这里以数据集uspopchange为例。该数据集描述了美国各州人口自2000年到2010年的变化情况。我们选取出人口增长最快的十个州进行绘图。图中会根据地区信息(东北部、南部、中北部、西部)对条形进行着色。

首先,选取出人口增长最快的十个州:library(gcookbook) #为了使用数据upc <- subset(uspopchange, rank(Change)>40)upc     State  Abb Region Change    Arizona  AZ  West  24.6    Colorado  CO  West  16.9    Florida  FL  South  17.6    Georgia  GA  South  18.3     Idaho  ID  West  21.1     Nevada  NV  West  35.1

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载