ggplot geom_bar按组和facet_wrap绘制百分比

hgb9j2n6  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

我想在一个图表上绘制多个类别,每个类别的百分比总和为100%。(男性或女性),加起来会达到100%。我使用下面的代码,其中的百分比似乎是两个图表上的所有组,即如果你把左边和右边图表上的所有条加起来,它们将总计为100%,而不是左手图形上的黄色条总计为100%,左手图形上的紫色条总计为100%等。
我很欣赏这是可以通过使用stat = 'identity'来实现的,但是有没有一种方法可以在ggplot中做到这一点,而不必在绘图之前争论框架?

library(ggplot2)  

tmp <- diamonds %>% filter(color %in% c("E","I")) %>% select(color, cut, clarity)

ggplot(data=tmp,
     aes(x=clarity,
         fill=cut)) + 
  geom_bar(aes(y = (..count..)/sum(..count..)), position="dodge") +
  scale_y_continuous(labels = scales::percent) + facet_wrap(vars(color))

字符串


的数据

ehxuflar

ehxuflar1#

在计算ggplot2中的百分比时,您必须像在将数据传递给ggplot之前汇总数据一样对数据进行分组。在您的情况下,ggplot2内部添加到数据中的PANEL列可以用于分组:
使用after_stat()ave()来计算按组的计数之和,这可以像这样实现:

library(ggplot2)  
library(dplyr)

tmp <- diamonds %>% 
    filter(color %in% c("E","I")) %>% 
    select(color, cut, clarity)

ggplot(
  data = tmp,
  aes(
    x = clarity,
    fill = cut
  )
) +
  geom_bar(
    aes(y = after_stat(count / ave(count, PANEL, FUN = sum))),
    position = "dodge"
  ) +
  scale_y_continuous(labels = scales::percent) +
  facet_wrap(vars(color))

字符串


的数据

编辑如果你需要按多个变量分组,我建议使用一个辅助函数,在这里我使用dplyr进行计算:

comp_pct <- function(count, PANEL, cut) {
  data.frame(count, PANEL, cut) %>% 
    group_by(PANEL, cut) %>% 
    mutate(pct = count / sum(count)) %>% 
    pull(pct)
}

ggplot(data=tmp,
       aes(x=clarity,
           fill=cut)) + 
  geom_bar(aes(y = after_stat(comp_pct(count, PANEL, fill))), position="dodge") +
  scale_y_continuous(labels = scales::percent) + facet_wrap(vars(color))


相关问题