第 2 章 R 图概述

第 2 章 R 图概述

本章讨论怎样导出图表以及探索性图表和展示性图表间的区别,也会简单概述 R 中的几种图形系统。如果你有编程经验或者丰富的图表经验,在了解 R 图表类型的特性前,很可能会想先了解这些内容。如果你没有这样的背景,可能会觉得这一章技术性有点过强,此时此刻没必要学习。若是这种情况,则可直接转到第 3 章,准备好后再来看这一章。

2.1 图表导出

制作一张图表后,你可能想保存它或者将它存入文件。怎样保存取决于你正在使用的软件是什么。例如,如果使用文字处理软件,可以简单地复制图表,方法是打开 R 的图形窗口,点击“编辑”(Edit)菜单中的“复制”(Copy),或者点击链接到图表的上下文菜单,然后就可以把图表粘贴到文字处理软件。

其他软件需要你付出更多的努力。若尝试了复制粘贴的方法但不起作用,就需要选择一个文件类型,并使 R 以这种格式保存图表到指定文件。图片格式有 .bmp、.pdf、.jpeg、.png、.tiff、.ps(PostScript),等等。可以以这些格式中的任意一种保存图片。下面的代码示例展示了怎样将练习 1-1 中制作的图表保存为 .jpeg 文件,命名为 test.jpeg(当然,可以用任意其他名字来命名,只要扩展名是 .jpeg。比如,将它命名为 mywork.jpeg):

jpeg("test.jpeg")  # 打开图案
plot(year, rate)
dev.off()  # 关闭图案,必须执行这条

图表按此方式保存以后,可以插入文字处理程序的文档。比如在 OpenOffice 中,可以打开“插入”(Insert)窗口,点击“图片”(Picture),再点击“从文件”(From File),然后从工作目录中选择 test.jpeg 文件。当然,当图片保存在一个文件中后,可被加载到各种应用程序,比如绘图或插图程序。例如,如果需要,可以在 Adobe Illustrator 或 Inkscape 中“美化”(brush up)你的 R 图。本书中的图表不“美化”,以 .png 格式保存在我的编辑的 Google Drive 账号中。对于高分辨率图,我使用如下这段代码:

dpi=600
png("filename.png", width = 6*dpi, height = 6*dpi,
  res = dpi)
graphic commands
dev.off()

要了解更多这种保存文件的方式,可输入 ?png 进行查看。

什么是“设备”

指定设备是告诉 R 在哪里画图,并定义 R 将采取的格式。如果没有指定设备,图形出现在计算机屏幕上的图形窗口中。如果想将图表保存到文件(在硬盘、闪存或者其他地方),必须通过“打开设备”(opening a device),告诉 R 将图表写入哪个文件(设备)。通过命令告诉 R 使用的设备以及 R 文件的格式,比如 .jpeg、.pdf、.png 等。然后,可以使用任何需要的图形命令在设备上画你想要的类型的图。最后,“关闭设备”(close the device),即停止写入该文件。如果已经(使用dev.off())关掉了设备,则结果会显示在屏幕上,或者写入一个打开的新设备。输入 ?device 命令,可了解更多关于设备的信息。

2.2 探索性图表和展示性图表

图表有利于探索(exploration)和展示(presentation)。探索是分析数据和寻找关系与模式的过程;展示成果是将你的发现展示给其他人,他们没有像你一样深入研究过这些数据。在探索数据期间,你的图表可能是粗陋的、简单的,某种程度上没有吸引力。作为数据分析师,你了解数据,并随着每张图表的制作,了解越来越深入。有人可能期望看到所有的标题、标签、参考细节和颜色,他们发现这些是必要的,但这些对你并不是必需的。另外,添加所有无关紧要的细节只会减慢探索的速度。同时,一些图表会被证明是行不通的或不是很有趣。因此,在探索的过程中,很多图表可能会被丢弃。

随着探索过程的继续,添加一些细节可以让关系更加清晰。越接近展示或发布,图表就会越详细、越漂亮。在分析数据的过程中,你可能会创建很多单调的图表,最终报告中的漂亮图表则相当少。

下面是 mtcars 数据集的两张图表,R 的基础安装中包括该数据集。它展示了 mpg(英里 / 加仑)和 wt(汽车的重量)间的关系。第一张图(见图 2-1)是用散点图(scatter plot)辨别这两个变量间关系的早期尝试。它清楚地表明,随着汽车重量的增加,每加仑行驶的里程减少。如果你不熟悉散点图,在读完第 12 章后,可能会想回到这个例子。第二张图,如图 2-2 所示,比第一张图精致。它有标题和坐标轴上的标签,并按气缸数将汽车分类,当然图片还是彩色的。这是可以在演示文稿(PowerPoint)上展示的图表。在这两个例子之间,可能有其他数个相对单调的探索性图表。因为本书主要介绍图表分析的过程,所以书中的很多例子简单、朴实无华,但它们都会通向有吸引力的成品。

生成图 2-1 的一行代码如下:

plot(mtcars$wt, mtcars$mpg, pch=16)

{%}

图 2-1:wtmpg 的探索性图表

{%}

图 2-2:wtmpg 的展示性图表;图 2-1 的改进版

生成更丰富多彩且更精致的图 2-2 需要多几行代码。完成它需要做更多的工作,但是它可以作为有用的展示对象,付出的努力也是值得的。生成图表使用的各种类型的命令在此不做介绍,本书后几章会对它们进行讨论。要点就是用 R 很容易制作出简单有效的图表,但是若要制作精美的图表,则需要多做一些工作。生成图 2-2 的脚本如下:

# 生成图2-2的脚本
library(car)
attach(mtcars)
par(bg="snow",fg="snow",col.axis="black",bty="l")
mtcars$wt2 = 1000*wt
attach(mtcars)
scatter plot(mpg~wt2|cyl,
  smoother=FALSE,
  reg.line=FALSE,
  col=c("indianred4","blue","purple"),
  pch=c(15,16,17),
  main="Fuel Consumption in Selected Cars",
  ylab="Miles per Gallon",
  xlab="Weight of Car in Pounds",las=1,
  legend.plot=FALSE,bty="l")
axis(2,col="black",at=c(10,15,20,25,30,35),las=2)
axis(1,col="black",at=c(1000,2000,3000,4000,5000,6000))
legend("topright",
  title="No. of Cylinders",
  c("4","6","8"),
  inset=-.005,
  text.col=c("indianred4",
  "blue","purple"),
  title.col="black",
  cex =.65,
  pch=c(15,16,17),
  col=c("indianred4","blue","purple"),
  bty="n")
detach(mtcars)

2.3 R图形系统

R 有几种可用的图形系统。基础 R 包有很多好用的图表函数,但 R 用户也通过贡献新的图形软件包扩展了 R 的制图能力。下面的讨论描述了各种图形包的优势和风格。

2.3.1 基本图形和网格

基础 R 包括图形软件包,在第一次安装 R 的时候会自动安装,且每次启动 R 的时候也会自动加载。它可以生成广泛定制的多种类型的图表,功能非常强大。很多 R 用户永远不需要比基础 R 提供的更强大、更灵活的功能。本书的大多数图表是用基础的 R 图形软件包生成的。

尽管基础 R 图形包让人印象深刻,但有时应用程序要求对图形输出的细节有更多控制。因此,针对低级(low-level)的图形,开发了网格(grid)包。“低级”是指 grid 提供了大量的工具或材料,供使用其他包的开发者利用,来完成图表。

在这方面,grid 有点像一个生产木板(低级材料)的木材厂,建筑商或家庭业主将这些材料用在房屋内的(高级)项目,比如地板或者书架子上。好的建造者不需要关心木材厂如何截断树木、粗切木板及刨光。建造者的工作从木板开始,而不是从树木开始。grid 包加工材料,这些原料可用于本章所讨论的其他图形系统,以及其他多种 R 包中的一些图形处理程序。grid 包不提供任何能直接用于完成图表的函数。我们需要用到的一些图形函数已经使用 grid 函数构建完成。关于 grid 的详细信息,参见 Murrell(2011)。因为用户通常不直接编写网格代码,所以这里没有与 grid 相关的例子。

2.3.2 lattice

开发 lattice 包是为了针对多元数据(multivariate data)提供改进的图表,即一次绘制超过两个变量的图形。lattice 仿照了 Cleveland(1985,1993)描述的格子图(trellis graphics)。他认为,有时可视化几个变量间关系的最有效的方法,并不是试图把所有变量放在一张图表中,而是查看几个按目的组织的相关的图表。例如,图 2-3 展示了一个来自 epicalc 包的 BP 数据集格子图,有四个窗口或面板(panel)。在每个面板中有一张收缩压 / 舒张压的图,每个面板展示了 sex(性别)和 saltadd(是否在饮食中加盐)的组合图。

{%}

图 2-3:使用 lattice 包生成的格子图

通过在一个页面上浏览四个相关的图表,图 2-3 展示了一种同时研讨四个变量间关系的方式。代码如下:

# 图2-3
library(lattice)
library(epicalc)
attach(BP)
xyplot(sbp~dbp|saltadd*sex,pch=16)
detach(BP)

lattice 在安装基础 R 时会自动安装,但在需要它的每个会话中必须加载它。除了格子图,它还包括许多其他类图表函数。虽然本书只使用了几个 lattice 的例子,但它是一个很好的 R 图形包,扩展了 R 的功能。当你越来越熟悉 R 和基础图形时,会发现它值得花时间学习。

2.3.3 ggplot2

设计 ggplot2 包是为了在访问所有的图表类型时语法一致;也就是说,从一种图形到另一种图形,命令语言是相似的。这和基础 R 形成鲜明对比,因为它有许多可用于多个不同类型的图表参数,但也有一些差异。ggplot2 包功能也很强大,你可以很轻松地定制图表的显示。因为这个包的语法和基础 R 差异很大,所以本书很少有使用它的例子。不过,应该提一下,有些命令的设计看起来和基础 R 很类似,所以可以尝试一下 ggplot2 的功能,不需要付出多少努力。如果你需要这个包的一些特殊功能,在更好地理解 R 以后,可以学习一下。ggplot2 和基础 R 图形的审美风格相当不同,你可能喜欢也可能不喜欢它。图 2-4 是它的一个例子,由如下代码生成:

# 图2-4
library(ggplot2)
ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point()

{%}

图 2-4:基于与图 2-1 和图 2-2 中基础 R 图相同的数据,用 ggplot2 生成的简单图表

ggplot2 不是随基础 R 包一起安装的,因此,如果需要使用它,首先要安装它,然后在想使用它的每个会话中加载它。

2.3.4 包的特殊应用程序/图表

许多包内含一些绘图功能,即便那些不是主要用作图形包的包也是如此。在 CRAN 任务视图的 Web 页面(http://cran.r-project.org/web/views/),你可以领略到丰富多样的图形产品。点击 Graphics 查看许多包中的图形类型的概述,但请记住,这并不包括所有的图形类型。此外,一些包可能只有几个混有许多其他特性的图表函数,而这些类型的包通常不会出现在任务视图中。用你最喜欢的搜索引擎在互联网上搜索 R 中某种图形系统的相关信息。在成千上万个 R 包中找到你想要的包是一个艰巨的任务!

2.3.5 用户自定义图表函数

如果找不到适合数据的图表,可以自己写一个图表函数。这只是第 1 章提到的方法的扩展。后面将介绍大量的图形工具,你可以将它们用到这些函数中。第 14 章提供了用户编写的用来生成 Bland-Altman 图的图形函数的例子。

目录

  • 版权声明
  • O'Reilly Media, Inc. 介绍
  • 前言
  • 第一部分 开始使用 R
  • 第 1 章 R 基础
  • 第 2 章 R 图概述
  • 第二部分 单变量图
  • 第 3 章 带状图
  • 第 4 章 点图
  • 第 5 章 箱线图
  • 第 6 章 茎叶图
  • 第 7 章 直方图
  • 第 8 章 核密度图
  • 第 9 章 条形图
  • 第 10 章 饼图
  • 第 11 章 地毯图
  • 第三部分 双变量图
  • 第 12 章 散点图和折线图
  • 第 13 章 高密度图
  • 第 14 章 Bland-Altman 图
  • 第 15 章 QQ 图
  • 第四部分 多变量图
  • 第 16 章 散点图矩阵和相关性分析图
  • 第 17 章 三维图
  • 第 18 章 协同图
  • 第 19 章 聚类分析:树状图和热图
  • 第 20 章 马赛克图
  • 第五部分 现在该做些什么
  • 第 21 章 拓展图形化知识和 R 技能的资源
  • 附录 A 参考文献
  • 附录 B R 的颜色
  • 附录 C R Commander 图形用户界面
  • 附录 D 使用 / 引用的包
  • 附录 E 从 R 的外部导入数据
  • 附录 F 章节练习解答
  • 附录 G 故障排查:为什么我的代码不工作
  • 附录 H 本书介绍的 R 函数
  • 关于作者
  • 关于封面