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

Python Plotly桑基图source/target参数逻辑及节点宽度设置问题

Plotly 桑基图节点宽度不符合预期问题解决方案

问题原因

Plotly桑基图的节点宽度由所有流入该节点的value值之和自动计算,且要求流入节点的总value等于流出节点的总value,差值部分不会显示为流但会计入节点宽度。

你的代码中,对应“去重后525篇文献”的节点索引为2,当前流入该节点的总value为 1131 + 3 = 1134,所以节点宽度按1134计算,这和你预期的525宽度不符;同时该节点流出总value为 426 + 98 = 524,和流入值差了610,属于流程逻辑遗漏。

错误效果示例

解决方案1(符合PRISMA文献筛选规范,推荐学术使用)

你遗漏了“去重剔除文献”的流和对应节点,补充后即可符合预期,修改后的完整代码如下:

import plotly.graph_objects as go

fig1 = go.Figure(data=[go.Sankey(
    arrangement = "freeform",
    node = dict(
      pad = 80,
      thickness = 10,
      line = dict(color = "black", width = 0.5),
      label = [
          "1131篇数据库检索文献",
          "3篇其他来源补充文献",
          "1134篇总检索文献",
          "609篇去重剔除文献",
          "525篇去重后剩余文献",
          "426篇标题/摘要筛除文献",
          "99篇进入全文评估文献",
          "50篇全文筛除文献",
          "48篇最终纳入文献"
      ],
      x = [0, 0, 0.2, 0.4, 0.4, 0.6, 0.6, 0.8, 0.8],
      y = [0.1, 0.3, 0.2, 0.1, 0.4, 0.6, 0.2, 0.1, 0.4],
    ),
    link = dict(
      source = [0, 1, 2, 2, 4, 4, 6, 6],
      target = [2, 2, 3, 4, 5, 6, 7, 8],
      value = [1131, 3, 609, 525, 426, 99, 50, 48],
  ))])

fig1.update_layout(
    title = dict(text="图1 文献检索与筛选流程"),
    width=750,
    height=500,
    font_size=10,
    margin=dict(l=0)
)
fig1.show()

注:原代码中去重后流出的426+98=524和525差1,这里将98调整为99匹配实际数值,你可以根据自己的真实数据修改对应值。

解决方案2(不新增节点,仅调整数值,仅作效果参考)

如果不需要显示去重剔除的节点,直接将流入目标节点的总value调整为525即可,该方案不符合学术绘图规范:

import plotly.graph_objects as go

fig1 = go.Figure(data=[go.Sankey(
    arrangement = "freeform",
    node = dict(
      pad = 80,
      thickness = 10,
      line = dict(color = "black", width = 0.5),
      label = ["1131篇数据库检索文献",
               "3篇其他来源补充文献",
               "525篇去重后剩余文献",
               "426篇标题/摘要筛除文献",
               "99篇进入全文评估文献",
               "50篇全文筛除文献",
               "48篇最终纳入文献"],
      x = [0, 0, 0.4, 0.6, 0.5, 0.8, 0.7],
      y = [0, 0, 0.5, 0.8, 0.15, 0.05, 0.4],
    ),
    link = dict(
      source = [0, 1, 2, 2, 4, 4],
      target = [2, 2, 3, 4, 5, 6],
      # 调整流入值总和为525,流出值总和也为525
      value = [525*1131/(1131+3), 525*3/(1131+3), 426, 99, 50, 48],
  ))])

fig1.update_layout(title = dict(text="图1 文献检索与筛选流程"),
                   width=650,
                   height=450,
                   font_size=10,
                   margin=dict(l=0))
fig1.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:39:01