Sankey Diagram
Website Traffic Flow
User journey flow from traffic sources through site engagement to conversion outcomes.
Output
Python
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.path import Path
def draw_flow(ax, x0, y0, x1, y1, w0, w1, color, alpha=0.6):
cx = (x0 + x1) / 2
verts = [
(x0, y0 + w0/2), (cx, y0 + w0/2), (cx, y1 + w1/2), (x1, y1 + w1/2),
(x1, y1 - w1/2), (cx, y1 - w1/2), (cx, y0 - w0/2), (x0, y0 - w0/2),
(x0, y0 + w0/2)
]
codes = [Path.MOVETO] + [Path.CURVE4]*3 + [Path.LINETO] + [Path.CURVE4]*3 + [Path.CLOSEPOLY]
ax.add_patch(mpatches.PathPatch(Path(verts, codes), fc=color, alpha=alpha, ec='none'))
def draw_node(ax, x, y, w, h, color, label):
ax.add_patch(mpatches.FancyBboxPatch((x-w/2, y-h/2), w, h, boxstyle="round,pad=0.02",
fc=color, ec='white', lw=1.5))
ax.text(x, y, label, ha='center', va='center', fontsize=8, color='white', fontweight='bold')
fig, ax = plt.subplots(figsize=(14, 8), facecolor='#0a0a0f')
ax.set_facecolor('#0a0a0f')
s = 0.0006
# Source flows to Landing
draw_flow(ax, 0.5, 7, 2.5, 5.5, 5000*s, 5000*s, '#F5276C', 0.7)
draw_flow(ax, 0.5, 4, 2.5, 4.5, 3000*s, 3000*s, '#4927F5', 0.7)
draw_flow(ax, 0.5, 2, 2.5, 3.5, 2000*s, 2000*s, '#27D3F5', 0.7)
# Landing to outcomes
draw_flow(ax, 3.5, 5.5, 5.5, 7, 4000*s, 4000*s, '#C82909', 0.7) # Bounce
draw_flow(ax, 3.5, 4, 5.5, 4, 6000*s, 6000*s, '#6CF527', 0.7) # Engaged
# Engaged to conversions
draw_flow(ax, 6.5, 4.5, 8.5, 6, 2000*s, 2000*s, '#F5B027', 0.7) # Browse
draw_flow(ax, 6.5, 3.5, 8.5, 3, 4000*s, 4000*s, '#27F5B0', 0.7) # Convert
# Nodes
draw_node(ax, 0, 7, 0.6, 5000*s*1.5, '#F5276C', 'Organic\n5K')
draw_node(ax, 0, 4, 0.6, 3000*s*1.5, '#4927F5', 'Paid Ads\n3K')
draw_node(ax, 0, 2, 0.6, 2000*s*1.5, '#27D3F5', 'Social\n2K')
draw_node(ax, 3, 5, 0.6, 10000*s*1.2, '#F5B027', 'Landing\n10K')
draw_node(ax, 6, 7, 0.6, 4000*s*1.5, '#C82909', 'Bounced\n4K')
draw_node(ax, 6, 4, 0.6, 6000*s*1.3, '#6CF527', 'Engaged\n6K')
draw_node(ax, 9, 6, 0.6, 2000*s*1.5, '#F5B027', 'Browse\n2K')
draw_node(ax, 9, 3, 0.6, 4000*s*1.3, '#27F5B0', 'Convert\n4K')
ax.set_title('Website Traffic Flow Analysis', fontsize=16, color='white', fontweight='bold', pad=20)
ax.set_xlim(-1, 10)
ax.set_ylim(0, 9)
ax.axis('off')
plt.tight_layout()
plt.show()
Library
Matplotlib
Category
Part-to-Whole
More Sankey Diagram examples
☕