You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:02:20