如何修改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()
当前绘图结果

解决办法
你可以把这些被遮挡的边单独拿出来绘制,给它们设置弧形连接样式,不用改颜色就能让它们显示出来。具体步骤如下:
- 先把需要特殊处理的边和普通边分开:
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]
- 调整绘图代码,分步骤绘制节点、普通边、目标边:
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
相关产品推荐
相关产品推荐

