ggplot2:为每组平均添加行

wli*_*erg 25 r ggplot2

library(ggplot2)

orderX <- c("A" = 1, "B" = 2, "C" = 3)
y <- rnorm(20)
x <- as.character(1:20)
group <- c(rep("A", 5), rep("B", 7), rep("C", 5), rep("A", 3))
df <- data.frame(x, y, group)
df$lvls <- as.numeric(orderX[df$group])

ggplot(data = df, aes(x=reorder(df$x, df$lvls), y=y)) + 
geom_point(aes(colour = group)) + 
geom_line(stat = "hline", yintercept = "mean", aes(colour = group))
Run Code Online (Sandbox Code Playgroud)

我想创建一个这样的图形: 每组平均值的图表

这确实有效,当我不需要重新排序X的值时,但是,当我使用重新排序时,它不再起作用.

Ale*_*own 17

从您的问题来看,我根本不df$x相关您的数据,特别是如果您可以重新订购它.如何使用groupas x和jitter实际x位置来分隔点:

ggplot(data=df, aes(x=group,y=y,color=group)) + geom_point() +
geom_jitter(position = position_jitter(width = 0.4)) +
geom_errorbar(stat = "hline", yintercept = "mean",
  width=0.8,aes(ymax=..y..,ymin=..y..))
Run Code Online (Sandbox Code Playgroud)

由于hline很复杂,我使用了errorbar而不是h_line(并将ymax和ymin折叠为y).如果有人有更好的解决方案,我很乐意看到.

替代文字


更新

如果要保留X的顺序,请尝试此解决方案(使用已修改的X)

df$x = factor(df$x)

ggplot(data = df, aes(x, y, group=group)) + 
facet_grid(.~group,space="free",scales="free_x") + 
geom_point() + 
geom_line(stat = "hline", yintercept = "mean")
Run Code Online (Sandbox Code Playgroud)

替代文字


wli*_*erg 5

从ggplot2 2.x开始,这种方法很不幸。

以下代码完全提供了我想要的内容,并预先进行了一些额外的计算:

library(ggplot2)
library(data.table)

orderX <- c("A" = 1, "B" = 2, "C" = 3)
y <- rnorm(20)
x <- as.character(1:20)
group <- c(rep("A", 5), rep("B", 7), rep("C", 5), rep("A", 3))
dt <- data.table(x, y, group)
dt[, lvls := as.numeric(orderX[group])]
dt[, average := mean(y), by = group]
dt[, x := reorder(x, lvls)]
dt[, xbegin := names(which(attr(dt$x, "scores") == unique(lvls)))[1], by = group]
dt[, xend := names(which(attr(dt$x, "scores") == unique(lvls)))[length(x)], by = group]

ggplot(data = dt, aes(x=x, y=y)) + 
    geom_point(aes(colour = group)) +
    facet_grid(.~group,space="free",scales="free_x") + 
    geom_segment(aes(x = xbegin, xend = xend, y = average, yend = average, group = group, colour = group))
Run Code Online (Sandbox Code Playgroud)

结果图像:

在此处输入图片说明

  • 我不确定这是否对您的实际情况有所帮助,但是我通过ggplot2 v2.1.0找到的针对类似问题的新解决方案是`stat_summary(fun.y =“ mean”,fun.ymin =“ mean”,fun .ymax =“平均值”,大小= 0.3,geom =“纵横线”)。 (7认同)