ggplot:将x轴上的分组和y轴上的平均值绘制出来

4
假设我有一个数据框,长这样:
data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1))

我想做的是将 x 值划分为不同的区间,例如:
data$bins <- cut(data$x,breaks = 4)

接下来,我想使用ggplot绘制结果,使x轴为区间,y轴为数据$y数据点落入相应区间的平均值。

提前感谢您。


我看到你的问题是要切割数值,然后绘制平均值。更加统计学上正确的方法是使用hist函数中的标准算法来找到区间,例如 > tmp <- hist(data.x, breaks="Sturges"),然后使用类似于 idxs = findInterval(data.x, tmp$breaks) 的东西。然后在ggplot中使用这些索引作为x坐标:tmp$mids[idxs],并且使用@christoph建议的解决方案来得到y轴上的平均值。 - Sid
3个回答

5
你可以使用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")

以下是这些点的图片:

enter image description here


4

这个帖子有点旧,但是我还是给你提供一个方法:使用stat_summary_bin(新版本中可能已经包含了此功能)。

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

Here is a picture


1

由于您的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倍的标准偏差。可以使用tapply获取组平均值和SD。
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)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接