Sankey Diagram

HR Recruitment Funnel

Candidate flow through hiring stages from application to onboarding.

Output
HR Recruitment Funnel
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.012

# Applications to screening
draw_flow(ax, 0.5, 5, 2.5, 5, 500*s, 500*s, '#F527B0', 0.6)

# Screening split
draw_flow(ax, 3.5, 5.5, 5.5, 7.5, 350*s, 350*s, '#C82909', 0.6)  # Rejected
draw_flow(ax, 3.5, 4.5, 5.5, 4, 150*s, 150*s, '#27D3F5', 0.6)   # Interview

# Interview outcomes
draw_flow(ax, 6.5, 4.5, 8.5, 6, 100*s, 100*s, '#F5B027', 0.6)   # No offer
draw_flow(ax, 6.5, 3.5, 8.5, 3, 50*s, 50*s, '#6CF527', 0.6)    # Hired

# Nodes
draw_node(ax, 0, 5, 0.6, 500*s*1.1, '#F527B0', 'Applied\n500')
draw_node(ax, 3, 5, 0.6, 500*s*1.1, '#4927F5', 'Screen\n500')
draw_node(ax, 6, 7.5, 0.6, 350*s*1.2, '#C82909', 'Rejected\n350')
draw_node(ax, 6, 4, 0.6, 150*s*1.5, '#27D3F5', 'Interview\n150')
draw_node(ax, 9, 6, 0.6, 100*s*1.5, '#F5B027', 'No Offer\n100')
draw_node(ax, 9, 3, 0.6, 50*s*2.5, '#6CF527', 'Hired\n50')

ax.set_title('HR Recruitment Pipeline 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