2014-01-20 98 views
2

我有填充條問題,同時與facet_wrap 分組使用這個data.frame:GGPLOT2與填充和組

library(ggplot2) 
library(gridExtra) 
set.seed(1234) 
testDat <- data.frame(answer=factor(sample(c("yes", "no"), 60, replace=TRUE)), 
         which=factor(sample(c("q1", "q2", "q3"), 60, replace=TRUE))) 

我想通過繪製的變量,分組的答案。這給了我絕對值:

ggplot(testDat, aes(x=answer)) + 
    geom_bar(aes(fill=answer)) + facet_wrap(~which) 

這給了我相對值。但不是每個羣組:

ggplot(testDat, aes(x=answer)) + 
    geom_bar(aes(y=(..count..)/sum(..count..), fill=answer)) + facet_wrap(~which) 

正在搜索答案我檢測到此答案,繪製每組的相對值。但是,填充顏色不工作了

ggplot(testDat, aes(x=answer)) + 
    geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=answer)) + facet_wrap(~which) 

它只是適用於中「這」三個不同的價值觀,而不是「答案」

ggplot(testDat, aes(x=answer)) + 
    geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=which)) + facet_wrap(~which) 

如何填補酒吧有什麼建議嗎?

p1<-ggplot(testDat, aes(x=answer)) + geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=answer)) + facet_wrap(~which) 
p2<-ggplot(testDat, aes(x=answer)) + geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=which)) + facet_wrap(~which) 
grid.arrange(p1,p2) 

回答

3

這是你的想法嗎?

library(reshape2) 
library(ggplot2) 
df <- aggregate(answer~which,testDat, 
       function(x)c(yes=sum(x=="yes")/length(x),no=sum(x=="no")/length(x))) 
df <- data.frame(which=df$which, df$answer) 
gg <- melt(df,id=1, variable.name="Answer",value.name="Rel.Pct.") 
ggplot(gg) + 
    geom_bar(aes(x=Answer, y=Rel.Pct., fill=Answer),position="dodge",stat="identity")+ 
    facet_wrap(~which) 

不幸的是,聚合函數如sum(...), min(...), max(...), range(...),等等,等等,在審美映射中使用時,不尊重通過刻面分組暗示。因此,當..count..單獨使用時(在您的分子中)被適當地進行子集化時,sum(..count..)給出了整個數據集的總數。這就是爲什麼(..count..)/sum(..count..)給出總計的分數,而不是組的分數。

我知道的唯一方法是創建一個如上所述的腋窩表。

+0

感謝有關使用聚合函數的說明。我用'..density ..'找到了'..count ../ sum(.. count ..)'的方法''。我的問題仍然是爲什麼'fill = which'工作和'fill = answer'沒有。 – schlusie

+0

爲審美映射中定義的組正確地聚合函數子集(例如,在調用'aes(...)')中。它們不適用於在方面隱含定義的組。所以如果你有'aes(...,fill = which)'還有'facet__wrap(〜which)',你在兩個地方都定義了組,並且它會起作用。但這是一個完全不同的情節。 – jlhoward

3

有一種方法可以按照要求使用ggplot進行聚合,如mentioned in this question。 但是,它需要使用PANEL variable that isn't documented therefore Hadley recomended not to use it

以下是使用data.table進行彙總的一種方法。 我也在圖中添加了百分比標籤。

grp <- function(x) { 
    percentage = as.numeric(table(x)/length(x)) 
    list(x = levels(x), 
     percentage = percentage, 
     label = paste0(round(as.numeric(table(x)/length(x), 0) * 100), "%") 
) 
} 

require("data.table") 
DT <- data.table(testDat) 

# Simpler version 
ggplot(DT[, grp(answer), by=which]) + 
    geom_bar(aes(x=x, y=percentage, fill = x), position="dodge",stat="identity") + 
    facet_grid(~which) + 
    xlab("Answer") 

# With percentage labels and y axis with percentage 
ggplot(DT[, grp(answer), by=which]) + 
    geom_bar(aes(x=x, y=percentage, fill = x), position="dodge",stat="identity") + 
    geom_text(aes(x=x, ymax = 0.6, y=percentage, label = label), vjust = -1.2, color = "grey20") + 
    facet_grid(~which) + 
    xlab("Answer") + xlim("yes", "no") + 
    scale_y_continuous(labels = percent_format()) + 
    scale_fill_discrete(name = "Answer") 

enter image description here