Python 在Networkx中映射两个图

Python 在Networkx中映射两个图,python,graph,networkx,Python,Graph,Networkx,这些天来,我一直在努力绘制两个不同的图,这取决于它们的共同点。这是两张图的样子。节点的颜色表示蓝色的是priority1,黄色的是priority2 共享同一节点的节点,我希望将它们合并。这就是我想要实现的目标。在这种情况下,10和190分别是31、130、204和240的公共节点。 这是我试过的代码 for node1, node2 in Graph2.edges(): if Graph1.has_edge(node1, node2): for attr in Gr

这些天来,我一直在努力绘制两个不同的图,这取决于它们的共同点。这是两张图的样子。节点的颜色表示蓝色的是priority1,黄色的是priority2

共享同一节点的节点,我希望将它们合并。这就是我想要实现的目标。在这种情况下,10和190分别是31、130、204和240的公共节点。

这是我试过的代码

for node1, node2 in Graph2.edges():
    if Graph1.has_edge(node1, node2):
        for attr in Graph2.adj[node1][node2]:
            if (Graph1.node[node1]['priority']==1):

                name = str(node1) + '/' + str(node2)            
                mapping = {n1: name, node2: name}
                Graph2 =nx.relabel_nodes(Graph2, mapping)

    pos1 = nx.shell_layout(Graph2) 

    nodes = nx.draw_networkx_nodes(Graph2, pos1, node_size=2000, node_color = 'b' , alpha=0.3, with_labels = True) 
    nx.draw_networkx_edges(Graph2, pos1, width=1.5, alpha=0.3, edge_color='k')
    nx.draw_networkx_labels(Graph2, pos1, font_size=15, font_family='sans-serif')  
有谁能帮我做到这一点吗


非常感谢

对于那些正在寻找类似解决方案的人,我尝试针对优先级1解决上述问题,这意味着针对蓝色节点。其余的优先事项也是如此。这里优先级和名称是我的图形属性

    try:
        for n1, n2, attr in list(graph1.edges(data ='True')):
            for x1, x2, attr1 in list(graph2.edges(data ='True')):
                if ((graph1.node[n1]['priority'] ==1) & (graph1.node[n1]['name'] =='Start')):
                    if ((graph2.node[x1]['priority'] ==1) & (graph2.node[x1]['name'] =='Start')):

                        name1 = str(n1) + '/' + str(x1)
                        mapping1 = {n1: name1, x1:name1}
                        graph1 =nx.relabel_nodes(graph1, mapping1)
                        graph2 =nx.relabel_nodes(graph2, mapping1)


    except KeyError:
        print('')   

    try:
        for n1, n2, attr in list(graph1.edges(data ='True')):
            for x1, x2, attr1 in list(graph2.edges(data ='True')):
                if ((graph1.node[n2]['priority'] ==1) & (graph1.node[n2]['name'] =='End')):
                    if ((graph2.node[x2]['priority'] ==1) & (graph2.node[x2]['name'] =='End')):

                        name1 = str(n2) + '/' + str(x2)
                        mapping1 = {n2: name1, x2:name1}
                        graph1 =nx.relabel_nodes(graph1, mapping1)
                        graph2 =nx.relabel_nodes(graph2, mapping1)


    except KeyError: 
        print('')  


对于那些正在寻找类似解决方案的人,我尝试为优先级1解决上述问题,这意味着为蓝色节点。其余的优先事项也是如此。这里优先级和名称是我的图形属性

    try:
        for n1, n2, attr in list(graph1.edges(data ='True')):
            for x1, x2, attr1 in list(graph2.edges(data ='True')):
                if ((graph1.node[n1]['priority'] ==1) & (graph1.node[n1]['name'] =='Start')):
                    if ((graph2.node[x1]['priority'] ==1) & (graph2.node[x1]['name'] =='Start')):

                        name1 = str(n1) + '/' + str(x1)
                        mapping1 = {n1: name1, x1:name1}
                        graph1 =nx.relabel_nodes(graph1, mapping1)
                        graph2 =nx.relabel_nodes(graph2, mapping1)


    except KeyError:
        print('')   

    try:
        for n1, n2, attr in list(graph1.edges(data ='True')):
            for x1, x2, attr1 in list(graph2.edges(data ='True')):
                if ((graph1.node[n2]['priority'] ==1) & (graph1.node[n2]['name'] =='End')):
                    if ((graph2.node[x2]['priority'] ==1) & (graph2.node[x2]['name'] =='End')):

                        name1 = str(n2) + '/' + str(x2)
                        mapping1 = {n2: name1, x2:name1}
                        graph1 =nx.relabel_nodes(graph1, mapping1)
                        graph2 =nx.relabel_nodes(graph2, mapping1)


    except KeyError: 
        print('')  


你的图表有一个非常特殊的结构吗?您试图解决的问题称为查找a,这对于大型图来说很难。此外,在您的特定情况下,映射很容易不明确。想象你的
图1
有另一个节点,比如说
42
,还有另外两条边,
(10,42)
,和
(42,190)
。您如何将
图2
映射到此图,该图现在有两个三角形而不是一个。亲爱的@PaulBrodersen谢谢您的回复。我有一个特殊的结构,我不关注节点编号。相反,正如我上面所说,我把重点放在他们的优先事项上。例如,蓝色的是
优先级1
,黄色的是
优先级2
。如果节点
42
优先级2
,该怎么办?你认为这样做是不明确的吗?还有一个问题,图同态是np完全的吗?关于你的第一个问题,我只想提出一个问题,首先可能没有一个明确的映射。这是否正确在很大程度上取决于图形的形状。您“优先级”可能会也可能不会消除所有这些情况的歧义,但给出了一个很难说明的示例。如果我是你,我会看一堆例子,说服自己总是有一个正确的解决方案,然后用更多的例子来扩展这个问题,或者更好:解释为什么映射总是明确的。关于你的第二个问题:是的,一般情况下是NP完全的,但是有许多特殊情况可以在多项式时间内解决。谢谢您的时间和解释,先生!!你的图表有一个非常特殊的结构吗?您试图解决的问题称为查找a,这对于大型图来说很难。此外,在您的特定情况下,映射很容易不明确。想象你的
图1
有另一个节点,比如说
42
,还有另外两条边,
(10,42)
,和
(42,190)
。您如何将
图2
映射到此图,该图现在有两个三角形而不是一个。亲爱的@PaulBrodersen谢谢您的回复。我有一个特殊的结构,我不关注节点编号。相反,正如我上面所说,我把重点放在他们的优先事项上。例如,蓝色的是
优先级1
,黄色的是
优先级2
。如果节点
42
优先级2
,该怎么办?你认为这样做是不明确的吗?还有一个问题,图同态是np完全的吗?关于你的第一个问题,我只想提出一个问题,首先可能没有一个明确的映射。这是否正确在很大程度上取决于图形的形状。您“优先级”可能会也可能不会消除所有这些情况的歧义,但给出了一个很难说明的示例。如果我是你,我会看一堆例子,说服自己总是有一个正确的解决方案,然后用更多的例子来扩展这个问题,或者更好:解释为什么映射总是明确的。关于你的第二个问题:是的,一般情况下是NP完全的,但是有许多特殊情况可以在多项式时间内解决。谢谢您的时间和解释,先生!!