如何为R语言dataframe按Age_group分组绘制两个变量的并排柱状图
R 实现年龄组双比值指标并排柱状图的简便方案
核心思路是通过宽表转长表适配ggplot2的分组绘图逻辑,无需手动逐个配置列,后续新增同类型比值列也可自动适配。
完整实现代码(tidyverse 方案,推荐)
# 加载依赖包(tidyverse包含数据转换和绘图所需工具) library(tidyverse) # 示例数据导入(如果你已经导入数据可跳过这段) df <- structure(list(Age_group = c("0-1", "16-40", "2-5", "6-15", "Others"), Ratio_no_V_tour = c(0.144814506265842, 0.368098268252477, 0.135597426307673, 0.291277451831895, 0.0602123473421132), Ratio_V_tour = c(0.0704375667022412, 0.431100508506498, 0.12103710214075, 0.302278862452131, 0.0751459601983803)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) # 宽表转长表:自动匹配所有Ratio开头的列作为分组指标 df_long <- df %>% pivot_longer( cols = starts_with("Ratio"), # 自动匹配列名以Ratio开头的所有列,无需手动写列名 names_to = "Tour_type", # 分组类别列名,可自定义 values_to = "Ratio" # 比值列名,可自定义 ) # 绘制并排柱状图 ggplot(df_long, aes(x = Age_group, y = Ratio, fill = Tour_type)) + geom_col(position = position_dodge(width = 0.9), width = 0.8) + # position_dodge实现并排效果 scale_x_discrete(limits = c("0-1", "2-5", "6-15", "16-40", "Others")) + # 按年龄顺序调整x轴排序 labs(x = "年龄组", y = "占比", fill = "游客类型") + theme_bw()
方案优势
- 无需手动逐个配置对比列,通过
starts_with语法自动匹配同规则列,新增比值列自动纳入绘图 - 自动保留原始列名作为图例标签,可自定义修改
- x轴可直接调整年龄组顺序,符合常规可视化逻辑
可选:Base R 轻量实现方案
如果不想加载第三方包,可直接用base R语法实现:
# 提取比值列转为矩阵 ratio_mat <- as.matrix(df[, c("Ratio_no_V_tour", "Ratio_V_tour")]) # 设置x轴标签 rownames(ratio_mat) <- df$Age_group # 绘制并排柱状图 barplot(t(ratio_mat), beside = TRUE, col = c("#1f77b4", "#ff7f0e"), xlab = "年龄组", ylab = "占比", legend.text = c("非游客", "游客"), args.legend = list(x = "topright"))
内容的提问来源于stack exchange,提问作者Yellow_truffle
相关产品推荐
相关产品推荐

