Sankey Diagram

Water Treatment Process

Municipal water flow through treatment stages from intake to distribution endpoints.

Output
Water Treatment Process
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.004

# Intake to treatment
draw_flow(ax, 0.5, 5, 2.5, 5, 1000*s, 1000*s, '#27D3F5', 0.6)

# Treatment split
draw_flow(ax, 3.5, 5.5, 5.5, 7.5, 50*s, 50*s, '#9C2007', 0.6)   # Sludge
draw_flow(ax, 3.5, 4.5, 5.5, 4, 950*s, 950*s, '#276CF5', 0.6)  # Clean

# Distribution
draw_flow(ax, 6.5, 4.5, 8.5, 6.5, 500*s, 500*s, '#6CF527', 0.6)  # Residential
draw_flow(ax, 6.5, 3.8, 8.5, 3.5, 300*s, 300*s, '#F5B027', 0.6)  # Industrial
draw_flow(ax, 6.5, 3.2, 8.5, 1, 150*s, 150*s, '#4927F5', 0.6)   # Commercial

# Nodes
draw_node(ax, 0, 5, 0.6, 1000*s*1.2, '#27D3F5', 'Intake\n1000 ML')
draw_node(ax, 3, 5, 0.6, 1000*s*1.2, '#27F5B0', 'Treatment\n1000 ML')
draw_node(ax, 6, 7.5, 0.6, 50*s*4, '#9C2007', 'Sludge\n50 ML')
draw_node(ax, 6, 4, 0.6, 950*s*1.2, '#276CF5', 'Clean\n950 ML')
draw_node(ax, 9, 6.5, 0.6, 500*s*1.3, '#6CF527', 'Homes\n500 ML')
draw_node(ax, 9, 3.5, 0.6, 300*s*1.6, '#F5B027', 'Industry\n300 ML')
draw_node(ax, 9, 1, 0.6, 150*s*2.5, '#4927F5', 'Business\n150 ML')

ax.set_title('Water Treatment & Distribution 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