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

如何解决NetworkX中邻接矩阵构建图的自环权重不显示问题

解决NetworkX有向图自环权重标签不显示的问题

你的问题出在默认的边标签绘制逻辑对自环的处理上——自环的标签会和节点重叠,导致看不到。下面是两种可行的解决方案:

方案一:调整自环形状和标签位置(简单高效)

直接修改边的连接样式和标签位置,让自环向外凸起,标签避开节点:

import networkx as nx
import matplotlib.pyplot as plt

# 定义邻接矩阵
adj_matrix = [[5, 1, 3, 0],
              [0, 10, 2, 1],
              [0, 0, 0, 0],
              [4, 0, 1, 0]]

# 构建有向图
G = nx.DiGraph()
for i in range(len(adj_matrix)):
    for j in range(len(adj_matrix)):
        if adj_matrix[i][j] != 0:
            G.add_edge(i, j, weight=adj_matrix[i][j])

fig = plt.figure(figsize=(10, 10))
pos = nx.spring_layout(G)

# 绘制节点
nx.draw_networkx_nodes(G, pos, node_size=1000)

# 绘制边:用弧形样式显示自环,避免紧贴节点
nx.draw_networkx_edges(G, pos, width=2, connectionstyle='arc3,rad=0.2')

# 获取边权重标签
edge_labels = nx.get_edge_attributes(G, 'weight')

# 绘制边标签:调整label_pos让标签避开节点中心
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, label_pos=0.3, font_size=12)

# 绘制节点标签(修正原代码的错误:原代码获取的节点weight属性不存在)
nx.draw_networkx_labels(G, pos, labels={n: n for n in G.nodes()}, font_size=12)

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

关键修改点:

  • connectionstyle='arc3,rad=0.2':将自环渲染为向外凸起的弧形,rad值越大,弧形越明显
  • label_pos=0.3:把标签位置从边的中点(默认0.5)调整到靠近起点的位置,自环的起点和终点是同一个节点,这个位置刚好在弧形外侧,不会被节点挡住
  • 修正节点标签:原代码中nx.get_node_attributes(G, 'weight')无法获取到值,因为你没有给节点设置weight属性,直接用节点编号作为标签更合理

方案二:手动调整自环标签位置(精细控制)

如果需要更精准的标签位置,可以单独处理自环的标签坐标:

import networkx as nx
import matplotlib.pyplot as plt

adj_matrix = [[5, 1, 3, 0],
              [0, 10, 2, 1],
              [0, 0, 0, 0],
              [4, 0, 1, 0]]

G = nx.DiGraph()
for i in range(len(adj_matrix)):
    for j in range(len(adj_matrix)):
        if adj_matrix[i][j] != 0:
            G.add_edge(i, j, weight=adj_matrix[i][j])

fig = plt.figure(figsize=(10, 10))
pos = nx.spring_layout(G)

nx.draw_networkx_nodes(G, pos, node_size=1000)
nx.draw_networkx_edges(G, pos, width=2, connectionstyle='arc3,rad=0.2')

edge_labels = nx.get_edge_attributes(G, 'weight')

# 绘制普通边的标签
non_self_edges = {(u, v): lbl for (u, v), lbl in edge_labels.items() if u != v}
nx.draw_networkx_edge_labels(G, pos, edge_labels=non_self_edges, font_size=12)

# 手动绘制自环的标签,调整位置偏移
for (u, v), lbl in edge_labels.items():
    if u == v:
        # 自定义标签位置,可根据需求调整偏移量
        label_pos = (pos[u][0] + 0.18, pos[u][1] + 0.18)
        plt.text(label_pos[0], label_pos[1], lbl, fontsize=12, ha='center', va='center')

nx.draw_networkx_labels(G, pos, labels={n: n for n in G.nodes()}, font_size=12)

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

这种方法可以单独控制每个自环标签的位置,适合对可视化效果要求更高的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:01:33