在ggplot / facet_wrap()的子组上使用频率

时间:2017-05-05 16:41:51

标签: r ggplot2

当为分类变量绘制小的倍数时,我使用了以下代码:

ggplot(raw, aes(x = income)) +
  geom_bar(aes(y = ..count../sum(..count..), fill = factor(..x..))) +
  facet_wrap("workclass")

然而,对于每个换行,它给出了当前数据点在数据集总大小上的频率,而不仅仅是facet_wrap子集。

我需要在此代码中进行哪些更改才能使计数仅在face_wrap子集中运行?

2 个答案:

答案 0 :(得分:0)

您需要重新制定数据(即在调用workclass之前按ggplot()组创建百分比数据)。这是一种data.table方法。

require(data.table)
rawdt <- data.table(raw)
new_data <- rawdt[, .N, by = .(income, workclass)][, classN := sum(N), by = workclass][, y := N/classN]
ggplot(new_data, aes(x = income, y = y)) + geom_bar(stat = "identity") + 
  facet_wrap(~workclass)

答案 1 :(得分:0)

您可以使用dplyr

例如,您在mtcars数据集上的代码:

ggplot(mtcars,aes(x = gear)) +
  geom_bar(aes(y = ..count../sum(..count..), fill = factor(..x..))) + 
  facet_wrap("cyl")

重新制定数据,例如@ amatsuo_net&#39;解决方案,但dplyr

library(dplyr)
mtcars2 <- inner_join(mtcars %>% 
                       group_by(cyl) %>% 
                       summarise(total = n()),
                      mtcars %>% 
                       group_by(gear,cyl) %>% 
                       summarise(sub_total = n()),
                  by = "cyl") %>%
            mutate(prop = sub_total/total)

ggplot(data = mtcars2, aes(x = gear,y=prop)) +
  geom_bar(stat = "identity") + 
  facet_wrap(~cyl)