如何解决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
相关产品推荐
相关产品推荐

