如何在ggplot中将美国州因子分组制作堆叠条形图?
实现带US子类别堆叠的条形图方案
没问题!我来帮你搞定这个分层堆叠的条形图需求~核心思路是先给你的location数据做分组映射:把California、Oregon、Texas归到US大组,同时保留它们的州名作为子类别;Canada和Mexico直接用原名称作为大组和子类别。之后用ggplot就能轻松画出你要的效果。
步骤1:数据预处理
首先我们用tidyverse工具给原始数据添加分组和子类别列:
library(tidyverse) # 你的原始数据框 df <- data.frame(respondent = factor(c(1, 2, 3, 4, 5, 6, 7)), location = factor(c("California", "Oregon", "Mexico", "Texas", "Canada", "Mexico", "Canada"))) # 处理数据:添加大组和子类别列 df_processed <- df %>% mutate( # 定义顶级分组:将指定州归为US,其他保留原国家名 group = case_when( location %in% c("California", "Oregon", "Texas") ~ "US", TRUE ~ as.character(location) ), # 定义堆叠用的子类别:US组显示州名,其他组显示原名称 subgroup = case_when( group == "US" ~ as.character(location), TRUE ~ group ) ) %>% # 转换为因子并指定顺序,保证图表显示符合预期 mutate( group = factor(group, levels = c("Canada", "Mexico", "US")), subgroup = factor(subgroup) )
步骤2:绘制堆叠条形图
接下来用ggplot绘制图表,x轴用顶级分组group,填充色用子类别subgroup,自动统计每个类别的数量:
ggplot(df_processed, aes(x = group, fill = subgroup)) + geom_bar(position = "stack") + # 可选:自定义填充颜色,让US的子类别区分更清晰 scale_fill_manual(values = c( "Canada" = "#4a6fe3", "Mexico" = "#e34a6f", "California" = "#6fe34a", "Oregon" = "#e36f4a", "Texas" = "#4ae36f" )) + # 添加图表标签 labs( x = "Region", y = "Number of Respondents", fill = "Subregion" ) + # 用简洁的主题 theme_minimal()
效果说明
- Canada和Mexico的条形是单一颜色(因为它们的子类别和顶级分组一致)
- US的条形会堆叠显示California、Oregon、Texas三个州的受访者数量
- 如果之后需要添加更多美国州,只需要在
case_when的location %in% ...列表里补充州名即可,扩展性很强
内容的提问来源于stack exchange,提问作者KaC
相关产品推荐
相关产品推荐

