计算网络x中两个图“边缘”之间的差异

时间:2015-11-02 12:40:09

标签: python networkx

我想使用networkx库比较两个图。 我想尝试包含3个节点的硬编码示例。其中一个图是参考的,所以我想检查在第二个图中边是否在同一个地方。我正在考虑简单的算法,它将从给定的一个中减去参考图,如果结果不是空图,那么它将返回false。

我的代码如下,但它不起作用:

import networkx as nx
import matplotlib.pyplot as plt


S=nx.DiGraph()#S-sample graph

S.add_nodes_from([0,1,2])
S.add_edge(0,2)
S.add_edge(1,2)

nx.draw(S)
#plt.savefig("S.png")
#plt.show()

R=nx.DiGraph()#R-reference graph

R.add_nodes_from([0,1,2])
R.add_edge(1,2)

nx.draw(R)
#plt.savefig("R.png")
#plt.show()

def difference(S, R):
  DIF=nx.create_empty_copy(R)
  DIF.name="Difference of (%s and %s)"%(S.name, R.name)
  if set(S)!=set(R):
    raise nx.NetworkXError("Node sets of graphs is not equal")

 # if S.is_multipgraph():
 #   edges=S.edges_iter(keys=True)
 # else:
  edges=S.edges_iter()
  for e in edges:
    if not R.has_edge(*e):
      DIF.add_edge(*e)
  return DIF

D=difference(S, R)
plt.show(D)

2 个答案:

答案 0 :(得分:3)

是否要计算带有参考(R)图中边缘的图形(DIF),而不是输入图形(S)中的边缘? 或者您想计算R和S之间边缘不同的图形?我列出了两个选项,其中一个被注释掉了。

import networkx as nx

S = nx.DiGraph()#S-sample graph
S.add_nodes_from([0, 1, 2])
S.add_edge(0, 2)
S.add_edge(1, 2)

R = nx.DiGraph()#R-reference graph
R.add_nodes_from([0, 1, 2])
R.add_edge(1, 2)


def difference(S, R):
    DIF = nx.create_empty_copy(R)
    DIF.name = "Difference of (%s and %s)" % (S.name, R.name)
    if set(S) != set(R):
        raise nx.NetworkXError("Node sets of graphs is not equal")

    r_edges = set(R.edges_iter())
    s_edges = set(S.edges_iter())

    # I'm not sure what the goal is: the difference, or the edges that are in R but not in S
    # In case it is the difference:
    diff_edges = r_edges.symmetric_difference(s_edges)

    # In case its the edges that are in R but not in S:
    # diff_edges = r_edges - s_edges

    DIF.add_edges_from(diff_edges)

    return DIF

print(difference(S, R).edges())

此版本打印[(0, 2)]

正如@Joel注意到的那样,在无向图中,没有保证(至少:我没有在源或文档中找到它)节点的顺序是一致的。如果这是一个问题,您可以先将元组转换为frozensets,因此顺序无关紧要。你需要frozensets,而不是集合或列表,因为它们是可以删除的(这是集合成员的要求)

set([frozenset(x) for x in S.edges()])

答案 1 :(得分:0)

编写它的简单方法如下(raise nx.Networkx...行之后差异方法的一部分

for edge in S.edges_iter():
        if not R.has_edge(edge[0],edge[1]):
            DIF.add_edge(edge[0],edge[1])
    return DIF;

这是我的例子中的图表:

enter image description here

正如@joel所提到的,我通过将边[0]与边[1]进行交换来测试它的无向图,它运行良好。

至于你的代码我相信你唯一的问题是显示图表。

首先要在单独的图中显示每个图表,您必须在每次抽奖后执行plt.show()

第二个在最后一行你写的plt.show(D)不是正确的方法,你必须使用绘图功能然后调用plt.show()

最后,查看drawing documentation,您还可以使用其他绘图功能自定义绘制的图形,例如nx.draw_networkx_nodes个节点的形状,颜色,大小......