R语言绘制冲积图(alluvial diagram)报错:数据格式不被识别
错误原因与数据结构修正方案
核心问题:数据结构不符合冲积图要求
geom_alluvium(属于ggalluvial包,并非ggplot2原生函数)要求数据必须是转移路径格式——每一行代表一组完整的「起点-终点」转移关系(比如2010年森林→2023年草地),同时附带该转移路径对应的权重(此处为面积)。
你的当前数据是长格式时间序列结构:同一个多边形ID对应两行记录(2010年一行、2023年一行),这种结构无法被识别为冲积图需要的「转移单元」,因此触发报错。
具体修正步骤
1. 转换为宽格式转移数据
先把长格式数据转成宽格式,让每一行对应一个多边形的两年植被类型,保留面积信息:
library(tidyr) # 假设你的原始数据框名为veg_data wide_veg <- veg_data %>% pivot_wider( id_cols = ID, # 用ID关联同多边形的两年数据 names_from = Jaar, # 把年份作为列名 values_from = value, # 对应年份的植被类型作为列值 values_fill = NA # 填充可能的缺失值,交集处理后一般不会有 ) %>% # 合并面积信息(同一个ID的两年面积一致,取任意年份即可) left_join(veg_data %>% filter(Jaar == 2010) %>% select(ID, total), by = "ID")
2. 按转移路径汇总面积(可选但推荐)
如果多个多边形属于同一转移类型(比如多个森林→草地的多边形),可以汇总总面积,简化图表:
library(dplyr) summary_veg <- wide_veg %>% group_by(`2010`, `2023`) %>% summarise(total_area = sum(total), .groups = "drop")
3. 绘制冲积图
用处理好的数据绘图,指定坐标轴对应年份的植被类型,权重为面积:
library(ggplot2) library(ggalluvial) ggplot(summary_veg, aes(y = total_area, axis1 = `2010`, axis2 = `2023`)) + geom_alluvium(aes(fill = `2010`)) + # 绘制冲积流,用2010年类型填充 geom_stratum() + # 绘制分层节点 geom_text(stat = "stratum", aes(label = after_stat(stratum))) + # 添加节点标签 scale_x_discrete(limits = c("2010", "2023"), expand = c(0.1, 0.1)) + labs(x = "年份", y = "面积(平方米)", fill = "2010年植被类型")
额外注意事项
- 必须加载
ggalluvial包:很多人误以为geom_alluvium是ggplot2原生函数,这是常见误区。 - 过滤无效数据:如果宽格式数据中存在
NA(比如某年份无植被类型),需用filter(!is.na(2010) & !is.na(2023))过滤掉。 - 展示占比:若要呈现面积占比,可将
total_area替换为total_area / sum(total_area),同时修改y轴标签为「面积占比」。
内容的提问来源于stack exchange,提问作者Stevestingray
相关产品推荐
相关产品推荐

