我正在尝试使用以下数据创建条形图
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)
希望有意义,非常感谢!
答案 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)
不幸的是,ggplot
在aes(...)
中使用聚合函数时,不尊重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
。