NetworkX没有合并图中节点的功能,因此需要手动实现。以下是一个没有属性合并的示例(它可以有自己的逻辑):
def merge(G, n1, n2):
pre = set(G.predecessors(n1)) | set(G.predecessors(n2))
suc = set(G.successors(n1)) | set(G.successors(n2))
name = str(n1) + '/' + str(n2)
G.add_edges_from([(p, name) for p in pre])
G.add_edges_from([(name, s) for s in suc])
G.remove_nodes_from([n1, n2])
以下是它的工作原理:
import networkx as nx
G = nx.DiGraph()
G.add_edges_from([
('0','20'),
('10','20'),
('10','30'),
('20','40'),
('30','50'),
])
nx.draw(
G,
pos=nx.nx_agraph.graphviz_layout(G, prog='dot'),
node_color='#FF0000',
with_labels=True
)
merge(G, '20', '30')
nx.draw(
G,
pos=nx.nx_agraph.graphviz_layout(G, prog='dot'),
node_color='#FF0000',
with_labels=True
)