创建一个条形图,计算每个facet_wrap集群的单独百分比

时间:2016-03-11 12:25:27

标签: r ggplot2

我有一个包含三个变量的数据集(df): 两组人(A / B)执行3种类型的任务。响应可能是正确的(1)或不正确的(0)。 查找附件:

 Group Type Response
     B    3        0
     A    1        1
     A    2        1
     B    1        0
     A    1        1

我使用ggplot创建了下一个bar_plot:

    ggplot(df,aes(x = factor(Type), fill = factor(Response), y = (..count..)/sum(..count..))) +
  geom_bar() +
  stat_count(geom = "text",
             aes(label = paste(round((..count..)/sum(..count..)*100), "%")),
             vjust = 1) +
  scale_y_continuous(labels = percent)+
  facet_wrap(~Group)

enter image description here

我想为每个组和响应单独计算%。例如,正确答案中A组中%的总和应为100%,依此类推。 有什么想法/建议吗?

我尝试了下一个选项,但没有成功:

    ggplot(df,aes(x = factor(Type))) +
  geom_bar(aes(y = ..density.., group= Response)) +
  stat_count(geom = "text",
             aes(label = paste(round((..count..)/sum(..count..)*100), "%")),
             vjust = 1) +
  scale_y_continuous(labels = percent)+
  facet_wrap(~Group)

错误:eval中的错误(expr,envir,enclos):object' density'找不到

    ggplot(df, aes(x=Type, y=Response, fill=Response)) +
  geom_bar(stat="identity") +
  ylab("percent") + 
  facet_wrap(~ Group)

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为在情节之外进行百分比计算更容易。例如,您可以按如下方式使用dplyr:

library(dplyr)
plot_data <- group_by(df, Group) %>%
             mutate(group_size = n()) %>%
             group_by(Group, Type, Response) %>%
             summarise(perc = n()/max(group_size))
plot_data
## Source: local data frame [4 x 4]
## Groups: Group, Type [?]
## 
##    Group  Type Response      perc
##   (fctr) (int)    (int)     (dbl)
## 1      A     1        1 0.6666667
## 2      A     2        1 0.3333333
## 3      B     1        0 0.5000000
## 4      B     3        0 0.5000000

首先计算每个组的行数。百分比需要一个小技巧:summarise()期望每个组有一个值,但group_size可能比这长。但在这种情况下,它只是重复相同的数字,我可以通过取最大值将矢量减少到一个数字。 (我也可以使用min()mean()。)

然后,您可以执行简单的条形图并使用geom_text()添加注释:

library(ggplot2)
library(scales)
ggplot(plot_data, aes(x = Type, fill = factor(Response), y = perc)) +
  geom_bar(stat = "identity") +
  facet_wrap(~Group) +
  geom_text(aes(label = percent(perc)), vjust = 1.5) +
  scale_y_continuous(labels = percent)

enter image description here

不幸的是,您的示例数据不会导致您显示的情节,因此我的情节与您的情节有所不同。