Sankey Diagram

Revenue Stream Analysis

Company revenue flow from multiple business units through cost centers to profit distribution.

Output
Revenue Stream 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='white', 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='#0a0a0f')
ax.set_facecolor('#0a0a0f')

s = 0.0008

# Revenue sources
draw_flow(ax, 0.5, 7, 2.5, 5.5, 4000*s, 4000*s, '#6CF527', 0.7)
draw_flow(ax, 0.5, 4, 2.5, 4.5, 3000*s, 3000*s, '#27F5B0', 0.7)
draw_flow(ax, 0.5, 2, 2.5, 3.5, 1000*s, 1000*s, '#27D3F5', 0.7)

# Costs
draw_flow(ax, 3.5, 5.5, 5.5, 7.5, 3000*s, 3000*s, '#C82909', 0.7)
draw_flow(ax, 3.5, 4, 5.5, 3, 5000*s, 5000*s, '#6CF527', 0.7)

# Nodes
draw_node(ax, 0, 7, 0.6, 4000*s*1.4, '#6CF527', 'SaaS\n$4M')
draw_node(ax, 0, 4, 0.6, 3000*s*1.5, '#27F5B0', 'Services\n$3M')
draw_node(ax, 0, 2, 0.6, 1000*s*2, '#27D3F5', 'Licensing\n$1M')
draw_node(ax, 3, 5, 0.6, 8000*s*1.1, '#F5B027', 'Revenue\n$8M')
draw_node(ax, 6, 7.5, 0.6, 3000*s*1.5, '#C82909', 'COGS\n$3M')
draw_node(ax, 6, 3, 0.6, 5000*s*1.3, '#6CF527', 'Gross Profit\n$5M')

ax.set_title('Revenue Stream Analysis', fontsize=16, color='white', fontweight='bold', pad=20)
ax.set_xlim(-1, 7)
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