Взвешенный гистограмма ggplot2 с position = "dodge"

Я пытаюсь создать взвешенный уклоненный гистограмма с помощью ggplot2. С накоплением баров поведение, как и ожидалось:

df <- data.frame(group = rep(letters[1:3], each = 4), 
    sex = rep(c("m", "f"), times = 6),
    weight = 1:12)
ggplot(df, aes(x = group, fill = sex, y = weight)) +
    geom_bar(stat = "identity")

Длина стержней равна общему весу.

Если я добавлю position = "dodge", длина женской группы в столбце равна 4, а не ожидаемому 6. Аналогично, все остальные столбцы имеют длину, равную максимальному весу в каждой группе и комбинации полов, а не представляют общий вес.,

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

Как сделать так, чтобы длина стержней соответствовала общему весу?

2 ответа

Решение

Вы можете сначала суммировать данные по вашему желанию, а затем построить график:

library(dplyr)
library(ggplot2)

df %>% 
  group_by(group, sex) %>% 
  summarise(total_weight = sum(weight)) %>% 
  ggplot(aes(x = group, fill = sex, y = total_weight)) +
  geom_bar(stat = "identity", position = "dodge")

Проблема с вашим первоначальным подходом заключается в том, что, поскольку у вас есть несколько значений веса для одной группы, сочетание пола и затем укажите stat="identity"они нанесены друг на друга. Это можно визуализировать:

ggplot(df, aes(x = group, fill = sex, y = weight)) +
  geom_bar(stat = "identity", position = "dodge", color = "black", alpha = 0.5)

Объяснение @kath верно.

Другой вариант, если вы не хотите суммировать фрейм данных перед его передачей ggplot(): использовать stat_summary() функция вместо geom_bar():

ggplot(df, aes(x = group, fill = sex, y = weight)) +
  stat_summary(geom = "bar", position = "dodge", fun.y = sum)

сюжет

Другие вопросы по тегам