组合(加入)networkx图

时间:2015-09-18 12:33:33

标签: python graph-theory networkx

假设我有两个网络图,library(magrittr) weather %<>% group_by...... G

H

加入两个networkx图表的最佳方式是什么?

我想保留节点名称(请注意公共节点,2到7)。当我使用G=nx.Graph() fromnodes=[0,1,1,1,1,1,2] tonodes=[1,2,3,4,5,6,7] for x,y in zip(fromnodes,tonodes): G.add_edge(x,y) H=nx.Graph() fromnodes=range(2,8) tonodes=range(8,14) for x,y in zip(fromnodes,tonodes): H.add_edge(x,y) 时,没有发生这种情况:

nx.disjoint_union(G,H)

>>> G.nodes() [0, 1, 2, 3, 4, 5, 6, 7] >>> H.nodes() [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] >>> Un= nx.disjoint_union(G,H) >>> Un.nodes() [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] # 节点标签已更改(不是我想要的)。我想在节点上加入相同数字的图表。

注意。这不是Combine two weighted graphs in NetworkX的重复。

3 个答案:

答案 0 :(得分:36)

您正在寻找的函数是compose,它生成一个包含所有边和两个图中所有节点的图。如果两个图形都具有相同名称的节点,则单个副本最终会出现在新图形中。同样,如果两者都存在相同的边缘。这是一个例子,包括边/节点属性:

import networkx as nx

G=nx.Graph()
G.add_node(1, weight = 2)
G.add_node(2, weight = 3)
G.add_edge(1,2, flux = 5)
G.add_edge(2,4)

H=nx.Graph()
H.add_node(1, weight = 4)
H.add_edge(1,2, flux = 10)
H.add_edge(1,3) 

F = nx.compose(G,H)
#F has all nodes & edges of both graphs, including attributes
#Where the attributes conflict, it uses the attributes of H.

G.nodes(data=True)
> NodeDataView({1: {'weight': 2}, 2: {'weight': 3}, 4: {}})
H.nodes(data=True)
> NodeDataView({1: {'weight': 4}, 2: {}, 3: {}})
F.nodes(data=True)
> NodeDataView({1: {'weight': 4}, 2: {'weight': 3}, 4: {}, 3: {}})

G.edges(data=True)
> EdgeDataView([(1, 2, {'flux': 5}), (2, 4, {})])
H.edges(data=True)
> EdgeDataView([(1, 2, {'flux': 10}), (1, 3, {})])
F.edges(data=True)
EdgeDataView([(1, 2, {'flux': 10}), (1, 3, {}), (2, 4, {})])

这些保留属性,但显然如果存在冲突,这是不可能的。 H的属性优先。

还有其他选项可以执行symmetric difference, intersection,...

如果您要将多个图表连接在一起,则可以使用compose_all,它只包围compose的for循环。

答案 1 :(得分:8)

这样做了。

   U=nx.Graph()
   U.add_edges_from(G.edges()+H.edges())
   U.add_nodes_from(G.nodes()+H.nodes()) #deals with isolated nodes

或者,保留边缘属性:

   U.add_edges_from(G.edges(data=True)+H.edges(data=True))

,并且还保留节点属性:

   U.add_nodes_from(G.nodes(data=True)+H.nodes(data=True))

答案 2 :(得分:0)

如果要将图形H添加到G然后返回G,则可以使用update方法。