Sankey Diagram

Hospital Patient Journey

Patient flow through hospital departments from emergency admission to discharge outcomes.

Output
Hospital Patient Journey
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.006

# ER to Triage
draw_flow(ax, 0.5, 5, 2.5, 5, 1000*s, 1000*s, '#F5276C', 0.6)

# Triage outputs
draw_flow(ax, 3.5, 5.5, 5.5, 7, 200*s, 200*s, '#6CF527', 0.6)  # Discharged
draw_flow(ax, 3.5, 4.5, 5.5, 4, 800*s, 800*s, '#27D3F5', 0.6)  # Admitted

# Ward distribution
draw_flow(ax, 6.5, 4.5, 8.5, 6.5, 400*s, 400*s, '#4927F5', 0.6)  # General
draw_flow(ax, 6.5, 3.8, 8.5, 3.5, 250*s, 250*s, '#F5B027', 0.6)  # ICU
draw_flow(ax, 6.5, 3.2, 8.5, 1, 150*s, 150*s, '#C82909', 0.6)   # Surgery

# Nodes
draw_node(ax, 0, 5, 0.6, 1000*s*1.2, '#F5276C', 'ER\n1000')
draw_node(ax, 3, 5, 0.6, 1000*s*1.2, '#F54927', 'Triage\n1000')
draw_node(ax, 6, 7, 0.6, 200*s*2, '#6CF527', 'Discharged\n200')
draw_node(ax, 6, 4, 0.6, 800*s*1.2, '#27D3F5', 'Admitted\n800')
draw_node(ax, 9, 6.5, 0.6, 400*s*1.5, '#4927F5', 'General\n400')
draw_node(ax, 9, 3.5, 0.6, 250*s*1.7, '#F5B027', 'ICU\n250')
draw_node(ax, 9, 1, 0.6, 150*s*2.5, '#C82909', 'Surgery\n150')

ax.set_title('Hospital Patient Journey Flow', fontsize=16, color='#1f2937', fontweight='bold', pad=20)
ax.set_xlim(-1, 10)
ax.set_ylim(-0.5, 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