我有一个包含三个变量的数据集(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)
我想为每个组和响应单独计算%。例如,正确答案中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)
答案 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)
不幸的是,您的示例数据不会导致您显示的情节,因此我的情节与您的情节有所不同。