networkx.classes.function.subgraph_view

subgraph_view(G, filter_node=<function no_filter>, filter_edge=<function no_filter>)[source]

View of G applying a filter on nodes and edges.

subgraph_view provides a read-only view of the input graph that excludes nodes and edges based on the outcome of two filter functions filter_node and filter_edge.

The filter_node function takes one argument — the node — and returns True if the node should be included in the subgraph, and False if it should not be included.

The filter_edge function takes two arguments — the nodes describing an edge — and returns True if the edge should be included in the subgraph, and False if it should not be included.

Both node and edge filter functions are called on graph elements as they are queried, meaning there is no up-front cost to creating the view.

Parameters
  • G (networkx.Graph) – A directed/undirected graph/multigraph

  • filter_node (callable, optional) – A function taking a node as input, which returns True if the node should appear in the view.

  • filter_edge (callable, optional) – A function taking as input the two nodes describing an edge, which returns True if the edge should appear in the view.

Returns

graph – A read-only graph view of the input graph.

Return type

networkx.Graph

Examples

>>> import networkx as nx
>>> G = nx.path_graph(6)

Filter functions operate on the node, and return True if the node should appear in the view:

>>> def filter_node(n1):
...     return n1 != 5
...
>>> view = nx.subgraph_view(
...     G,
...     filter_node=filter_node
... )
>>> view.nodes()
NodeView((0, 1, 2, 3, 4))

We can use a closure pattern to filter graph elements based on additional data — for example, filtering on edge data attached to the graph:

>>> G[3][4]['cross_me'] = False
>>> def filter_edge(n1, n2):
...     return G[n1][n2].get('cross_me', True)
...
>>> view = nx.subgraph_view(
...     G,
...     filter_edge=filter_edge
... )
>>> view.edges()
EdgeView([(0, 1), (1, 2), (2, 3), (4, 5)])
>>> view = nx.subgraph_view(
...     G,
...     filter_node=filter_node,
...     filter_edge=filter_edge,
... )
>>> view.nodes()
NodeView((0, 1, 2, 3, 4))
>>> view.edges()
EdgeView([(0, 1), (1, 2), (2, 3)])