如何使用Python Plotly为桑基图目标节点匹配流入链路颜色
Plotly 桑基图目标节点与流入链路颜色匹配解决方案
要实现目标节点颜色匹配流入链路,核心逻辑是为每个目标节点匹配其对应流入链路的颜色值,赋值给node参数的color属性即可。如果单个节点存在多条流入链路,可根据需求选择匹配流量最大的链路颜色、第一条流入链路颜色等规则,以下为通用实现方案:
实现步骤
1. 规则说明
- 单流入节点:直接取唯一流入链路的颜色作为节点颜色
- 多流入节点:可按需选择匹配规则,下方示例默认取流量最高的流入链路颜色,也可自行调整为取第一条流入链路颜色等其他规则
2. 完整代码示例
你可以直接替换示例中的链路颜色数组color为你自己提前定义的颜色值即可生效:
import plotly.graph_objects as go # 原有基础数据 label = ['A', 'B', 'Z', 'Y', 'X'] source = [0, 0, 0, 1, 1, 1] target = [2, 3, 4, 2, 3, 4] value = [100, 200, 300, 400, 500, 600] # 示例链路颜色,对应每个source-target链路,可直接替换为你自己定义的color数组 color = [ 'rgba(239,85,59,0.6)', # A->Z 'rgba(239,85,59,0.6)', # A->Y 'rgba(239,85,59,0.6)', # A->X 'rgba(59,130,246,0.6)', # B->Z 'rgba(59,130,246,0.6)', # B->Y 'rgba(59,130,246,0.6)' # B->X ] # 生成节点颜色数组 node_color = ['#888'] * len(label) # 初始化所有节点为灰色,源节点可保留默认或自定义颜色 # 遍历所有链路为目标节点赋值颜色 for s, t, c, v in zip(source, target, color, value): # 取当前节点所有流入链路的最大流量对应的颜色 max_in_flow = max([v2 for s2, t2, c2, v2 in zip(source, target, color, value) if t2 == t]) if v == max_in_flow: node_color[t] = c.replace('0.6', '1') # 去除链路透明度,节点用不透明颜色显示更清晰 # 原有绘图逻辑,新增node的color参数 link = dict(source = source, target = target, value = value, color = color) node = dict(label = label, pad=35, thickness = 10, color=node_color) data = go.Sankey(link = link, node = node) fig=go.Figure(data) fig.show()
自定义调整说明
- 若需要自定义源节点颜色,直接修改
node_color对应索引的颜色值即可,例如node_color[0] = 'darkred'可将A节点设置为深红色 - 若不需要调整节点透明度,直接赋值
node_color[t] = c即可,无需处理replace逻辑 - 若多流入节点需要优先匹配第一条流入链路的颜色,删除流量判断逻辑,直接写
node_color[t] = c即可
内容的提问来源于stack exchange,提问作者griffm
相关产品推荐
相关产品推荐

