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

如何修改NetworkX图绘制中边的位置以显示隐藏边?

问题描述

我用NetworkX绘制卫星星座图时,边[0,4], [5,9], [10,14], [15, 19]因为节点分布的原因无法显示。想请教能不能在不修改颜色的前提下,调整这些边的几何形状让它们可见?

生成图的代码

N_orbital_planes = 4
N_satellites_plane = 5
G = networkx.Graph()
i=0
# 节点生成
while(i<N_orbital_planes):
    j=0
    while(j<N_satellites_plane):
        G.add_node(j+i*N_satellites_plane,pos=(i,j))
        j=j+1 
    i = i + 1 
# 边生成
i=0
while(i<N_orbital_planes):
    pt = i*N_satellites_plane
    j=0
    while(j<N_satellites_plane):
        if(j<N_satellites_plane-1):
            G.add_edge(pt+j,pt+j+1,weight=1, color='black')           
        if(i<N_orbital_planes-1):
            G.add_edge(pt+j,pt+j+N_satellites_plane,weight=2, color='black') 
        j = j+1
    # 纬度方向的闭合边
    G.add_edge(pt,(j+pt)-1,weight=1, color='black',headport='sw',tailport='nw')
    i = i+1

绘图代码

opt = { 'node_color': 'green',
     'node_size': 500,
     'width': 3,
     'with_labels': True }
coords = networkx.get_node_attributes(G,'pos')
networkx.draw(G, pos = coords, **opt) # 创建绘图
labels = networkx.get_edge_attributes(G,'weight')
networkx.draw_networkx_edge_labels(G,pos=coords,edge_labels=labels)
plt.show()

当前绘图结果

Graph result

解决办法

你可以把这些被遮挡的边单独拿出来绘制,给它们设置弧形连接样式,不用改颜色就能让它们显示出来。具体步骤如下:

  1. 先把需要特殊处理的边和普通边分开:
target_edges = [(0,4), (5,9), (10,14), (15,19)]
# 排除目标边,剩下的就是普通边(注意无向图的边是双向的,要正反都排除)
normal_edges = [e for e in G.edges() if e not in target_edges and (e[1], e[0]) not in target_edges]
  1. 调整绘图代码,分步骤绘制节点、普通边、目标边:
import matplotlib.pyplot as plt
import networkx as nx

opt = { 'node_color': 'green',
     'node_size': 500,
     'width': 3,
     'with_labels': True }
coords = nx.get_node_attributes(G,'pos')

# 先画节点
nx.draw_networkx_nodes(G, pos=coords, node_color=opt['node_color'], node_size=opt['node_size'])
# 画普通的直边
nx.draw_networkx_edges(G, pos=coords, edgelist=normal_edges, width=opt['width'], edge_color='black')
# 画被遮挡的边,用弧形让它们绕开节点
nx.draw_networkx_edges(G, pos=coords, edgelist=target_edges, width=opt['width'], edge_color='black',
                       connectionstyle="arc3,rad=0.3")
# 画节点标签
nx.draw_networkx_labels(G, pos=coords)
# 画边的权重标签
labels = nx.get_edge_attributes(G,'weight')
nx.draw_networkx_edge_labels(G, pos=coords, edge_labels=labels)

plt.show()

这样改完后,那些原本看不见的边会变成弧形,绕开同一行的节点,就能正常显示了。你可以调整rad的值(比如0.2或者0.4),来控制弧线的弯曲程度,找到你觉得最舒服的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:27:38