簡體   English   中英

按組堆積的百分比條形圖

[英]stacked bar chart of percentages by group

我正在嘗試使用以下數據創建條形圖

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)

我想創建兩個圖表(“事實”中的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)

希望有道理,非常感謝!

也許你可以嘗試

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

不幸的是,當在aes(...)中使用聚合函數時, ggplot不遵守構面所隱含的分組。 因此,在您的特定情況下,您想要通過測試號和組( fac )來計算百分比,我們已經在ggplot之外計算了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從“寬”格式(不同列中的測試)轉換為“長”格式(on列中的所有測試值, value以及第二列,用於區分測試之間的variable )。 然后,將結果轉換為data.table並按fac, variable, and value排序。 現在,我們對每個值的實例數進行計數,然后將其除以計數之和即可得出百分比。 然后,我們使用此data.table驅動gggplot

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM