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

如何在NetworkX中为多重图边标注不同权重?马尔可夫链图标签问题

问题一:NetworkX多重图的边权重标注方法

多重图(MultiGraph/MultiDiGraph)允许同一对节点间存在多条独立边,每条边通过key区分。标注不同权重的核心是包含边的key来精准定位每条边:

  • 创建多重图时,可手动指定key(也可由系统自动分配,从0开始递增)
  • 生成边标签字典时,需以(u, v, key)作为键,读取对应边的weight属性

示例代码:

import networkx as nx
import matplotlib.pyplot as plt

# 创建有向多重图
G = nx.MultiDiGraph()
G.add_nodes_from([0, 1])
# 添加两条不同权重的边,指定key
G.add_edge(0, 1, key=0, weight=0.25)
G.add_edge(0, 1, key=1, weight=0.75)

pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos, with_labels=True, node_size=500)

# 生成包含key的边标签字典
edge_labels = {(u, v, k): f"{d['weight']:.2f}" for u, v, k, d in G.edges(data=True, keys=True)}
# 绘制边标签时需匹配带key的格式
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, label_pos=0.5)

plt.show()
问题二:马尔可夫链双向边标签错误修复

你的问题本质是双向边的标签位置重叠,导致视觉上看起来显示同一个权重,而非edge_labels定义错误。解决思路是给不同方向的边设置差异化的标签位置,同时可增大边的弧度避免重叠:

1. 动态调整标签位置

替换原有的边标签绘制逻辑,根据边的方向分配不同的label_pos:

# 生成边标签字典(这部分你的代码是对的)
edge_labels = {(u, v): f"{G[u][v]['weight']:.2f}" for (u, v) in G.edges()}

# 逐个绘制边标签,区分双向边的位置
for (u, v), label in edge_labels.items():
    if (v, u) in G.edges():
        # 正向边标签靠左(0.3),反向边靠右(0.7),避免重叠
        label_pos = 0.3 if u < v else 0.7
    else:
        label_pos = 0.5
    nx.draw_networkx_edge_labels(
        G, pos,
        edge_labels={(u, v): label},
        font_size=10,
        label_pos=label_pos,
        rotate=False
    )

2. 增大边的弧度

调整connectionstyle的rad参数,让双向边的弧更分散:

nx.draw_networkx_edges(
    G, pos,
    arrowstyle="->",
    arrowsize=12,
    edge_color="gray",
    width=1.5,
    connectionstyle="arc3,rad=0.2"  # 从0.1增大到0.2,拉开边的距离
)

修改后关键代码片段

# 绘制边
nx.draw_networkx_edges(
    G, pos,
    arrowstyle="->",
    arrowsize=12,
    edge_color="gray",
    width=1.5,
    connectionstyle="arc3,rad=0.2"
)

# 生成边标签字典
edge_labels = {(u, v): f"{G[u][v]['weight']:.2f}" for (u, v) in G.edges()}

# 逐个绘制标签,动态调整位置
for (u, v), label in edge_labels.items():
    if (v, u) in G.edges():
        label_pos = 0.3 if u < v else 0.7
    else:
        label_pos = 0.5
    nx.draw_networkx_edge_labels(
        G, pos,
        edge_labels={(u, v): label},
        font_size=10,
        label_pos=label_pos,
        rotate=False
    )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:29:56