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
相关产品推荐
相关产品推荐

