how to draw directed graphs using networkx in python?
Categories:
Drawing Directed Graphs with NetworkX in Python

Learn how to create, manipulate, and visualize directed graphs using the powerful NetworkX library in Python. This guide covers fundamental concepts and practical examples.
Directed graphs, also known as digraphs, are fundamental data structures used to model relationships with a specific direction. Think of a one-way street, a dependency in a project, or the flow of information in a network. Python's NetworkX library provides a robust and flexible way to create, analyze, and visualize these graphs. This article will walk you through the process, from basic graph creation to advanced visualization techniques.
Understanding Directed Graphs
Before diving into NetworkX, it's crucial to understand what makes a directed graph unique. Unlike undirected graphs where edges simply connect two nodes, directed graphs use 'edges' (often called 'arcs' or 'directed edges') that have a clear source and destination. This directionality is key to representing flows, hierarchies, and sequences. Each edge points from one node to another, indicating a relationship that only goes one way.
graph TD A[Node A] --> B(Node B) B --> C{Node C} C --> A C --> D[Node D]
A simple directed graph illustrating nodes and directed edges.
Creating a Directed Graph with NetworkX
NetworkX makes creating directed graphs straightforward. You'll primarily use the DiGraph
class. You can add nodes and edges individually, or in batches from lists or other data structures. Nodes can be any hashable Python object (numbers, strings, tuples, etc.), and edges can optionally have attributes like weights or labels.
import networkx as nx
import matplotlib.pyplot as plt
# 1. Create an empty directed graph
G = nx.DiGraph()
# 2. Add nodes
G.add_node("Start")
G.add_nodes_from(["Process A", "Process B", "End"])
# 3. Add edges (directed)
G.add_edge("Start", "Process A")
G.add_edge("Process A", "Process B", weight=0.5)
G.add_edge("Process B", "End")
G.add_edge("Start", "End", label="Shortcut")
print(f"Nodes: {G.nodes()}")
print(f"Edges: {G.edges(data=True)}")
Basic creation of a directed graph using networkx.DiGraph
.
weight=0.5
, label="Shortcut"
). These attributes are stored in the edge data and can be useful for analysis or visualization.Visualizing Directed Graphs
Visualization is crucial for understanding graph structures. NetworkX integrates well with Matplotlib for drawing graphs. The nx.draw_networkx
function is your primary tool, offering various layout algorithms and customization options to make your graphs readable and informative. For directed graphs, arrows are automatically drawn to indicate edge direction.
import networkx as nx
import matplotlib.pyplot as plt
# Re-using the graph G from the previous example
G = nx.DiGraph()
G.add_nodes_from(["Start", "Process A", "Process B", "End"])
G.add_edge("Start", "Process A")
G.add_edge("Process A", "Process B", weight=0.5)
G.add_edge("Process B", "End")
G.add_edge("Start", "End", label="Shortcut")
plt.figure(figsize=(8, 6))
# Define a layout for better visualization
pos = nx.spring_layout(G, seed=42) # For reproducible layout
# Draw nodes
nx.draw_networkx_nodes(G, pos, node_color='lightblue', node_size=3000)
# Draw edges with arrows
nx.draw_networkx_edges(G, pos, edgelist=G.edges(), arrowstyle='->', arrowsize=20, edge_color='gray')
# Draw node labels
nx.draw_networkx_labels(G, pos, font_size=10, font_weight='bold')
# Draw edge labels (if any)
edge_labels = nx.get_edge_attributes(G, 'label')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color='red')
plt.title("Directed Graph Visualization")
plt.axis('off') # Hide axes
plt.show()
Visualizing a directed graph with custom styling using Matplotlib.
spring_layout
, circular_layout
, shell_layout
, spectral_layout
). Experiment with different layouts to find the one that best represents your graph's structure. The seed
parameter in layout functions ensures reproducible results.