График hline в среднем с geom_bar и stat = "identity" - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть барплот, где точные значения высоты столбцов находятся в кадре данных.

df <- data.frame(x=LETTERS[1:6], y=c(1:6, 1:6 + 1), g=rep(x = c("a", "b"), each=6))

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge")

enter image description here

Теперь я хочу добавить два hlines отображает среднее значение всех баров в группе.Все, что я получаю с

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge") +
  stat_summary(fun.y=mean, aes(yintercept=..y.., group=g), geom="hline")

, это

enter image description here

Поскольку я хочу сделать это для произвольного числа групп,Я был бы признателен за решение только с ggplot.

Я хочу избежать такого решения, потому что оно не зависит исключительно от набора данных, переданного в ggplot, имеет избыточный код и не обладает гибкостью в отношении количества групп:

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge") +
  geom_hline(yintercept=mean(df$y[df$g=="a"]), col="red") +
  geom_hline(yintercept=mean(df$y[df$g=="b"]), col="green")

Заранее спасибо!

Изменения:

  • добавлен набор данных
  • комментарий к полученному коду
  • изменилданные и участки для уточнения вопроса

1 Ответ

0 голосов
/ 14 сентября 2018

Если я правильно понимаю ваш вопрос, ваш первый подход почти у цели:

ggplot(df, aes(x = x, y = y, fill = g, group = g)) + 
  geom_col(position="dodge") + # geom_col is equivalent to geom_bar(stat = "identity")
  stat_summary(fun.y = mean, aes(x = 1, yintercept = ..y.., group = g), geom = "hline")

plot

В соответствии с файлом справки для stat_summary:

stat_summary работает на уникальном x; ...

В этом случае stat_summary унаследовал эстетические отображения верхнего уровня по умолчанию x = x и group = g, поэтому он вычислит среднее значение y для каждого x для каждого значения g, что приводит к множеству горизонтальных линий. Добавление x = 1 к stat_summary переопределениям отображения x = x (при сохранении group = g), так что вместо этого мы получаем единственное среднее значение y для каждого значения g.

...