NetworkX#
NetworkX is a library for the creation, manipulation, and analysis of complex networks and graphs.
import networkx as nx
Creating a Graph#
# Create an empty undirected graph
G = nx.Graph()
# Create a directed graph
D = nx.DiGraph()
Adding Nodes#
# Add a single node
G.add_node(1)
G.add_node("A", label="Node A", weight=5)
# Add multiple nodes
G.add_nodes_from([2, 3, 4, 5])
G.add_nodes_from([("B", {"label": "Node B"}), ("C", {"label": "Node C"})])
Adding Edges#
# Add a single edge
G.add_edge(1, 2)
G.add_edge("A", "B", weight=4.5)
# Add multiple edges
G.add_edges_from([(1, 3), (2, 4), (3, 5)])
# Add weighted edges (node1, node2, weight)
G.add_weighted_edges_from([(1, 2, 3.0), (2, 3, 1.5), (3, 4, 2.0)])
Removing Nodes and Edges#
# Remove a single node (also removes its edges)
G.remove_node(5)
# Remove multiple nodes
G.remove_nodes_from([4, 5])
# Remove edges
G.remove_edge(1, 2)
G.remove_edges_from([(1, 3), (2, 4)])
Graph Information#
# Nodes and edges
print(G.nodes()) # List of all nodes
print(G.edges()) # List of all edges
print(G.edges(data=True)) # Edges with attributes
# Neighbours of a node
print(list(G.neighbors(1)))
# Check existence
print(G.has_node(1)) # True/False
print(G.has_edge(1, 2)) # True/False
# Counts
print(G.number_of_nodes())
print(G.number_of_edges())
print(G.size()) # Number of edges (or sum of weights if weighted)
Method |
Description |
|---|---|
|
All nodes in the graph |
|
All edges in the graph |
|
Nodes adjacent to node |
|
Check if node exists |
|
Check if edge exists |
|
Count of nodes |
|
Count of edges |
|
Number of edges |
|
Degree of node |
Graph Functions#
Connected Components#
G = nx.Graph()
G.add_edges_from([(1, 2), (2, 3), (4, 5)])
# Get connected components (sets of nodes)
components = list(nx.connected_components(G))
print(components) # [{1, 2, 3}, {4, 5}]
# Number of connected components
print(nx.number_connected_components(G)) # 2
Warning
Removed: connected_component_subgraphs
nx.connected_component_subgraphs(G) was removed in NetworkX 2.4. Use this pattern instead:
for component in nx.connected_components(G):
subgraph = G.subgraph(component).copy()
# work with subgraph
Isolates#
Isolates are nodes with no edges.
G.add_node(99) # Node with no connections
isolates = list(nx.isolates(G))
print(isolates) # [99]
# Remove all isolates
G.remove_nodes_from(list(nx.isolates(G)))
Shortest Path (Dijkstra)#
G = nx.Graph()
G.add_weighted_edges_from([
("A", "B", 1),
("B", "C", 2),
("A", "C", 4),
("C", "D", 1),
])
# Bidirectional Dijkstra (returns length and path)
length, path = nx.bidirectional_dijkstra(G, "A", "D")
print(f"Shortest path: {path}") # ['A', 'B', 'C', 'D']
print(f"Total weight: {length}") # 4
# Simple shortest path
path = nx.shortest_path(G, "A", "D", weight="weight")
print(path) # ['A', 'B', 'C', 'D']
Complete Example#
import networkx as nx
# Build a social network
G = nx.Graph()
G.add_edges_from([
("Alice", "Bob"),
("Alice", "Charlie"),
("Bob", "David"),
("Charlie", "David"),
("Eve", "Frank"),
])
# Basic stats
print(f"Nodes: {G.number_of_nodes()}")
print(f"Edges: {G.number_of_edges()}")
print(f"Connected components: {nx.number_connected_components(G)}")
# Find the largest component
largest = max(nx.connected_components(G), key=len)
print(f"Largest component: {largest}")
# Shortest path between two people
if nx.has_path(G, "Alice", "David"):
path = nx.shortest_path(G, "Alice", "David")
print(f"Path from Alice to David: {path}")