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

NetworkX中MultiDiGraph绘图无法显示全部边的问题求助

NetworkX MultiDiGraph多条边不显示问题解决

问题原因

你看到的G.edges里的整数是MultiDiGraph给平行边分配的唯一key,这是正常机制,你的交互类型属性w并没有丢失,可通过G.edges(data=True)或G.edges[u, v, key]['w']查看。

绘图时多条边看似消失,是因为默认draw_networkx_edges会把平行边画在同一条直线上,视觉重叠导致无法区分。

解决方案

通过给平行边设置弯曲偏移,让它们分开显示,同时添加边标签展示交互类型。完整代码如下:

import networkx as nx
import matplotlib.pyplot as plt

# 初始化边数据
edges = [
    ('type_1', 'type_2', {'w': 'interaction_type_1'}),
    ('type_1', 'type_2', {'w': 'interaction_type_2'}),
    ('type_1', 'type_2', {'w': 'interaction_type_3'}),
    ('type_2', 'type_3', {'w': 'interaction_type_1'}),
    ('type_2', 'type_3', {'w': 'interaction_type_3'})
]

# 创建MultiDiGraph并添加边
G = nx.MultiDiGraph()
G.add_edges_from(edges)

# 设置节点布局
pos = nx.random_layout(G)

# 绘制节点与节点标签
nx.draw_networkx_nodes(G, pos, node_size=1500, node_color='lightblue')
nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold')

# 定义平行边的弯曲偏移量,正负值控制弯曲方向
edge_rads = [0.1, -0.1, 0.2]

# 循环绘制每条边及对应标签
edge_idx = 0
for u, v, key in G.edges():
    # 获取当前边的交互类型
    interaction = G.edges[u, v, key]['w']
    # 绘制单条带偏移的边
    nx.draw_networkx_edges(
        G, pos,
        edgelist=[(u, v, key)],
        connectionstyle=f"arc3,rad={edge_rads[edge_idx % len(edge_rads)]}",
        arrowstyle='->',
        arrowsize=20,
        edge_color='gray'
    )
    # 绘制边的交互类型标签
    nx.draw_networkx_edge_labels(
        G, pos,
        edge_labels={(u, v, key): interaction},
        font_size=10,
        label_pos=0.3
    )
    edge_idx += 1

plt.axis('off')
plt.show()

关键细节说明

  • connectionstyle="arc3,rad=xxx":通过调整rad值控制边的弯曲程度,正负值让平行边向不同方向弯曲,避免重叠
  • 循环绘制单条边:确保每条平行边都能应用独立的偏移设置
  • 边标签:通过draw_networkx_edge_labels直接关联边的w属性,清晰展示交互类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:06:25