R语言Sankey图设置:如何保持节点高度左右一致
问题:Sankey图节点高度左小右大,无法体现随访人数恒定
需求
- 绘制患者治疗后每年随访状态(留存、失访、死亡、截尾)的Sankey图
- 要求各时间点节点高度一致,直观反映随访总人数恒定
当前问题
使用sankeyNetwork生成的图表中,节点高度从左到右逐渐增大,与人数恒定的实际情况不符
现有代码
ret_pharm_sankey_5yearall <- sankeyNetwork(Links = retention_pharm_sankey_5yrall_df, Nodes = retention_nodes, Source = "IDsource", Target = "IDtarget", Value = "time_year", NodeID = "name", colourScale = my_colour, LinkGroup = "group", NodeGroup="group", iterations = 0, #this uses the order in nodes dataframe sinksRight=FALSE)
已尝试方案
- 切换
sinksRight布尔值,无效果 - 使用
onRender添加CSS设置svg高度,仍无效
解决方案
问题根源是sankeyNetwork默认根据节点的流入/流出流量总和自动计算高度。要强制节点高度一致,可通过以下两种方法解决:
方法1:用onRender修改D3底层渲染逻辑
直接覆盖Sankey图的节点高度计算规则,强制所有节点使用统一高度,同时调整连接线适配新高度:
library(htmlwidgets) ret_pharm_sankey_5yearall <- ret_pharm_sankey_5yearall %>% onRender(" function(el, x) { // 获取所有节点元素 var nodes = d3.select(el).selectAll('.node'); // 设定统一高度(可根据需求调整数值,比如200) var fixedHeight = 200; // 强制所有节点高度一致 nodes.style('height', fixedHeight + 'px') .each(function() { d3.select(this).select('rect').attr('height', fixedHeight); // 调整标签垂直居中 d3.select(this).select('text').attr('y', fixedHeight / 2); }); // 重新计算连接线路径,匹配新节点高度 var links = d3.select(el).selectAll('.link'); links.each(function(d) { var sourceY = d.source.y + fixedHeight / 2; var targetY = d.target.y + fixedHeight / 2; var path = 'M' + d.source.x + ',' + sourceY + 'C' + (d.source.x + (d.target.x - d.source.x)/2) + ',' + sourceY + ' ' + (d.source.x + (d.target.x - d.source.x)/2) + ',' + targetY + ' ' + d.target.x + ',' + targetY; d3.select(this).select('path').attr('d', path); }); } ")
方法2:调整数据流量,保证各节点总流入一致
修改Links数据框中的Value值,确保每个时间节点的所有流入流量总和完全相等(比如等于初始患者总人数)。对于留存类的状态转移,补充对应流量值,让每个节点的总流入量统一,这样sankeyNetwork会自动生成高度一致的节点。
内容的提问来源于stack exchange,提问作者Rookie
相关产品推荐
相关产品推荐

