You need to enable JavaScript to run this app. 如何调整R ggplot人口金字塔y轴实现不同国家人口数据横向可比
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 23:15:00