簡體   English   中英

如何使用 ggplot 在 R 中創建分組百分比圖?

[英]How do I create a grouped percent plot in R using ggplot?

下面的代碼生成一個示例數據集 -

x = c(rep("Category1",5), rep("Category2", 8), rep("Category3", 7))
y = c(rep("No", 2), rep("I don't know", 1), rep("Yes", 2), rep("No", 2), rep("I don't know", 2), rep("Yes", 2), rep("No", 2), rep("I don't know", 3), rep("Yes", 2),rep("No", 2))
df = data.frame(x,y)
colnames(df) = c("Category", "Response")

我正在嘗試獲取“響應”列的百分比圖(使用 ggplot)。 到目前為止,我已經能夠使用 - 獲得“響應”的道具表

total = df %>% 
  count(Response) %>% 
  mutate(prop=prop.table(n))
total

要得到

 Response n prop
1 I don't know 6  0.3
2           No 8  0.4
3          Yes 6  0.3

現在,我想為是、否和我不知道繪制這些百分比的條形圖,並用這些百分比標記條形圖。

接下來我想繪制同樣的東西,但這次按“類別”分組。 我使用了下面的代碼 -

df1 = df %>% 
  count(Category, Response) %>% 
  group_by(Category) %>% 
  mutate(prop=prop.table(n))
df1

得到這個輸出 -

Category  Response         n  prop
  <chr>     <chr>        <int> <dbl>
1 Category1 I don't know     1 0.2  
2 Category1 No               2 0.4  
3 Category1 Yes              2 0.4  
4 Category2 I don't know     2 0.25 
5 Category2 No               4 0.5  
6 Category2 Yes              2 0.25 
7 Category3 I don't know     3 0.429
8 Category3 No               2 0.286
9 Category3 Yes              2 0.286

正如您現在看到的,道具是類別的百分比。 我是 ggplot 的新手,我似乎所做的只是繪制實際計數而不是類別的百分比。 我已經開始 -

ggplot(df, aes(Category))+
  geom_bar()

但是我似乎無法理解如何將美學更改為百分比。

在此處輸入圖片說明

我認為您應該使用您在df1計算出的比例並使用geom_col ,這相當於geom_bar(stat = "identity") ,這意味着條形高度將由您傳遞的 y 值而不是計數給出。

默認情況下,每個類別中的百分比將堆疊在一起,因此您可以使用填充美學來挑選它們。

使用geom_text寫出實際百分比通常也很有幫助,但這不是每個人都喜歡的,所以如果你願意,你可以刪除geom_text調用,其余的情節將保持不變。

最后,由於我們想顯示百分比而不是比例,我們使用scales::percent作為標記 y 軸的速記方式。

ggplot(df1, aes(Category, prop, fill = Response))+
  geom_col() +
  geom_text(aes(label = scales::percent(prop)),
            position = position_stack(vjust = 0.5)) +
  scale_y_continuous(labels = scales::percent)

在此處輸入圖片說明

您可以更改樣式,包括顏色、背景和位置:

ggplot(df1, aes(Category, prop, fill = Response))+
  geom_col(width = 0.8, position = position_dodge(width = 0.8),
           color = "forestgreen") +
  geom_text(aes(y = prop/2, label = scales::percent(prop)), 
            position = position_dodge(width = 0.8)) +
  scale_y_continuous(labels = scales::percent) +
  theme_classic() +
  scale_fill_brewer(palette = "Greens") +
  theme(panel.grid.minor = element_line(),
        panel.grid.major = element_line())

在此處輸入圖片說明

暫無
暫無

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

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