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_zone | from_period | to_zone | to_period | pixel_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
相关产品推荐
相关产品推荐

