如何在Plotly、Matplotlib等工具中实现带路径合并的层级流图?
实现带路径合并的对称层级流图(Matplotlib & Plotly方案)
Matplotlib 实现方案
Matplotlib的Sankey工具可通过手动调整节点位置、流量偏移和宽度,实现路径合并与对称布局。核心逻辑是设置两个等宽的对称输入流,合并为双倍宽度的居中输出流,同时支持自定义终止标记点。
示例代码:
import matplotlib.pyplot as plt from matplotlib.sankey import Sankey fig, ax = plt.subplots(figsize=(8, 4)) sankey = Sankey(ax=ax, unit=None) # 左侧上方输入流,宽度1 sankey.add(flows=[1, -1], labels=['Input 1', ''], orientations=[0, 1], trunklength=1.0, pathlengths=[0.5, 0.5], prior=0, connect=(1, 0)) # 左侧下方输入流,宽度1 sankey.add(flows=[1, -1], labels=['Input 2', ''], orientations=[0, -1], trunklength=1.0, pathlengths=[0.5, 0.5], prior=0, connect=(1, 0)) # 中间合并输出流,宽度2(两个输入流之和) sankey.add(flows=[2, -2], labels=['', 'Merged Output'], orientations=[0, 0], trunklength=1.0, pathlengths=[0.5, 0.5], prior=1, connect=(1, 0)) # 渲染并设置绿色层级样式 diagrams = sankey.finish() for dia in diagrams: dia.patch.set_facecolor('#7ccd7c') # 添加自定义终止标记点(蓝色) ax.scatter(3, 0, color='blue', s=50, zorder=10) plt.title('Merged Hierarchical Flow Chart (Matplotlib)') plt.axis('off') plt.show()
关键说明:
- 用
orientations控制输入流方向,实现上下对称分布 - 输出流
flows设为2,对应两个输入流的宽度总和 - 通过
scatter精准定义终止标记点的位置
Plotly 实现方案
Plotly的Sankey图支持精细化的节点与链接位置控制,通过自定义node.y和link相关参数,可轻松实现路径合并与对称布局,同时支持自定义终止标记。
示例代码:
import plotly.graph_objects as go fig = go.Figure(data=[go.Sankey( node = dict( pad = 15, thickness = 20, line = dict(color = "black", width = 0.5), label = ["Input 1", "Input 2", "Merged Output"], color = ["#7ccd7c", "#7ccd7c", "#7ccd7c"], # 自定义节点垂直位置:输入节点上下对称,输出节点居中 y = [0.75, 0.25, 0.5] ), link = dict( source = [0, 1], # 两个输入节点索引 target = [2, 2], # 合并指向同一个输出节点 value = [1, 1], # 每个输入流的宽度 # 定义链接的起止垂直位置,保证合并后流的居中效果 ysource = [0.75, 0.25], ytarget = [0.75, 0.25], line = dict(color = "rgba(0,0,0,0.2)") ) )]) # 添加自定义终止标记点(蓝色) fig.add_trace(go.Scatter( x = [1.2], # 输出节点右侧的标记位置 y = [0.5], mode = 'markers', marker = dict(color='blue', size=10), showlegend=False )) fig.update_layout(title_text="Merged Hierarchical Flow Chart (Plotly)", font_size=12) fig.show()
关键说明:
node.y设置节点垂直位置,实现输入流上下对称、输出流居中- 两个输入流通过
link.target指向同一输出节点,value均为1,合并后总宽度为2 - 用
Scatter组件精准控制终止标记点的坐标位置
内容的提问来源于stack exchange,提问作者hyco
相关产品推荐
相关产品推荐

