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

如何用NetworkX绘制带边计数元数据的有向图并显示元数据?

解决有向图边元数据可视化及多重图转换问题

1. 多重图转带边元数据的完全有向图

先统计原多重图中每对节点(u, v)的边数,再将该数值作为元数据赋值给完全有向图的对应边。示例代码:

import networkx as nx
from collections import Counter

# 假设你的原多重图为MDG
MDG = nx.MultiDiGraph()
# 可自行添加原多重图的节点和边,例如:
# MDG.add_edges_from([('node_A', 'node_B'), ('node_A', 'node_B'), ('node_B', 'node_A')])

# 提取节点列表
node_list = list(MDG.nodes())

# 构造完全有向图
DG = nx.complete_graph(node_list, create_using=nx.DiGraph())

# 统计原多重图中每条(u, v)边的数量
edge_counts = Counter((u, v) for u, v, _ in MDG.edges(data=True))

# 为完全有向图的边添加edge_count元数据(无对应边则设为0)
for u, v in DG.edges():
    DG.edges[(u, v)]['edge_count'] = edge_counts.get((u, v), 0)

2. 美观可视化边元数据并区分双向边

默认nx.draw不显示边标签,需用nx.draw_networkx_edge_labels实现。为区分(A,B)与(B,A)的双向边,可通过弧形边让两条边分离,同时给标签添加背景提升可读性。示例代码:

import matplotlib.pyplot as plt

# 生成节点布局,k值调整节点间距避免拥挤
pos = nx.spring_layout(DG, k=0.6)

# 绘制节点
nx.draw_networkx_nodes(DG, pos, node_size=800, node_color='lightblue')

# 绘制节点标签
nx.draw_networkx_labels(DG, pos, font_size=14, font_weight='bold')

# 绘制弧形有向边,rad控制弧度,让双向边向相反方向弯曲
nx.draw_networkx_edges(
    DG, pos,
    arrowstyle='->',
    arrowsize=20,
    edge_color='darkgray',
    connectionstyle="arc3,rad=0.15"
)

# 准备边标签,格式化为"count: X"
edge_labels = {(u, v): f"count: {d['edge_count']}" for u, v, d in DG.edges(data=True)}

# 绘制边标签,添加白色半透明背景避免被边遮挡
nx.draw_networkx_edge_labels(
    DG, pos,
    edge_labels=edge_labels,
    font_size=10,
    label_pos=0.5,  # 标签位于边的中间位置
    bbox=dict(facecolor='white', edgecolor='none', alpha=0.7)
)

# 关闭坐标轴并调整布局
plt.axis('off')
plt.tight_layout()
plt.show()

关键说明

  • connectionstyle="arc3,rad=0.15":让有向边呈弧形,双向边会自动向相反方向弯曲,清晰区分(A,B)与(B,A)。
  • bbox参数:给边标签添加白色半透明背景,解决标签与边重叠导致的可读性问题。
  • k参数:调整节点间距,节点数量越多可适当增大k值,避免图形拥挤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:01:00