Взвешенный гистограмма ggplot2 с position = "dodge" - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь создать взвешенный уклоненный столбчатый график с помощью 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 ]

0 голосов
/ 12 мая 2018

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

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

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

plot

0 голосов
/ 12 мая 2018

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

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")

enter image description here

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

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

enter image description here

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