Search code examples
pythonnetworkxsubgraph

NetworkX DiGraph create subgraph (DiGraph) by node


I would like to get a subgraph (red area) by node: The subgraph is composed of all the nodes reachable from the input node.

like G.subgraph(3) returns a new DiGraph from the red area.

enter image description here

For example I create a DiGraph as this:

import networkx as nx
G = nx.DiGraph()

G.add_path([1,2,3,4])
G.add_path([3,'a','b'])

A = nx.to_agraph(G)
A.layout()
A.draw('graph.png')

I looked into https://networkx.github.io/documentation/latest/reference/generated/networkx.Graph.subgraph.html and converting it to unidirectional. I tested out_egdes, strong/weak_connected_component, but its never worked. I also looked How to find subgraphs in a directed graph without converting to undirected graph? and Networkx: extract the connected component containing a given node (directed graph).

I know that Subgraph does not work in DiGraph.

Can someone please show me how to do this ? Would be nice if the resulting Graph is also a DiGraph


Solution

  • According to my understanding that the criteria of creation of the subgraph depends on the nodes reachable from the input node. Then the following recursive function should be sufficient to get the job done.

    def create_subgraph(G,sub_G,start_node):
        for n in G.successors_iter(start_node):
            sub_G.add_path([start_node,n])
            create_subgraph(G,sub_G,n)
    

    I copied your code to create the graph, initialized an empty Directed graph and called the function as follows:

    G = nx.DiGraph()
    G.add_path([1,2,3,4])
    G.add_path([3,'a','b'])
    sub_G = nx.DiGraph()
    create_subgraph(G, sub_G,3)
    

    The resulted Digraph is shown in the figure.enter image description here