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