Waterfall Chart

Carbon Footprint Reduction Initiative

Environmental impact waterfall showing emissions reduction initiatives and net carbon footprint.

Output
Carbon Footprint Reduction Initiative
Python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Patch

categories = ['Baseline\nEmissions', 'Renewable\nEnergy', 'Fleet\nElectrification', 'Building\nEfficiency', 
              'Supply Chain\nOptimization', 'Carbon\nOffsets', 'Employee\nCommute', 'Net\nEmissions']
values = [0, -2800, -1500, -850, -620, -1200, -380, 0]

initial = 12000
running_total = initial
bottoms, heights, colors = [], [], []

for i, (cat, val) in enumerate(zip(categories, values)):
    if 'Baseline' in cat:
        bottoms.append(0)
        heights.append(initial)
        colors.append('#F5276C')
    elif 'Net' in cat:
        bottoms.append(0)
        heights.append(running_total)
        colors.append('#6CF527' if running_total < initial * 0.5 else '#F5B027')
    else:
        bottoms.append(running_total + val)
        heights.append(abs(val))
        colors.append('#27F5B0')
        running_total += val

fig, ax = plt.subplots(figsize=(14, 8), facecolor='#0a0a0f')
ax.set_facecolor('#0a0a0f')

x = np.arange(len(categories))
bars = ax.bar(x, heights, bottom=bottoms, color=colors, width=0.65, edgecolor='#1e293b', linewidth=1)

for i, (bar, val, bot, height) in enumerate(zip(bars, values, bottoms, heights)):
    y_pos = bot + height / 2
    if 'Baseline' in categories[i] or 'Net' in categories[i]:
        label = str(height)
        ax.text(bar.get_x() + bar.get_width()/2, y_pos, label, ha='center', va='center', 
                fontsize=11, fontweight='bold', color='white')
    else:
        label = str(val)
        ax.text(bar.get_x() + bar.get_width()/2, y_pos, label, ha='center', va='center', 
                fontsize=10, fontweight='bold', color='#0a0a0f' if height > 1000 else 'white')

for i in range(len(x) - 1):
    y = initial if i == 0 else bottoms[i]
    ax.plot([x[i] + 0.35, x[i+1] - 0.35], [y, y], color='#475569', linestyle='--', linewidth=1.5, alpha=0.7)

ax.set_xlim(-0.6, len(categories) - 0.4)
ax.set_ylim(0, initial * 1.1)
ax.set_xticks(x)
ax.set_xticklabels(categories, fontsize=9, color='#e2e8f0')
ax.set_ylabel('CO2 Emissions (tons/year)', fontsize=12, color='#e2e8f0', fontweight='500')
ax.set_title('Corporate Carbon Footprint Reduction Roadmap', fontsize=16, color='white', fontweight='bold', pad=20)
ax.tick_params(axis='y', colors='#e2e8f0', labelsize=10)
ax.yaxis.grid(True, linestyle='--', alpha=0.3, color='#334155')
ax.set_axisbelow(True)
for spine in ax.spines.values():
    spine.set_color('#334155')

reduction = initial - running_total
pct = (reduction / initial) * 100
ax.annotate('Reduction: ' + str(reduction) + ' tons (' + str(round(pct, 0)) + ' pct)', xy=(0.98, 0.95), xycoords='axes fraction',
            fontsize=11, color='#6CF527', ha='right', fontweight='bold',
            bbox=dict(boxstyle='round,pad=0.4', facecolor='#1e293b', edgecolor='#6CF527', alpha=0.9))

legend_elements = [Patch(facecolor='#F5276C', label='Baseline Emissions'), Patch(facecolor='#27F5B0', label='Reduction Initiatives'),
                   Patch(facecolor='#6CF527', label='Net Emissions')]
ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(0, -0.1), ncol=3, fontsize=9,
          facecolor='#1e293b', edgecolor='#334155', labelcolor='white')

plt.tight_layout()
plt.subplots_adjust(bottom=0.15)
plt.show()
Library

Matplotlib

Category

Financial

Did this help you?

Support PyLucid to keep it free & growing

Support