Взвешенный гистограмма 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)