如何在 R 中使用 ggplot2(百分比、排序)更改堆积条形图
how to change the stacked bar chart using ggplot2 (percentage, sort) in R
我是 R 和 ggplot2 的新手。我有一个数据集,我想用堆积条形图可视化,其中
- x 轴是分类变量(性别)
- bar 包含分类变量(天)
- y 轴应该是百分位数。
示例..
total_bill
tip
sex
smoker
day
time
size
16.99
1.01
Female
No
Sun
Dinner
2
10.34
1.66
Male
No
Sun
Dinner
3
data(tips, package='reshape2')
ggplot(tips, aes(x=sex)) +
geom_bar(aes(fill=day), width = 0.5, position = 'fill')+
theme(axis.text.x = element_text(angle=65, vjust=0.6))
从这里开始,我想对图表进行以下更改。
- 从图表中去掉'Fri',但其他天的百分比应该保持不变。这意味着 'Sat, Sun, Thur' 的百分比不会重新映射到 100%
- 到按照'Sat'百分比的降序对'sex'进行排序。这意味着,如果 'Male' 中 'Sat' 的百分比高于 'Female' 中的百分比,则 'Male' 应该位于左侧。
library(tidyverse)
data(tips, package='reshape2')
tips %>%
#Calculating percentage by sex outside ggplot2
count(sex,day) %>%
group_by(sex) %>%
mutate(p = 100*n/sum(n)) %>%
ungroup() %>%
#Removing Friday
filter(day != "Fri") %>%
#Ordering sex by Saturday percentage
mutate(
sex = fct_reorder2(
.f = sex,
.x = p,
.y = day,
.fun = function(x,y) max(x[y == "Sat"])
)
) %>%
ggplot(aes(x = sex, y = p)) +
geom_col(aes(fill=day))
我是 R 和 ggplot2 的新手。我有一个数据集,我想用堆积条形图可视化,其中
- x 轴是分类变量(性别)
- bar 包含分类变量(天)
- y 轴应该是百分位数。
示例..
total_bill | tip | sex | smoker | day | time | size |
---|---|---|---|---|---|---|
16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
data(tips, package='reshape2')
ggplot(tips, aes(x=sex)) +
geom_bar(aes(fill=day), width = 0.5, position = 'fill')+
theme(axis.text.x = element_text(angle=65, vjust=0.6))
从这里开始,我想对图表进行以下更改。
- 从图表中去掉'Fri',但其他天的百分比应该保持不变。这意味着 'Sat, Sun, Thur' 的百分比不会重新映射到 100%
- 到按照'Sat'百分比的降序对'sex'进行排序。这意味着,如果 'Male' 中 'Sat' 的百分比高于 'Female' 中的百分比,则 'Male' 应该位于左侧。
library(tidyverse)
data(tips, package='reshape2')
tips %>%
#Calculating percentage by sex outside ggplot2
count(sex,day) %>%
group_by(sex) %>%
mutate(p = 100*n/sum(n)) %>%
ungroup() %>%
#Removing Friday
filter(day != "Fri") %>%
#Ordering sex by Saturday percentage
mutate(
sex = fct_reorder2(
.f = sex,
.x = p,
.y = day,
.fun = function(x,y) max(x[y == "Sat"])
)
) %>%
ggplot(aes(x = sex, y = p)) +
geom_col(aes(fill=day))