如何基于关联矩阵结构数据框绘制可自定义排序的分层条形图?
自定义顺序的多层条形图实现方案
首先加载所需R包:
library(tidyr) library(ggplot2)
1. 数据预处理:宽格式转长格式
原数据集为宽格式(每列对应一个国家),需转换为长格式以适配绘图需求:
# 将宽格式数据转换为长格式 tourist_long <- pivot_longer(tourist.data, cols = -months, names_to = "country", values_to = "visitors")
2. 指定自定义国家顺序
根据需求设置条形叠加/分组的顺序(比如从底部到上方的国家顺序),将country列转为因子并按该顺序排序:
# 自定义国家顺序,可根据需求修改 custom_order <- c("Australia", "France", "UnitedKingdom", "USA", "Italy") tourist_long$country <- factor(tourist_long$country, levels = custom_order)
3. 绘制堆叠条形图(符合多层叠加需求)
每个月份的条形由不同国家的数据堆叠而成,Y轴为月份,堆叠顺序严格遵循自定义设置:
ggplot(tourist_long, aes(x = visitors, y = months, fill = country)) + geom_col(position = "stack", width = 0.8) + # stack参数实现堆叠效果 scale_fill_brewer(palette = "Set3") + # 可选:设置配色方案 labs(title = "各国月度游客流量堆叠条形图", x = "游客流量(百万)", y = "月份", fill = "国家") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5)) # 标题居中显示
4. 绘制分组条形图(每行对应国家的12个月条形)
每个月份下显示所有国家的独立条形,按国家分组合并展示12个月的数据:
ggplot(tourist_long, aes(x = country, y = visitors, fill = country)) + geom_col(position = "dodge", width = 0.7) + # dodge参数实现分组效果 facet_wrap(~months, ncol = 3) + # 按月份分面,每个国家对应12个月的条形 scale_fill_brewer(palette = "Set3") + labs(title = "各国月度游客流量分组条形图", x = "国家", y = "游客流量(百万)", fill = "国家") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 45, hjust = 1)) # 倾斜X轴标签避免重叠
关键说明
- 这类结构化游客流量数据无需使用
igraph包,ggplot2结合tidyr即可轻松实现自定义顺序的多层/堆叠/分组条形图。 - 修改
custom_order向量即可任意调整堆叠或分组的国家顺序,完全满足自定义需求。
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

