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

ggalluvial冲积图流量无法拆分:土地覆被像素迁移可视化问题

问题分析与解决方案

你的核心问题在于:现有数据是各时段覆被类型的汇总统计,缺少跨时段的迁移明细数据,而ggalluvial绘制冲积图的核心是需要明确的"从A时段X类型到B时段Y类型"的流量数据,你当前的数据结构无法支撑正确的流展示。

原代码的错误点

  • stratum = migrados:stratum参数应该指定每个轴上的分类(比如覆被类型zone),而非差值字段
  • alluvium = zone:仅指定zone无法追踪跨时段的迁移关系,因为每个时段的zone是独立条目,没有关联到上一时段的同类型流量
  • y = pixCob:冲积图的y轴应该对应具体的流量值,而非时段总量

解决方案

方案1:获取迁移明细数据(推荐)

如果能拿到原始的迁移矩阵数据(比如2000-2005的zone10有多少像素保留为2005-2010的zone10,多少转为zone20等),整理为如下格式:

from_zonefrom_periodto_zoneto_periodpixel_count
10[2000,2005]10(2005,2010]28057265
10[2000,2005]20(2005,2010]460939
...............

然后用以下代码绘制标准冲积图:

library(ggplot2)
library(ggalluvial)

# 假设迁移明细数据名为mig_flow
ggplot(mig_flow, aes(y = pixel_count, axis1 = from_zone, axis2 = to_zone)) +
  geom_alluvium(aes(fill = from_zone), width = 1/12) +
  geom_stratum(width = 1/12, fill = "white", color = "black") +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(
    limits = c("[2000,2005]", "(2005,2010]", "(2010,2015]", "(2015,2020]"),
    expand = c(0.05, 0.05),
    labels = c("2000-2005", "2005-2010", "2010-2015", "2015-2020")
  ) +
  labs(title = "土地覆被类型像素迁移情况", x = "时段", y = "像素数量")

方案2:基于现有汇总数据近似展示

如果无法获取迁移明细,可以构造虚拟的"留存/新增"流量,近似展示类型变化:

library(ggplot2)
library(ggalluvial)
library(dplyr)
library(tidyr)

# 取消数据分组
datos_resumidos <- ungroup(datos_resumidos)

# 计算跨时段的留存、流失、新增量
mig_data <- datos_resumidos %>%
  group_by(zone) %>%
  mutate(
    prev_pix = lag(pixCob),
    # 留存到下一时段的像素量(最后一个时段无后续,设为NA)
    retained = ifelse(row_number() < n(), lead(pixCob), NA),
    # 流失到其他类型的像素量
    lost = ifelse(row_number() > 1, prev_pix - pixCob, NA),
    # 从其他类型新增的像素量
    gained = ifelse(row_number() == 1, pixCob, migrados + lost)
  ) %>%
  ungroup()

# 转换为冲积图所需的长格式
alluv_data <- mig_data %>%
  pivot_longer(cols = c(retained, gained), names_to = "flow_type", values_to = "pixel") %>%
  drop_na(pixel) %>%
  mutate(
    from_period = ifelse(flow_type == "retained", periodo, lag(periodo, default = first(periodo))),
    to_period = periodo
  )

# 绘制近似迁移图
ggplot(alluv_data, aes(y = pixel, axis1 = from_period, axis2 = to_period, fill = zone)) +
  geom_alluvium(width = 1/10) +
  geom_stratum(width = 1/10, color = "black") +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(expand = c(0.1, 0.1)) +
  labs(title = "土地覆被类型像素变化近似迁移", x = "时段", y = "像素数量")

内容的提问来源于stack exchange,提问作者Agostina Ferro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:52:51