ggplot2: добавить строку для среднего по группе - PullRequest
25 голосов
/ 22 ноября 2010
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))

Я хочу создать такой график: graph with averages for each group

Это работает, когда мне не нужно переупорядочивать значения X, однако, когда я использую переупорядочение, это больше не работает.

Ответы [ 2 ]

17 голосов
/ 22 ноября 2010

Из вашего вопроса, я не думаю, что df$x имеет отношение к вашим данным вообще, особенно, если вы можете изменить их порядок Как насчет использования group в качестве 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..))

Я использовал errorbar вместо h_line (и свернул ymax и ymin в y), поскольку hline сложен. Если у кого-то есть лучшее решение этой части, я бы с удовольствием посмотрел.

alt text


обновление

Если вы хотите сохранить порядок 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")

alt text

4 голосов
/ 08 марта 2016

Начиная с 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))

Полученное изображение:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...