2017-04-19 144 views
4

我試圖繪製顯示一列內的每個組的相對百分比堆積條形圖。顯示百分比通過柱上的堆積條形圖

這裏是我的問題的說明,使用默認的MPG數據集:

mpg %>% 
    ggplot(aes(x=manufacturer, group=class)) + 
    geom_bar(aes(fill=class), stat="count") + 
    geom_text(aes(label=scales::percent(..prop..)), 
    stat="count", 
    position=position_stack(vjust=0.5)) 

這是輸出: enter image description here

我的問題是,這個輸出顯示每個類的百分比對總計,而不是每個廠家內的相對百分比。

例如,我想的第一列(奧迪)以顯示棕色(緊湊)83.3%(15/18)和綠色(中型)16.6%(3/18)。

我發現了一個類似的問題在這裏: How to draw stacked bars in ggplot2 that show percentages based on group?

,但我想知道是否有到GGPLOT2內做到這一點,尤其是因爲我的實際數據集使用一堆dplyr管道之前最終整理數據的簡單方法管道到ggplot2。

回答

3

如果我將你的問題與你給出的鏈接進行比較,那麼區別在於鏈接「自我計數」。這就是我所做的。我不確定這是否適合您的真實數據。

library(ggplot2) 
library(dplyr) 

mpg %>% 
    mutate(manufacturer = as.factor(manufacturer), 
     class = as.factor(class)) %>% 
    group_by(manufacturer, class) %>% 
    summarise(count_class = n()) %>% 
    group_by(manufacturer) %>% 
    mutate(count_man = sum(count_class)) %>% 
    mutate(percent = count_class/count_man * 100) %>% 
    ggplot() + 
    geom_bar(aes(x = manufacturer, 
       y = count_man, 
       group = class, 
       fill = class), 
      stat = "identity") + 
    geom_text(aes(x = manufacturer, 
       y = count_man, 
       label = sprintf("%0.1f%%", percent)), 
      position = position_stack(vjust = 0.5)) 

編輯,基於註釋:

我犯了一個錯誤的選擇了錯誤的列y

library(ggplot2) 
library(dplyr) 

mpg %>% 
    mutate(manufacturer = as.factor(manufacturer), 
     class = as.factor(class)) %>% 
    group_by(manufacturer, class) %>% 
    summarise(count_class = n()) %>% 
    group_by(manufacturer) %>% 
    mutate(count_man = sum(count_class)) %>% 
    mutate(percent = count_class/count_man * 100) %>% 
    ungroup() %>% 
    ggplot(aes(x = manufacturer, 
      y = count_class, 
      group = class)) + 
    geom_bar(aes(fill = class), 
      stat = "identity") + 
    geom_text(aes(label = sprintf("%0.1f%%", percent)), 
      position = position_stack(vjust = 0.5)) 
+0

你的方法,百分比是正確的,但塊大小是錯誤的。但我認爲這是正確的方向;讓我和dplyr一起玩,看看我能否做對。 – kraussian

+0

我是多麼愚蠢!我也會看看並編輯答案! – ricoderks

+0

哇,現在完美了!我也想過這樣做,但沒有意識到可以使用_ungroup_將彙總數據恢復爲原始格式。這是我的缺失環節;謝謝! :) – kraussian

1

如果劇情需要的數目及百分比作爲有色barplots的頂部的文本,以幫助我們看到的差異,也許是更好的呈現結果作爲一個簡單的表:

round(prop.table(table(mpg$class, mpg$manufacturer), margin = 2), 3) * 100 

#    audi chevrolet dodge ford honda hyundai jeep land rover lincoln mercury nissan pontiac subaru toyota volkswagen 
# 2seater  0.0  26.3 0.0 0.0 0.0  0.0 0.0  0.0  0.0  0.0 0.0  0.0 0.0 0.0  0.0 
# compact  83.3  0.0 0.0 0.0 0.0  0.0 0.0  0.0  0.0  0.0 15.4  0.0 28.6 35.3  51.9 
# midsize  16.7  26.3 0.0 0.0 0.0 50.0 0.0  0.0  0.0  0.0 53.8 100.0 0.0 20.6  25.9 
# minivan  0.0  0.0 29.7 0.0 0.0  0.0 0.0  0.0  0.0  0.0 0.0  0.0 0.0 0.0  0.0 
# pickup  0.0  0.0 51.4 28.0 0.0  0.0 0.0  0.0  0.0  0.0 0.0  0.0 0.0 20.6  0.0 
# subcompact 0.0  0.0 0.0 36.0 100.0 50.0 0.0  0.0  0.0  0.0 0.0  0.0 28.6 0.0  22.2 
# suv   0.0  47.4 18.9 36.0 0.0  0.0 100.0  100.0 100.0 100.0 30.8  0.0 42.9 23.5  0.0 
+0

謝謝您的回答。這是有益的,但不正是我一直在尋找,因爲_mpg_數據集只是意圖的例子。 但它是一個很好的點,你的矩陣顯示可能是一個更好的方式來顯示這個特定的數據集類,製造商摘要。 – kraussian

相關問題