第 3 章 带状图

第 3 章 带状图

3.1 一种简单的图

带状图(strip chart)是最简单但仍然非常有用的一种图。一些分析师称其为“点图”(dot plot)。此类图提供了一种查看一组数字如何分布(distribute)的方法。也就是说,数据的形状是什么?可以确定最大和最小数字吗?它们是如何展开的,以及一些数字是否聚集在一起?

我们来研讨一下基础 R 包提供的 trees 数据集。为了查看该数据集的描述,请输入如下命令:

> ?trees

该命令会打开一个新窗口,描述了该数据集。窗口中提供的信息如下:

简介

  这是关于数据的简单概述。

使用

  显示数据集的名字。

格式

  说明数据集的结构是数据框,有 3 个变量及 31 个观测值,并给出变量名和测量单位。

来源

  标明数据来自哪里。

参考文献

  包含数据分析例子的书籍或文章。我有时复制并粘贴参考文献到搜索引擎,来查看其中的分析示例。这种方法并不总是成功的,但一旦可行,通常是非常有用的。

例子

  提供一些使用数据集的 R 代码。复制并粘贴一个或多个例子到 R 控制台,看看生成了哪类统计分析或图形,有时这么做很有趣。本书稍后将讨论生成的图形类型,但也有一些统计分析没有涉及。

大多数数据集的帮助文档提供了上面列出的多项信息。

当你需要一点帮助……

R 提供了几种易于访问的帮助。举例如下。

  • ?numbers 为以 numbers 命名的数据集提供帮助。

  • ?mighty 为以 mighty 命名的函数提供帮助。

  • example(x) 提供函数 x 的样例输出。请尝试命令 example(stripchart)

  • vignette() 列出安装在计算机上的所有包的简介。试试看!

  • vignette(x) 展示 x 的简介。简介几乎可以是任何内容,从用户手册到 R 代码以及示例输出。

trees 数据集中的所有变量以不同的方式测量样本中 31 棵树的大小。考虑第一个变量 Volume,试试下面的命令。确保 Volume 中的字母 V 是大写的;否则 R 将报错,因为它不识别变量 volume

> attach(trees)
> Volume

你将会看到如下结果:

 [1] 10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 24.2 ...
[19] 25.7 24.9 34.5 31.7 36.3 38.3 42.6 55.4 55.7 58.3 51.5 ...

R 打印出 31 棵树各自的体积。输出包含索引号,显示第一行始于 [1][1] 为向量的第一个元素。第二行始于第 19 个元素。处理这些信息可能需要一段时间,因此需要一点策略。也许首先应该寻找最小值和最大值,也可以试着猜测平均值,或者看看是否有些树的体积相同。即使像这样的一个相对较小的数据集,这个过程看起来都似乎很难。下面的代码尝试一个简单的图:

> stripchart(Volume)

带状图如图 3-1 所示。

{%}

图 3-1:变量 Volume 的带状图

底部坐标轴显示 31 棵树的体积的数值。图形显示许多值集中在 20~30 立方英尺附近,少量的值集中于 50~60 立方英尺。有一个非常大的值,远远超过 70。这么大的值会引出一些重要的问题。是否有一些可以解释异常值的因素被忽视了?是否在测量或记录树的测量值时出现了错误?是否有一些方法来验证或纠正异常数据?如果要进一步分析这些数据,这个异常值应该包含在内还是排除在外?所有这些可能被忽视的问题,使分析从只考虑数据开始——换句话说,仅考虑平均体积。

图中没有 31 个不同的方块,因为有些树的体积相同或接近。通过在 stripchart() 命令中添加一个参数,可以把在图中争夺相同位置的那些树分散开,如下所示:

> stripchart(Volume, method = "jitter")

图 3-2 比图 3-1 有明显的改善。

{%}

图 3-2:树体积的抖动带状图

图 3-2 中仍有一些重叠,但仔细数数现在有 31 个点。共享同一位置的一些点“抖动”着高于或低于彼此,使图更易于阅读。进一步改善该图的一个方法是增加图中抖动量。可以使用帮助命令查看可用选项,命令如下:

> ?stripchart

stripchart() 的帮助文件有很多有用的信息,包括很多本书没有介绍但也许对你很有帮助的信息。帮助文件包括以下几个部分。

描述(Description)

  表明函数的作用,以及适用于哪些情况。

使用(Usage)

  说明基本的语法和默认选项。换句话说,如果不指定特定参数,将会发生什么?

参数(Argument)

  描述了可以做的选择,通过选择来达到自己想要的结果。(参数是在 1.2 节中定义的。)

细节(Detail)

  此处提供各种细节,比如去哪里找到更多信息、函数是谁开发的,等等。

举例(Example)

  提供代码,你可以将其复制粘贴到控制台,来感受下函数的真正功能。

帮助文件显示,jitter 的默认值是 0.1。用参数 jitter 和参数 stack 做实验,看看它们是如何工作的。优化图形的另一种方法是使用参数 pch(可看作 plot character)改变代表每个点的符号。这一次,使用参数 xlabx 轴添加一个标签,代码如下:

> stripchart(Volume, method = "jitter", pch = 20,
  xlab = "Volume in cubic feet")

改变后的结果如图 3-3 所示。

{%}

图 3-3:增加抖动并改变打印符号的体积带状图

因为打印符号较小,并且不像之前的图那样出现重叠,所以图 3-3 中各树的体积的间隔非常清晰。若仔细看图 3-2 和图 3-3,你会发现点的位置似乎有点不同了。实际上,它们都是对的!当使用 method = "jitter" 时,点是随机(random)放置的,高于或低于地平线。因此,即使是完全相同的数据,每次执行带抖动的 stripchart() 命令,结果也会略有不同。垂直方向(vertical placement)上的位置会略有不同,但水平位置则完全相同,而水平位置才是我们所关心的。(实际上,有一种方法可以解决这个问题,但会带来一个技术问题,这里我不想介绍。如果想看每个图中在同一个位置的点,那么每次使用 stripchart() 命令时,在其前边输入 set.seed(1) 命令。)

看下面的命令:

> ?points

它将打开一个窗口,窗口中包括参数 pch 的选项,还有很多其他信息。图 3-4 提取出了 pch 选项,并以更方便的形式展示出来。

图 3-4:图形参数 pch 的选项

对带状图来说,最好的符号是那些重叠最少的符号,往往是空心圆(pch=1)或非常小的符号(pch=20pch=18),还可以使用其他字符。因此,如果想要非常小的图形标记,可以使用英文句号:

pch = "."

3.2 数据可以漂亮

图 3-3 是一个非常好的展示数据的方式,便于理解数据。然而,为了达到展示的目的,我们可能更喜欢引人注目的东西。为使这张图更加有趣一点,可以做几件事。此处讨论的内容对于后文中的图形也是有帮助的。

大多数 R 图的四周都有框。这些框通常不是必要的,看起来缺乏吸引力,而且也会分散注意力。(有些人喜欢有框,但和我一起学习,你可能会在某个时刻想知道如何去掉框。)幸运的是,可以很容易地将它们去掉。有许多参数可以用来控制图形输出。查看图形参数的列表,请输入以下命令:

> ?par

可以在不同的图形命令中使用这些参数。其中一些参数只能在 par() 命令中使用,par() 命令通常出现在调用另一个图形函数之前。控制图框的参数是 bty,即框的类型(box type)。在输入图形命令之前,发出 par(bty="n") 命令,以完全去掉框。以下两条命令生成没有框围绕的图 3-5:

> par(bty = "n")  # 图3-5
> stripchart(Volume, method = "jitter", pch = 20,
  xlab = "Volume in cubic feet")

{%}

图 3-5:体积的带状图,周围没有框

图的周围有框吗

图的周围可以四周有框、局部有框或都没有框。 par() 函数的参数 bty 可用的选项有 "o"(默认)、"l""7""c""u""]"。每一个参数可在图周围,以参数表示的形状创建一个局部框。bty = "n" 表示去掉整个框。理解这些的最好方法是亲自尝试使用其中一个或多个。欲了解更多信息,请输入 ?par 查询。

注意,图 3-5 中的图没有框,Volume 的单个极值似乎没处于适当的位置,超出了图像范围。可以通过使用参数 xlim 延长坐标轴来解决这个问题,如图 3-6 所示。

{%}

图 3-6:没有框、添加颜色、延长坐标轴并添加文本的带状图

接下来想到的可能是颜色。在 stripchart() 命令中再添加一个参数,很容易就能改变点的颜色,代码如下:

# 图3-6
par(bty = "n")
stripchart(Volume,
  method = "jitter", jitter = .3,
  pch = 20,
  xlab = "Volume in cubic feet",
  col = "dodgerblue4",
  ylim = c(0,8),
  xlim = c(10,80)) # xlim 强制 x 取值位于 10 ~ 80
  # 且ylim更接近x轴

注意,参数 col 给出颜色的名称。R 有 657 种已命名的颜色可供使用。可以在附录 B 查看颜色列表。通过如下命令,也可以在你的计算机屏幕上看到 R 的颜色:

> demo(colors)

前面命令生成的图,只是改变了图中点的颜色。看完该图之后,你或许也想改变坐标轴的颜色。使用 axis() 命令可以改变坐标轴的颜色,代码如下。直接操作现有的图。axis() 命令改变了前面命令生成的图的坐标轴的颜色(对比图 3-6,再次查看结果):

> axis(1, col = "dodgerblue4", at = c(10,20,30,40,50,60,70,80))

坐标轴的控制

axis() 函数为当前平面图增加坐标轴。axis() 命令中使用的参数如下。

  • 操作哪个坐标轴:1。该参数是必需的,并且不需要包含参数名称(side)。可能的值为 1 = 下、2 = 左、3 = 上和 4 = 右。

  • 坐标轴的颜色:col = "dodgerblue4"

  • 标记和标签的位置:at = c(10,20,30,40,50,60,70,80)

还有其他几个参数,允许指定图的特性,比如字体、标签、线宽等。该函数可以添加到大多数图表,不仅仅是带状图。axis() 不是每个图必需的函数,但它使你对最终结果有很大的控制。欲知更多信息,请输入 ?axis 查询。

mtext() 命令在图形的绘图区域这外增加一个注解:

> mtext("Data source: Minitab Student Handbook",
side = 1, line = 4, adj = 1, col = "dodgerblue4", cex = .7)

给图添加文本

可以使用 text()mtext() 函数在图的空白区域或页边距处分别添加文本。对带状图例子中的 mtext() 命令的说明如下。

  • 需要显示的文本:本例中为"Data source: Minitab Student Handbook"

  • 位置:side = 1 指定在图形下方。其他可能的值有 2 (左)、3 (上)和 4 (右)。

  • 图形下方(或者上方、左边、右边)线的数量:line = 4

  • 对齐:adj = 1 表示在最右边,adj = 0 表示在最左边,0~1 的值表示与左边和右边的距离。

  • 颜色:col = "dodgerblue4"

  • 类型大小:cex = .7

欲知更多信息,请输入 ?mtext?text 查询。

结束 trees 数据集,输入如下命令:

> detach(trees)

3.2.1 练习3-1

尝试用另一个数据集 mtcars 绘制带状图。为变量 mpg 制作一个简单的带状图。你学到了什么?观察按汽车拥有的气缸数分解的 mpg 带状图,尝试制作一个更复杂的图;也就是说,为每个 cyl(气缸数)值绘制一个 mpg 带状图。下面的命令通过在符号~(波浪号)之后,使用分组变量 cyl 实现图形。通常分组变量是一个分类变量,而在本例中,它实际上是一个数量变量,只有少量可能的值——汽车可能有 4、6 或 8 个气缸:

> attach(mtcars)
> stripchart(mpg~cyl)
> detach(mtcars)

这是一种改进吗?你从这个图中获取了哪些额外的信息?试着给这个图增加抖动。这会有帮助吗?

3.2.2 练习3-2

很多可以添加到 R 的包为基础 R 提供的函数提供替代方案。通过安装 plotrix 包,尝试用 dotplot.mtb() 函数替换 stripchart(),测试 trees 数据集的变量 Volume。后者与 stripchart() 相似的地方是什么?有什么不同吗?你更喜欢哪个函数呢?

目录

  • 版权声明
  • 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 函数
  • 关于作者
  • 关于封面