6.1 条形图

条形图通过垂直的或水平的条形展示了类别型变量的分布(频数)。函数barplot()的最简单用法是:

  1. barplot(height)

其中的height是一个向量或一个矩阵。

在接下来的示例中,我们将绘制一项探索类风湿性关节炎新疗法研究的结果。数据已包含在随vcd包分发的Arthritis数据框中。由于vcd包并没用包括在R的默认安装中,请确保在第一次使用之前先下载并安装它(install. packages("vcd"))。

注意,我们并不需要使用vcd包来创建条形图。我们读入它的原因是为了使用Arthritis数据集。但我们需要使用vcd包创建6.1.5节中描述的棘状图(spinogram)。

6.1.1 简单的条形图

height是一个向量,则它的值就确定了各条形的高度,并将绘制一幅垂直的条形图。使用选项horiz=TRUE则会生成一幅水平条形图。你也可以添加标注选项。选项main可添加一个图形标题,而选项xlabylab则会分别添加x轴和y轴标签。

在关节炎研究中,变量Improved记录了对每位接受了安慰剂或药物治疗的病人的治疗结果。

  1. > library(vcd)
  2. > counts <- table(Arthritis$Improved)
  3. > counts
  4. None Some Marked
  5. 42 14 28

这里我们看到,28位病人有了明显改善,14人有部分改善,而42人没有改善。我们将在第7章更充分地讨论使用table()函数提取各单元的计数的方法。

你可以使用一幅垂直或水平的条形图来绘制变量counts。代码见代码清单6-1,结果如图6-1所示。

代码清单6-1 简单的条形图

  1. barplot(counts, # 简单条形图
  2. main="Simple Bar Plot",
  3. xlab="Improvement", ylab="Frequency")
  4. barplot(counts, # 水平条形图
  5. main="Horizontal Bar Plot",
  6. xlab="Frequency", ylab="Improvement",
  7. horiz=TRUE)

6.1 条形图 - 图1

图6-1 简单的垂直条形图和水平条形图

小提示 若要绘制的类别型变量是一个因子或有序型因子,就可以使用函数plot()快速创建一幅垂直条形图。由于Arthritis$Improved是一个因子,所以代码:

  1. plot(Arthritis$Improved, main="Simple Bar Plot",
  2. xlab="Improved", ylab="Frequency")
  3. plot(Arthritis$Improved, horiz=TRUE, main="Horizontal Bar Plot",
  4. xlab="Frequency", ylab="Improved")

将和代码清单6-1生成相同的条形图,而无需使用table()函数将其表格化。

如果标签很长怎么办?在6.1.4节中,你将看到微调标签的方法,这样它们就不会重叠了。

6.1.2 堆砌条形图和分组条形图

如果height是一个矩阵而不是一个向量,则绘图结果将是一幅堆砌条形图或分组条形图。若beside=FALSE(默认值),则矩阵中的每一列都将生成图中的一个条形,各列中的值将给出堆砌的“子条”的高度。若beside=TRUE,则矩阵中的每一列都表示一个分组,各列中的值将并列而不是堆砌。

考虑治疗类型和改善情况的列联表:

  1. > library(vcd)
  2. > counts <- table(Arthritis$Improved, Arthritis$Treatment)
  3. > counts
  4. Treatment
  5. Improved Placebo Treated
  6. None 29 13
  7. Some 7 7
  8. Marked 7 21

你可以将此结果绘制为一幅堆砌条形图或一幅分组条形图(见代码清单6-2)。结果如图6-2所示。

代码清单6-2 堆砌条形图和分组条形图

  1. barplot(counts, # 堆砌条形图
  2. main="Stacked Bar Plot",
  3. xlab="Treatment", ylab="Frequency",
  4. col=c("red", "yellow","green"),
  5. legend=rownames(counts))
  6. barplot(counts, # 分组条形图
  7. main="Grouped Bar Plot",
  8. xlab="Treatment", ylab="Frequency",
  9. col=c("red", "yellow", "green"),
  10. legend=rownames(counts), beside=TRUE)

第一个barplot函数绘制了一幅堆砌条形图,而第二个绘制了一幅分组条形图。我们同时使用col选项为绘制的条形添加了颜色。参数legend.text为图例提供了各条形的标签(仅在height为一个矩阵时有用)。

在第3章中,我们讲解过格式化和放置图例的方法,以确保最好的效果。请试着重新排布图例的位置以避免它们和条形产生叠加。

6.1 条形图 - 图2

图6-2 堆砌条形图和分组条形图

6.1.3 均值条形图

条形图并不一定要基于计数数据或频率数据。你可以使用数据整合函数并将结果传递给barplot()函数,来创建表示均值、中位数、标准差等的条形图。代码清单6-3展示了一个示例,结果如图6-3所示。

代码清单6-3 排序后均值的条形图

  1. > states <- data.frame(state.region, state.x77)
  2. > means <- aggregate(states$Illiteracy, by=list(state.region), FUN=mean)
  3. > means
  4. Group.1 x
  5. 1 Northeast 1.00
  6. 2 South 1.74
  7. 3 North Central 0.70
  8. 4 West 1.02
  9. > means <- means[order(means$x),] # ❶ 将均值从小到大排序
  10. > means
  11. Group.1 x
  12. 3 North Central 0.70
  13. 1 Northeast 1.00
  14. 4 West 1.02
  15. 2 South 1.74
  16. > barplot(means$x, names.arg=means$Group.1)
  17. > title("Mean Illiteracy Rate") # ❷ 添加标题

代码清单6-3将均值从小到大排序❶。同时注意,使用title()函数❷与调用plot()时添加main选项是等价的。means$x是包含各条形高度的向量,而添加选项names.arg=means$Group.1是为了展示标签。

6.1 条形图 - 图3

图6-3 美国各地区平均文盲率排序的条形图

你可以进一步完善这个示例。各个条形可以使用lines()函数绘制的线段连接起来。你也可以使用gplots包中的barplot2()函数创建叠加有置信区间的均值条形图。R Graph Gallery网站(http://addictedtor.free.fr/graphiques)上的“barplot2: Enhanced Bar Plots”页面可以作为一个参考示例。

6.1.4 条形图的微调

有若干种方式可以微调条形图的外观。例如,随着条数的增多,条形的标签可能会开始重叠。你可以使用参数cex.names来减小字号。将其指定为小于1的值可以缩小标签的大小。可选的参数names.arg允许你指定一个字符向量作为条形的标签名。你同样可以使用图形参数辅助调整文本间隔。代码清单6-4给出了一个示例,输出如图6-4所示。

代码清单6-4 为条形图搭配标签

  1. par(mar=c(5,8,4,2))
  2. par(las=2)
  3. counts <- table(Arthritis$Improved)
  4. barplot(counts,
  5. main="Treatment Outcome",
  6. horiz=TRUE, cex.names=0.8,
  7. names.arg=c("No Improvement", "Some Improvement",
  8. "Marked Improvement"))

本例中,我们(使用las=2)旋转了条形的标签、修改了标签文本,并(使用mar)增加了y边界的大小,为了让标签更合适,(使用cex.names=0.8)缩小了字体大小。par()函数能够让你对R的默认图形做出大量修改。详情参阅第3章。

6.1 条形图 - 图4

图6-4 微调了标签的垂直条形图

6.1.5 棘状图

在结束关于条形图的讨论之前,让我们再来看一种特殊的条形图,它称为棘状图(spinogram)。棘状图对堆砌条形图进行了重缩放,这样每个条形的高度均为1,每一段的高度即表示比例。棘状图可由vcd包中的函数spine()绘制。以下代码可以生成一幅简单的棘状图:

  1. library(vcd)
  2. attach(Arthritis)
  3. counts <- table(Treatment, Improved)
  4. spine(counts, main="Spinogram Example")
  5. detach(Arthritis)

输出如图6-5所示。治疗组同安慰剂组相比,获得显著改善的患者比例明显更高。

6.1 条形图 - 图5

图6-5 关节炎治疗结果的棘状图

除了条形图,饼图也是一种用于展示类别型变量分布的流行工具,接下来讨论它。