Draw only positively weighted edge NetworkX
我正在寻找一种干净,简单的方法来绘制仅具有正加权边缘的加权NetworkX图。
我能想到的唯一方法是:
1 2 3 4 5 6 7 | pos=nx.spring_layout(G) # filter and only draw positive edges positive_edges = [(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] >0] nx.draw_networkx_nodes(G,pos) nx.draw_networkx_edges(G,pos,edgelist=positive_edges) plt.axis('off') plt.show() |
我想知道是否有更简单的方法。我想象这样的事情:
1 | nx.draw(G, only_positive_edge=True) |
或
1 | nx.draw(G, zero_weighted_edge_invisible=True) |
那么您可以将边提取到numpy数组中,然后应用滤镜。
您可以使用to_numpy_matrix将边缘列表更改为numpy数组并应用numpy过滤器,与常规的for循环等相比,对于大型图形而言,这在性能上是相当明智的。然后,一旦完成修改,请使用from_numpy_matrix将图形转换为networkx格式。
将networkx导入为nx
将numpy导入为np
导入matplotlib.pyplot作为plt
G = nx.Graph()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #Add Nodes G.add_node(1) G.add_node(2) G.add_node(3) G.add_node(4) #Add edges G.add_edge(1, 2, weight= -1) G.add_edge(2, 3, weight= 1) G.add_edge(1, 3, weight= 2) G.add_edge(4, 3, weight= -1) #Extract edges into numpy array edges = nx.to_numpy_matrix(G, nodelist= G.nodes()) #Change non-negative values to 0 edges[edges<0] = 0 #Save the modified graph G2 = nx.from_numpy_matrix(edges) pos=nx.spring_layout(G2) nx.draw_networkx_nodes(G2,pos) nx.draw_networkx_edges(G2,pos) plt.axis('off') plt.show() |