堆积百分比的条形图

时间:2014-12-09 16:35:04

标签: r ggplot2

我正在尝试使用以下数据创建条形图

fac <- c("A","A","B","B","A","A")
test1 <- c(1,2,1,1,1,3)
test2 <- c(2,1,3,3,3,1)
test3 <- c(1,1,2,2,3,2)
df <- data.frame(fac,test1,test2,test3)

我想创建两个图表(对于“fac”中的A组和B组)

每个图表将在y轴上具有百分比,在x轴上具有测试(test1,2,3),并且将显示每个测试的1,2和3的比例。

因此,例如,对于A组的图表,将有三个条形,每个条形将填充100%,第一个条形图将用于test1,并且将具有组A中test1的1的百分比(在这种情况下为2 / 4 1),2的百分比为1/4,3的百分比为1/4)

希望有意义,非常感谢!

2 个答案:

答案 0 :(得分:1)

可能你可以试试

 library(reshape2)
 library(ggplot2)
 dfA <- subset(df, fac=='A', select=-1)
 mA <- melt(do.call(cbind,lapply(dfA, function(x) 
       100*prop.table(table(factor(x, levels=1:3))))))
 mA$Var1 <-factor(mA$Var1)

 ggplot(mA, aes(x=Var2, y=value, fill=Var1))+
                                    geom_bar(stat='identity')

同样适用于B

 dfB <- subset(df, fac=='B', select=-1)
 mB <- melt(do.call(cbind,lapply(dfB, function(x) 
         100*prop.table(table(factor(x, levels=1:3))))))
 mB$Var1 <-factor(mB$Var1)

 ggplot(mB, aes(x=Var2, y=value, fill=Var1))+
                                 geom_bar(stat='identity')

更新

如果你想要两个在同一页面

 library(dplyr)
 library(tidyr)
 df1 <- df %>% 
        gather(Var, Val, -fac) %>%
        group_by(fac, Var, Val) %>% 
        summarise(n=n())%>% 
        group_by(fac,Var) %>%
        mutate(n=100*n/sum(n), Val=factor(Val, levels=1:3)) 

 ggplot(df1, aes(x=Var, y=n, fill=Val))+
                geom_bar(stat='identity')+
                facet_wrap(~fac, scales='free')

答案 1 :(得分:1)

不幸的是,ggplotaes(...)中使用聚合函数时,不尊重facet暗示的分组。因此,在您的特定情况下,您希望按测试编号和组(fac)分配百分比,我们会在ggplot之外计算这些百分比。这是使用data.tables的一种方法。

library(reshape2)   # for melt(...)
library(data.table)
library(ggplot2)
gg <- melt(df,id="fac")
setkey(setDT(gg),fac,variable,value)
gg <- gg[,list(count=.N),by=list(variable,fac,value)]
gg[,pct:=count/sum(count),by=list(variable,fac)]
ggplot(gg,aes(x=variable, y=pct))+
  geom_bar(aes(fill=factor(value)),stat="identity")+
  scale_fill_discrete("value")+
  facet_wrap(~fac) + theme(axis.title=element_blank())

因此,我们使用melt(...)将您的df从“宽”格式(不同列中的测试)转换为“长”格式(列中的所有测试值,value ,第二列,variable区分测试)。然后我们将结果转换为data.table并按fac, variable, and value排序。现在我们计算每个值的实例数,然后除以计数总和得到百分比。然后我们使用此data.table来驱动gggplot