Sankey Diagram
Hospital Patient Journey
Patient flow through hospital departments from emergency admission to discharge 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='#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
More Sankey Diagram examples
☕