问题描述
这是我关于stackoverflow的第一个问题。我有一个关于使用R创建带有三个类别变量的条形图的问题。我仅使用R了三个星期,所以希望您能为我解决这个问题。
我有一个数据框,可以汇总每个年龄段两个地方(地方1和地方2)的男女人数。我对两个地方和每个年龄段的男性和女性比例感兴趣,以便进行比较。数据如下:
# Females
data_female <- data.frame(agegroup = c("0-4","5-14","15-24","25-44","45-64","65-74","75-120"),number_place1 = c(7000,12000,15000,40000,36000,10000,13000),number_place2 = c(163000,360000,350000,800000,900000,370000))
# Extra columns
data_female <- data_female %>%
mutate(percentage_place1 = number / sum(number) * 100,percentage_place2 = number / sum(number) * 100,gender = "F") %>%
select(agegroup,percentage_place1,percentage_place2,gender)
# Males
data_male <- data.frame(agegroup = c("0-4",number_place1 = c(6000,13000,38000,37000,9000,12000),number_place2 = c(161000,340000,320000,699000,900230,330600,385000))
# Extra columns
data_male <- data_male %>%
mutate(percentage_place1 = number / sum(number) * 100,gender = "M") %>%
select(agegroup,gender)
然后将两个数据帧合并为一个,并使用'pivot_longer'创建一个'long'数据帧:
data <- rbind(data_females,data_males)
data_long <- data %>%
rename(place1 = percentage_place1,place2 = percentage_place2) %>%
pivot_longer(cols = c("place1","place2"),names_to = "place",values_to = "percentage")
- 年龄组
- 性别(男/女)
- 地点(地点1 /步伐2)
- 百分比(每个地点和每个年龄段的男性/女性人数比例)
从这个数据框中,我想创建一个图形,看起来完全像在这里可以找到的图形:
它是带有以下内容的条形图:
- x轴:年龄组中嵌套的位置和性别。例如。在一个年龄段内;男性的颜色较浅(左侧的两个横栏),女性的颜色较深(右侧的两个横栏);在每个性别类别中,我们都有两个条形:place1 =绿色和place2 =蓝色。
- y轴:百分比(比例)
ggplot(data_long,aes(x= agegroup,y=percentage,fill=interaction(place,sex))) +
geom_bar(position='dodge',stat='identity') +
facet_wrap( ~ name)
该图有两个较大的列,“ place1”和“ place2”(由于face_wrap()),但是我想将它们组合成一个列图作为示例图。另外,如何像示例中一样在条形图下方创建一个漂亮的表?
我希望我的意思很清楚。有没有创造过此类数字的经验?
解决方法
您可以使用“鬼nea面孔”方法。
首先请确保您的分类变量处于所需的顺序:
agelevels <- c("0-4","5-14","15-24","25-44","45-64","65-74","75-120")
data_long <- data_long %>% mutate(agegroup = factor(agegroup,agelevels),gender = factor(gender,c("M","F")))
然后我们在x轴上绘制性别,并根据性别和地点之间的相互作用进行填充。然后,我们沿着x轴按年龄组进行分面,删除面板与每个面板边界之间的间距。最后,我们将小平面条的位置切换到底部(在外部),并删除其背景,使其看起来像辅助x轴:
ggplot(data_long,aes(x = gender,y = percentage,fill = interaction(place,gender))) +
geom_col(position = 'dodge',color = "gray50") +
facet_grid( ~ agegroup,switch = "x") +
scale_fill_manual(values = c("#a8d094","#9fc0e7","#97a891","#95a5c2"),labels = c("Male,place 1","Male,place 2","Female,place 2")) +
labs(fill = "",x = "Age group") +
theme_bw() +
theme(panel.spacing = unit(0,"points"),panel.border = element_blank(),axis.line = element_line(),strip.placement = "outside",strip.background = element_blank(),legend.position = "bottom",panel.grid.major.x = element_blank())