[英]How can I create a grouped bar plot in R using the ggplot and aes functions?
[英]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.