我有一个使用 networkx 创建的简单图表。
import networkx as nx
import matplotlib.pyplot as plt
from pprint import pprint
G = nx.Graph()
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)
pprint(G.nodes())
nx.draw(G)
plt.show()
我想删除节点 0 和 1 之间的边并添加三个新节点(比如节点 10、11、12)。然后,必须在节点 0 和 10、10 和 11、11 和 2 之间创建边。
我G.remove_edge(0,1)
用来删除节点 0 和 1 之间的边缘。
有人可以建议可以使用哪个功能来添加 n
新节点吗?
另外,如果n
添加了新节点,这些节点会自动编号吗?
我打算在循环中执行此操作,删除两个节点之间已经存在的边并添加n
新节点和连接这些节点的边。
编辑:我尝试了以下方法来添加n
新的边缘
G = nx.Graph()
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)
pprint(G.edges())
输出:
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)])
Expected Output:
EdgeView([(0, 11), (1, 2), (13, 1), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13)])
我不确定为什么按 (13,1)(head, tail) 顺序添加的边存储为 (1,13)。关于如何在添加新边的同时保留头尾节点的顺序有什么建议吗?
EDIT2:用 nx.OrderedGraph() 替换 nx.Graph() 也无济于事。