R 按组列出的百分比堆积条形图

R 按组列出的百分比堆积条形图,r,ggplot2,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轴上显示测试1、2、3,并显示每个测试的1、2和3的比例 例如,对于A

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

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轴上显示测试1、2、3,并显示每个测试的1、2和3的比例

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

希望这是有意义的,非常感谢

也许你可以试试

 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')
使现代化 如果你想两者都在同一页上

 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')
不幸的是,在aes中使用聚合函数时,ggplot不尊重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())
所以这里我们用熔化。。。要将df从不同列中的宽格式测试转换为长格式,请将on列中的所有测试值转换为value,并使用第二列变量区分测试。然后,我们将结果转换为data.table,并按fac、变量和值进行排序。现在我们计算每个值的实例数,然后除以计数之和得到百分比。然后我们使用这个data.table来驱动gggplot

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())