这是对我之前的问题的跟进。
问题在于创建无向图时节点在边列表中的保存顺序。我有一个使用下面的代码创建的图表。创建一个简单的图,并在两个已经存在的节点之间添加新的节点和边。
import networkx as nx
import matplotlib.pyplot as plt
from pprint import pprint
G = nx.OrderedGraph()
head_nodes = range(0, 9)
tail_nodes = range(1, 10)
edge_ls = list(zip(head_nodes, tail_nodes))
G.add_nodes_from(range(0, 10))
G.add_edges_from(edge_ls)
head = 0
tail = 1
G.remove_edge(head, tail)
Nnodes = G.number_of_nodes()
newnodes = [head, Nnodes+1, Nnodes+2, Nnodes+3, tail] # head and tail already exists
newedges = [(x, y) for x, y in zip(newnodes[0:len(newnodes)-1], newnodes[1:len(newnodes)])]
G.add_edges_from(newedges)
I = nx.incidence_matrix(G)
pprint(I)
pprint(G.edges())
nx.draw(G, with_labels=True)
plt.show()
使用无向图的输出是:
EdgeView([(0, 11), (1, 2), (1, 13), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13)])
从输出中,我们可以观察到使用 G.add_edge(13,1) 创建的边显示为 (1,13)。我理解这是因为图表是无向的。
当使用有向图(G.OrderedDiGraph)时,输出为:
EdgeView([(0, 11), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13), (13, 1)])
(13, 1) 与我预期的结果一样。
但是,我很想知道是否有一种特定的方式可以命名节点,以便避免 Networkx 将节点从 (u,v) (用户输入)重新排序到 (v,u)一个无向图。
编辑:我避免使用有向图,因为有这样的输入,有向图会产生以下结果
在这个有向图中,节点 24 和 28 的入度和出度之和为 1。但是,我希望箭头从节点 24 指向 28,类似于交通网络中可能有不同路线的单向流从点 24 流向点 28 的流量。由 Networkx 的 diGraph 创建的方向并不代表我的真实系统。因此,我不想使用有向图。