Sankey Diagram

Website Traffic Flow

User journey flow from traffic sources through site engagement to conversion outcomes.

Output
Website Traffic Flow
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

Did this help you?

Support PyLucid to keep it free & growing

Support