NetworkX is one of the most powerful and flexible libraries for graph theory and complex network analysis in Python. Whether you're analyzing social networks, visualizing neural architectures, or simulating transportation systems, NetworkX provides the tools to model, analyze, and visualize complex relationships with ease. This guide walks you through everything from installation to advanced visualization techniques, ensuring you can leverage NetworkX for both research and practical applications.
What Is NetworkX?
NetworkX is a Python-based library designed for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks. It supports various types of graphs — including directed, undirected, weighted, and multigraphs — making it ideal for modeling real-world systems such as communication networks, biological pathways, and machine learning architectures.
Key Features
- Flexible data structures for graphs, digraphs, and multigraphs
- Built-in algorithms for shortest paths, centrality, clustering, and more
- Seamless integration with scientific Python stack (NumPy, Pandas, Matplotlib)
- Customizable attributes on nodes and edges
- Rich visualization capabilities using Matplotlib and Graphviz
👉 Discover powerful data modeling tools with OKX's developer resources
Installing and Setting Up NetworkX
Getting started with NetworkX is straightforward. If you're using Anaconda, it’s likely already installed. Otherwise, use pip:
pip install networkxTo verify your installation:
import networkx as nx
print(nx.__version__)For enhanced layout options (e.g., circular or hierarchical), consider installing pygraphviz or pydot:
# For Linux/macOS
sudo apt-get install graphviz libgraphviz-dev pkg-config
pip install pygraphviz
# For faster OpenCV installation (optional)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-pythonNote: These additional tools are optional but recommended for advanced visualizations.
Understanding Graph Types in NetworkX
NetworkX supports four primary graph types:
Graph: Undirected graphs without multiple edgesDiGraph: Directed graphs (edges have direction)MultiGraph: Undirected graphs allowing multiple edges between nodesMultiDiGraph: Directed graphs with multiple edges
Create an empty graph:
G = nx.Graph()
D = nx.DiGraph()
MG = nx.MultiGraph()
MDG = nx.MultiDiGraph()Use .clear() to reset a graph without recreating it.
Basic Workflow for Drawing Networks
The typical process for visualizing a network involves four steps:
- Import required libraries
- Create or load the network
- Define layout for node positioning
- Draw and display the graph
Example: Generate a Scale-Free Network
import networkx as nx
import matplotlib.pyplot as plt
# Generate a Barabási-Albert scale-free network
G = nx.random_graphs.barabasi_albert_graph(100, 1)
# Draw the network
nx.draw(G)
plt.savefig("ba_network.png") # Save to file
plt.show() # Display interactivelyLayout Options
Node placement significantly impacts readability. Common layouts include:
nx.spring_layout()– Force-directed layout (default)nx.circular_layout()– Nodes arranged in a circlenx.random_layout()– Random positioningnx.shell_layout()– Concentric circlesnx.spectral_layout()– Based on eigenvalues of graph Laplacian
You can specify layout explicitly:
pos = nx.spring_layout(G)
nx.draw(G, pos=pos)Working with Undirected Graphs (Graph)
Undirected graphs represent symmetric relationships — ideal for modeling friendships, collaborations, or physical connections.
Adding Nodes and Edges
G = nx.Graph()
# Add individual nodes
G.add_node('a')
G.add_nodes_from(['b', 'c', 'd', 'e'])
# Add edges
G.add_edge(1, 2)
G.add_edges_from([(1, 3), (2, 4)])
# Add cycles or subgraphs
G.add_cycle(['f', 'g', 'h', 'j'])
H = nx.path_graph(5)
G.add_nodes_from(H)Duplicate nodes or edges are ignored automatically.
Querying Graph Structure
Use built-in methods to explore topology:
print("All nodes:", list(G.nodes()))
print("Node count:", G.number_of_nodes())
print("All edges:", list(G.edges()))
print("Edge count:", G.number_of_edges())Common neighbor analysis:
list(nx.common_neighbors(G, 'a', 'b'))👉 Explore advanced network modeling techniques today
Handling Directed Graphs (DiGraph)
Directed graphs (digraphs) capture asymmetric relationships like information flow or dependencies.
Creating a Directed Network
D = nx.DiGraph()
D.add_edges_from([(1, 2), (2, 3), (3, 1)])
nx.draw(D, with_labels=True, arrows=True)
plt.show()Arrows indicate direction by default.
Converting Between Graph Types
Switch between directed and undirected representations:
undirected_G = D.to_undirected()
directed_G = G.to_directed()This is useful when comparing connectivity patterns regardless of directionality.
Advanced Visualizations with NetworkX
Weighted Networks
Visualize edge weights by varying line thickness:
G = nx.Graph()
G.add_edge('a', 'b', weight=0.6)
G.add_edge('a', 'c', weight=0.2)
elarge = [(u,v) for u,v,d in G.edges(data=True) if d['weight'] > 0.5]
esmall = [(u,v) for u,v,d in G.edges(data=True) if d['weight'] <= 0.5]
pos = nx.spring_layout(G)
nx.draw_networkx_edges(G, pos, edgelist=elarge, width=6)
nx.draw_networkx_edges(G, pos, edgelist=esmall, width=2, style='dashed')
nx.draw_networkx_nodes(G, pos, node_size=700)
nx.draw_networkx_labels(G, pos)
plt.axis('off')
plt.show()Color Gradients on Nodes and Edges
Apply color gradients based on node degree or centrality:
G = nx.cycle_graph(24)
pos = nx.spring_layout(G, iterations=200)
nx.draw(G, pos, node_color=range(24), node_size=800, cmap=plt.cm.Blues)
plt.show()Similarly, color edges using edge_color and edge_cmap.
Real-World Use Cases and Examples
Drawing a Neural Network Architecture
Modeling deep learning structures:
layer_sizes = [4, 7, 7, 2] # Input → Hidden → Output layers
G = nx.Graph()
node_count = 0
for i, size in enumerate(layer_sizes):
layer_top = (size - 1) / 2.0
for j in range(size):
G.add_node(node_count, pos=(i, layer_top - j))
node_count += 1
# Connect adjacent layers
for x, (left_size, right_size) in enumerate(zip(layer_sizes[:-1], layer_sizes[1:])):
for i in range(left_size):
for j in range(right_size):
left_idx = i + sum(layer_sizes[:x])
right_idx = j + sum(layer_sizes[:x+1])
G.add_edge(left_idx, right_idx)
pos = nx.get_node_attributes(G, 'pos')
nx.draw(G, pos, node_size=200, with_labels=True)
plt.show()Giant Component Analysis
Study phase transitions in random graphs:
n = 150
pvals = [0.003, 0.006, 0.008, 0.015]
for p in pvals:
G = nx.binomial_graph(n, p)
pos = nx.spring_layout(G)
plt.subplot()
nx.draw(G, pos, node_size=10)
# Highlight largest connected component in red
Gcc = sorted(nx.connected_components(G), key=len, reverse=True)
G0 = G.subgraph(Gcc[0])
nx.draw_networkx_edges(G0, pos, edge_color='r', width=4)Frequently Asked Questions
Q: Can I assign custom attributes to nodes and edges?
Yes. Attributes like labels, weights, colors, or metadata can be added during creation or modified later using dictionaries.
Q: How do I handle large networks efficiently?
Use efficient data formats like adjacency lists or sparse matrices. Avoid drawing very large graphs directly; instead focus on subgraphs or aggregate metrics.
Q: Does NetworkX support 3D visualization?
Not natively. While Matplotlib supports 3D axes, NetworkX layouts are 2D. For 3D rendering, export data to tools like Plotly or Gephi.
Q: Why does plt.show() fail in PyCharm?
Disable "Show plots in tool window" under File > Settings > Tools > Python Scientific to resolve display issues.
Q: Are there alternatives to NetworkX for neural network diagrams?
Yes. Tools like TensorBoard, Netron, or specialized libraries like PlotNeuralNet offer alternative visualization methods.
Q: Can I export graphs to formats like JSON or GEXF?
Absolutely. Use nx.write_gexf(), nx.readwrite.json_graph for interoperability with Cytoscape or other platforms.
Core Keywords
networkx python
graph theory
complex network analysis
directed graph
undirected graph
network visualization
shortest path algorithm
matplotlib network drawing
👉 Enhance your data science toolkit with cutting-edge resources