9.3 分布图

9.3.1 问题

你想要绘制一组数据的分布图。

9.3.2 方案

后面的例子中会使用以下这组简单的数据:

  1. set.seed(1234)
  2. dat <- data.frame(cond = factor(rep(c("A", "B"), each = 200)),
  3. rating = c(rnorm(200), rnorm(200, mean = 0.8)))
  4. # 查看数据
  5. head(dat)
  6. #> cond rating
  7. #> 1 A -1.2071
  8. #> 2 A 0.2774
  9. #> 3 A 1.0844
  10. #> 4 A -2.3457
  11. #> 5 A 0.4291
  12. #> 6 A 0.5061
  13. library(ggplot2)

9.3.2.1 直方图和概率密度图

qplot() 函数能够用更简单的语法绘制出与 ggplot() 相同的图像。然而,在实践过程中你会发现 ggplot() 是更好的选择,因为 qplot() 中很多参数的选项都会让人感到困惑。

  1. # 以 rating 为横轴绘制直方图,组距设为 0.5
  2. # 两种函数都可以绘制出相同的图:
  3. ggplot(dat, aes(x=rating)) + geom_histogram(binwidth=.5)

9.3 分布图 - 图1

  1. # qplot(dat$rating, binwidth=.5)
  2. # 绘制黑色边线,白色填充的图
  3. ggplot(dat, aes(x=rating)) +
  4. geom_histogram(binwidth=.5, colour="black", fill="white")

9.3 分布图 - 图2

  1. # 密度曲线
  2. ggplot(dat, aes(x=rating)) + geom_density()

9.3 分布图 - 图3

  1. # 直方图与核密度曲线重叠
  2. ggplot(dat, aes(x=rating)) +
  3. geom_histogram(aes(y=..density..), # 这里直方图以 density (密度)为y轴
  4. binwidth=.5,
  5. colour="black", fill="white") +
  6. geom_density(alpha=.2, fill="#FF6666") # 重合部分透明填充

9.3 分布图 - 图4

添加一条均值线:

  1. ggplot(dat, aes(x=rating)) +
  2. geom_histogram(binwidth=.5, colour="black", fill="white") +
  3. geom_vline(aes(xintercept=mean(rating, na.rm=T)), # 忽略缺失值
  4. color="red", linetype="dashed", size=1)

9.3 分布图 - 图5

9.3.2.2 多组数据的直方图和概率密度图

  1. # 重叠直方图
  2. ggplot(dat, aes(x = rating, fill = cond)) + geom_histogram(binwidth = 0.5,
  3. alpha = 0.5, position = "identity") # identity 表示将每个对象直接显示在图中,条形会彼此重叠。

9.3 分布图 - 图6

  1. # 间隔直方图
  2. ggplot(dat, aes(x = rating, fill = cond)) + geom_histogram(binwidth = 0.5,
  3. position = "dodge") # dodge 表示将每组的条形依次并列放置。

9.3 分布图 - 图7

  1. # 密度图
  2. ggplot(dat, aes(x = rating, colour = cond)) + geom_density()

9.3 分布图 - 图8

  1. # 半透明填充的密度图
  2. ggplot(dat, aes(x = rating, fill = cond)) + geom_density(alpha = 0.3)

9.3 分布图 - 图9

在给每组数据添加均值线前,需要将每组数据的平均值赋值到一个新的数据框。

  1. # 求均值
  2. library(plyr)
  3. cdat <- ddply(dat, "cond", summarise, rating.mean = mean(rating))
  4. cdat
  5. #> cond rating.mean
  6. #> 1 A -0.05776
  7. #> 2 B 0.87325
  8. # 给重叠直方图添加均值线
  9. ggplot(dat, aes(x = rating, fill = cond)) + geom_histogram(binwidth = 0.5,
  10. alpha = 0.5, position = "identity") + geom_vline(data = cdat,
  11. aes(xintercept = rating.mean, colour = cond), linetype = "dashed",
  12. size = 1)

9.3 分布图 - 图10

  1. # 给密度图添加均值线
  2. ggplot(dat, aes(x = rating, colour = cond)) + geom_density() +
  3. geom_vline(data = cdat, aes(xintercept = rating.mean,
  4. colour = cond), linetype = "dashed", size = 1)

9.3 分布图 - 图11

使用分面:

  1. ggplot(dat, aes(x = rating)) + geom_histogram(binwidth = 0.5,
  2. colour = "black", fill = "white") + facet_grid(cond ~
  3. .)

9.3 分布图 - 图12

  1. # 使用之前的 cdat 添加均值线
  2. ggplot(dat, aes(x = rating)) + geom_histogram(binwidth = 0.5,
  3. colour = "black", fill = "white") + facet_grid(cond ~
  4. .) + geom_vline(data = cdat, aes(xintercept = rating.mean),
  5. linetype = "dashed", size = 1, colour = "red")

9.3 分布图 - 图13

更多关于分面的细节可查看分面

9.3.2.3 箱型图

  1. # 绘制箱型图
  2. ggplot(dat, aes(x = cond, y = rating)) + geom_boxplot()

9.3 分布图 - 图14

  1. # 对分组填充颜色
  2. ggplot(dat, aes(x = cond, y = rating, fill = cond)) + geom_boxplot()

9.3 分布图 - 图15

  1. # 将上图中冗余的图例删除掉:
  2. ggplot(dat, aes(x = cond, y = rating, fill = cond)) + geom_boxplot() +
  3. guides(fill = FALSE)

9.3 分布图 - 图16

  1. # 坐标轴翻转
  2. ggplot(dat, aes(x = cond, y = rating, fill = cond)) + geom_boxplot() +
  3. guides(fill = FALSE) + coord_flip()

9.3 分布图 - 图17

同时可以通过 stat_summary() 来添加平均值。

  1. # 用菱形图标指征平均值,并调整参数使该图标变更大。
  2. ggplot(dat, aes(x = cond, y = rating)) + geom_boxplot() +
  3. stat_summary(fun.y = mean, geom = "point", shape = 5,
  4. size = 4)

9.3 分布图 - 图18