第 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)改变代表每个点的符号。这一次,使用参数 xlab
为 x 轴添加一个标签,代码如下:
> 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=20
或 pch=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()
相似的地方是什么?有什么不同吗?你更喜欢哪个函数呢?