含重复行的DataFrame转lodes格式及ggalluvial绘图异常问题
解决ggalluvial复制数据后geom_flow报错及流向缺失问题
问题根源
- 原始数据格式不合法:执行
rbind(d,d)后,每个individual在同一个timeperiod下存在重复的therapy记录,ggalluvial要求每个alluvium(个体)在每个x轴位置(时间点)只能对应一个stratum(治疗方案),重复行触发了格式验证错误。 - lodes格式转换参数错误:
to_lodes_form的axes参数用于指定宽格式数据中作为x轴的列,你的数据本身已是长格式,axes=3的设置完全错误,导致转换后的数据映射逻辑混乱。 - 绘图映射错误:转换后的lodes数据中x轴对应的列是
x,但绘图代码仍用timeperiod作为x的映射,导致流向无法被正确计算渲染。
解决方案
1. 处理重复行
先确保每个个体在每个时间点只有一条记录,通过去重实现:
d <- d %>% distinct(individual, timeperiod, .keep_all = TRUE)
2. 正确使用lodes格式(可选)
你的原始数据去重后已是合法的类lodes格式,可直接用于绘图;如果坚持要转换为标准lodes格式,需先将数据转成宽格式再转换:
# 先转宽格式 d_wide <- d %>% pivot_wider(names_from = timeperiod, values_from = therapy) # 再转标准lodes格式 d_lodes <- to_lodes_form(d_wide, key = "x", value = "stratum", id = "alluvium")
3. 修正绘图代码
用去重后的原始数据绘图
ggplot(d, aes(x = timeperiod, stratum = therapy, alluvium = individual, fill = therapy, label = therapy)) + scale_fill_brewer(type = "qual", palette = "Set2") + geom_flow(stat = "alluvium", lode.guidance = "rightleft", color = "darkgray") + geom_stratum()
用转换后的lodes数据绘图(需修正x轴映射)
ggplot(d_lodes, aes(x = x, stratum = stratum, alluvium = alluvium, fill = stratum, label = stratum)) + scale_fill_brewer(type = "qual", palette = "Set2") + geom_flow(stat = "alluvium", lode.guidance = "rightleft", color = "darkgray") + geom_stratum()
执行上述操作后,报错会消失,流向也能正常显示。
内容的提问来源于stack exchange,提问作者Philipp Schulz
相关产品推荐
相关产品推荐

