边缘重新绘制NetworkX图形时如何预设路径

时间:2019-11-11 10:02:02

标签: python graph networkx

当我过滤networkx图中的特定节点时,我想保留路径。 让我们说我有下图。

enter image description here

当我删除节点20 时,我想保留与下一个节点的路径或连接,因为存在通过节点20的连接。

我想要以下内容。

enter image description here

外面有人可以帮助我使用python应对这一挑战吗?

1 个答案:

答案 0 :(得分:2)

对于有向图,您可以使用g.in_edges(node)获取入射到节点的所有边,并使用g.out_edges(node)获取所有输出边。 一旦有了这些,只需将入射边缘的源和射出边缘的目标连接起来就很简单。 无向图没有传入和传出边的概念,因此您只需组合邻居(g.neighbors)。 最后,删除节点。

enter image description here

#!/usr/bin/env python
"""
Remove a node from a network while maintaining all paths.
"""
import itertools
import matplotlib.pyplot as plt
import networkx as nx

def remove_node(g, node):
    if g.is_directed():
        sources = [source for source, _ in g.in_edges(node)]
        targets = [target for _, target in g.out_edges(node)]
    else:
        sources = g.neighbors(node)
        targets = g.neighbors(node)

    new_edges = itertools.product(sources, targets)
    new_edges = [(source, target) for source, target in new_edges if source != target] # remove self-loops
    g.add_edges_from(new_edges)

    g.remove_node(node)

    return g

if __name__ == '__main__':

    edges = [(10, 20), (20, 30), (30, 40)]
    g = nx.DiGraph()
    g.add_edges_from(edges)

    fig, (ax1, ax2) = plt.subplots(1, 2)
    nx.draw_networkx(g, with_labels=True, ax=ax1)

    g = remove_node(g, 20)

    nx.draw_networkx(g, with_labels=True, ax=ax2)
    plt.show()