如何调整R ggplot人口金字塔y轴实现不同国家人口数据横向可比
解决方案
你可以根据对比需求选择以下两种调整方案:
方案1:统一y轴绝对刻度,同时对比人口绝对值+年龄结构
该方案适合需要同时对比各国人口总规模、各年龄段人口绝对数量的场景,明确指定分面刻度为固定值、统一y轴上下限即可,同时可以设置y轴标签自动去掉负号,更符合人口金字塔的阅读习惯:
# 先计算全局人口绝对值的最大值,作为y轴的统一上下限 max_abs_pop <- max(abs(mydata$population)) ggplot(data=mydata, aes(x=age, y = ifelse(gender == "male", -population, population), fill=gender)) + geom_col() + # 明确指定scales = "fixed",避免不同ggplot2版本默认值差异导致的结果不一致 facet_wrap(~country, scales = "fixed") + # 统一y轴范围,同时自定义标签去掉负号 scale_y_continuous(limits = c(-max_abs_pop, max_abs_pop), labels = function(x) abs(x)) + coord_flip() + labs(y = "人口数量")
方案2:转换为人口占比,仅对比年龄结构
该方案适合不需要关注人口绝对规模,只需要对比各国人口年龄结构差异的场景,可完全消除各国人口总量差的影响:
library(dplyr) # 先按国家分组,计算每个年龄性别组占该国总人口的百分比 mydata_prop <- mydata %>% group_by(country) %>% mutate(pop_prop = population / sum(population) * 100) %>% ungroup() # 绘图 ggplot(data=mydata_prop, aes(x=age, y = ifelse(gender == "male", -pop_prop, pop_prop), fill=gender)) + geom_col() + facet_wrap(~country) + # y轴标签显示为百分比 scale_y_continuous(labels = function(x) paste0(abs(x), "%")) + coord_flip() + labs(y = "人口占比")
内容的提问来源于stack exchange,提问作者mehmo
相关产品推荐
相关产品推荐

