Sankey Diagram

Marketing Funnel Analysis

Customer journey through marketing stages from awareness to conversion and retention.

Output
Marketing Funnel Analysis
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='#374151', 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='#ffffff')
ax.set_facecolor('#ffffff')

s = 0.0004

# Awareness to Interest
draw_flow(ax, 0.5, 5, 2.5, 5, 10000*s, 10000*s, '#6CF527', 0.6)

# Interest split
draw_flow(ax, 3.5, 5.5, 5.5, 7, 5000*s, 5000*s, '#C82909', 0.6)  # Lost
draw_flow(ax, 3.5, 4.5, 5.5, 4, 5000*s, 5000*s, '#27D3F5', 0.6)  # Consider

# Consider to Convert
draw_flow(ax, 6.5, 4.5, 8.5, 6, 3000*s, 3000*s, '#F5B027', 0.6)  # Eval only
draw_flow(ax, 6.5, 3.5, 8.5, 3, 2000*s, 2000*s, '#F5276C', 0.6)  # Purchase

# Nodes
draw_node(ax, 0, 5, 0.6, 10000*s*1.1, '#6CF527', 'Awareness\n10K')
draw_node(ax, 3, 5, 0.6, 10000*s*1.1, '#27F5B0', 'Interest\n10K')
draw_node(ax, 6, 7, 0.6, 5000*s*1.3, '#C82909', 'Lost\n5K')
draw_node(ax, 6, 4, 0.6, 5000*s*1.3, '#27D3F5', 'Consider\n5K')
draw_node(ax, 9, 6, 0.6, 3000*s*1.5, '#F5B027', 'Evaluate\n3K')
draw_node(ax, 9, 3, 0.6, 2000*s*1.7, '#F5276C', 'Purchase\n2K')

ax.set_title('Marketing Funnel Conversion Flow', fontsize=16, color='#1f2937', 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