2017-07-31 210 views
0

我想在ggplot2中創建一個堆積的條形圖來顯示對應於每個分類變量的值的百分比。以下是我嘗試使用的數據示例。帶有facet_grid的ggplot2中的多個分類變量的堆積條形圖

sampledf <- data.frame("Death" = rep(0:1, each = 5), 
        "HabitA" = rep(0:1, c(3, 7)), 
        "HabitB" = rep(1:2, c(4, 6)), 
        "HabitC" = rep(0:1, c(6, 4))) 

每個習慣都是我用來創建堆積條形圖的列,我想使用facet_grid中的死亡列。我期望在條形圖中顯示每種習慣的值的百分比。

我認爲我需要創建圖表的輸出數據應該轉化爲,在Death = 0下,HabitA具有60%0值,並且40%的值是1,而在死亡= 1下,100% HabitA值爲1.

我已經使用ggplot和group_by生成了像這樣的圖表,只彙總了一個屬性,但我不確定它如何與數據中的多個分類屬性一起工作。

sampledf %>% 
    group_by(Death, HabitA) %>% 
    summarise(count=n()) %>% 
    mutate(perc=count/sum(count)) 

這會產生什麼,我想要的只是一個變量,但是當我到組中的其他屬性的參數,它返回計算一個百分比爲所有3個屬性的組合,這是不是我所期待的。我嘗試使用summarise_at/mutate_at,但它似乎並沒有工作。

sampledf %>% 
    group_by(Death) %>% 
    mutate_at(c("HabitA", "HabitB"), Counts = n()) 

有沒有一種簡單的方法可以在R中做到這一點,並將結果數據用作ggplot2的輸入?

編輯:

我試圖重塑數據並使用長的形式建立我的陰謀。這是我的。

long <- melt(sampledf, id.vars = c("Death")) 

生成的數據是這種格式。

Death variable value 
1  0 HabitA  0 
2  0 HabitA  0 
3  0 HabitA  0 
4  0 HabitA  1 
5  0 HabitA  1 
6  1 HabitA  1 
7  1 HabitA  1 

我不知道如何使用value屬性來構建的情節,因爲目前我正在試圖建立ggplot計數的總次數每個級別的variable列發生。

ggplot(long, aes(x = variable, fill = variable)) + 
    geom_bar(stat = "count", position = "dodge") + facet_grid(~ Death) 
+0

您可以考慮總結和繪圖之前重塑你的數據集中到長格式。有關如何執行此操作的一些選項,請參閱[這裏](https://stackoverflow.com/a/25856135/2461552)。 – aosmith

回答

1

試試這個,也許不是那麼簡單,但它的工作原理。它包括由gather建議的@aosmith重塑。然後計算分組後的觀察次數,然後計算每個組的百分比Death + habitat。然後總結得出獨特的價值。

sampledf_edited <- sampledf %>% 
    tidyr::gather("habitat", "count", 2:4) %>% 
    group_by(Death, habitat, count) %>% 
    mutate(observation = n()) %>% 
    ungroup() %>% 
    group_by(Death, habitat) %>% 
    mutate(percent = observation/n()) %>% 
    ungroup() %>% 
    group_by(Death, habitat, count, percent) %>% 
    summarize() 

需要製作count因子。

sampledf_edited$count <- as.factor(sampledf_edited$count) 

通過ggplot繪圖。

ggplot(sampledf_edited, aes(habitat, percent, fill = count)) + 
geom_bar(stat = "identity") + 
facet_grid(~ Death) 

如果您的問題得到解答,請務必接受進一步的參考答案。

---編輯--- 情節加入

ggplot

+0

真棒,這完美的作品!有沒有辦法將酒吧分組在一起,而不是堆疊? – PrashanthVajjhala

+1

將'position =「dodge」'添加到'geom_bar'函數。然而,酒吧沒有相同的寬度。檢查[這個答案](https://stackoverflow.com/a/11021812/7886302)的修復。 – tlask