关于python:仅绘制正加权边缘NetworkX

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()

enter