如何在R的条形图中添加美国2010年城市人口占比信息?
美国城乡人口占比融入全球人口条形图的实现方案
现有R代码绘制了2010年全球人口前五国家的占比条形图,需求是将美国的条形拆分为两部分:80%的城市区域用不同颜色显示,并添加文本标注“Urban Areas (80%)”。
修改后的完整代码
library(tidyverse) library(forcats) # 预处理原始数据:筛选2010年、前五国家并计算全球占比 df <- population |> filter(year == 2010) |> mutate(pct = proportions(population) * 100) |> filter(country %in% c("China", "India", "United States of America", "Indonesia", "Brazil")) # 拆分美国的城乡人口数据,其他国家保持整体统计 df_split <- df |> mutate( # 为美国创建城乡分组,其余国家标记为"Total" group = case_when( country == "United States of America" ~ c("Urban", "Rural"), TRUE ~ "Total" ), # 计算对应占比:美国城市占总占比的80%,乡村占20%;其他国家保留原占比 pct_split = case_when( country == "United States of America" & group == "Urban" ~ pct * 0.8, country == "United States of America" & group == "Rural" ~ pct * 0.2, TRUE ~ pct ) ) |> ungroup() # 绘制分层条形图 df_split |> ggplot(aes(x = fct_reorder(country, desc(pct)), y = pct_split, fill = group)) + geom_col(position = position_stack()) + # 为美国城市区域添加文本标注 geom_text( data = filter(df_split, country == "United States of America" & group == "Urban"), aes(label = "Urban Areas (80%)"), y = ~ .$pct_split / 2, # 将文本放在城市区域条形的中间位置 color = "white", fontface = "bold" ) + # 自定义颜色:美国乡村部分与其他国家条形颜色一致,城市部分用区分色 scale_fill_manual( values = c("Total" = "#2ecc71", "Urban" = "#3498db", "Rural" = "#2ecc71"), guide = "none" ) + scale_y_continuous(labels = \(x) paste0(x, "%")) + labs( title = "Top five countries of the world by population in 2010", x = element_blank(), y = element_blank() ) + theme_minimal()
关键修改说明
- 数据分层处理:通过
case_when给美国单独拆分出Urban和Rural两个分组,分别计算对应占比;其他国家保留整体统计,避免破坏原有图表结构。 - 堆叠条形实现:用
geom_col(position = position_stack())替代原geom_bar,实现美国条形的分层堆叠效果。 - 精准文本标注:针对美国的城市区域单独添加文本,通过
y参数将文本定位在条形中间,确保标注清晰且对应正确区域。 - 颜色统一适配:设置美国乡村部分的颜色与其他国家条形一致,仅城市部分使用不同颜色,既突出信息又保持图表整体协调性。
内容的提问来源于stack exchange,提问作者always.learning
相关产品推荐
相关产品推荐

