ggplot:绘制 x 轴上的 bin 和 y 轴上的平均值

ggplot: Plotting the bins on x-axis and the average on y-axis

假设我有一个如下所示的数据框:

data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1))

我想做的是把x的值切到bins里,比如:

data$bins <- cut(data$x,breaks = 4)

然后,我想绘制(使用 ggplot)结果,其中 x 轴是 bin,y 轴是落入相应 bin 的 data$y 数据点的平均值。

提前致谢

您可以使用stat_summary()函数。

library(ggplot2)
data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1))
data$bins <- cut(data$x,breaks = 4)
# Points:
ggplot(data, aes(x = bins, y = y)) +
  stat_summary(fun.y = "mean", geom = "point")

# Histogram bars:
ggplot(data, aes(x = bins, y = y)) +
  stat_summary(fun.y = "mean", geom = "histogram")

这是点的图片:

由于 y 值的平均值可能小于 0,因此我建议使用点图而不是条形图。点代表手段。您可以使用 qplot 或常规 ggplot 函数。后者更可定制。在此示例中,两者都产生相同的输出。

library(ggplot2)

set.seed(7)
data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1))
data$bins <- cut(data$x,breaks = 4, dig.lab = 2)

qplot(bins, y, data = data, stat="summary", fun.y = "mean")

ggplot(data, aes(x = factor(bins), y = y)) + 
  stat_summary(fun.y = mean, geom = "point")

您还可以添加错误栏。在这种情况下,它们显示的平均值是组标准差的 +/- 1.96 倍。组均值和SD可以使用tapply得到。

m <- tapply(data$y, data$bins, mean)
sd <- tapply(data$y, data$bins, sd)
df <- data.frame(mean.y = m, sd = sd, bin = names(m))

ggplot(df, aes(x = bin, y = mean.y, 
               ymin = mean.y - 1.96*sd, 
               ymax = mean.y + 1.96*sd)) + 
  geom_errorbar() + geom_point(size = 3)

这个线程有点旧,但是你可以使用 stat_summary_bin(它可能在较新的版本中)。

ggplot(data, mapping=aes(x, y)) +
stat_summary_bin(fun.y = "mean", geom="bar", bins=4 - 1) +
ylab("mean")