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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:39:58