ggplot2加权条形图,位置="闪避"

时间:2018-05-11 21:38:11

标签: r ggplot2 geom-bar

我正在尝试使用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")

条的长度等于总重量。

如果我添加位置=&#34;闪避&#34;,女性组的长度为4而不是预期的6.同样,所有其他条只与每组中的最高权重一样长;性别组合而不是代表总重量。

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

如何使条形长度与总重量相匹配?

2 个答案:

答案 0 :(得分:3)

@ 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

答案 1 :(得分: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")

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