Gauge Chart

Carbon Footprint Index

Environmental sustainability metric with green eco theme

Output
Carbon Footprint Index
Python
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge, Circle, Polygon
import numpy as np

footprint = 28
max_footprint = 100
value = (footprint / max_footprint) * 100

bg_color = '#ffffff'
track_color = '#f3f4f6'
arc_color = '#27F5B0' if footprint < 30 else '#F5B027' if footprint < 60 else '#F54927'
text_color = '#1f2937'
dim_color = '#9ca3af'

start_angle, end_angle = -30, 210
sweep = end_angle - start_angle

fig, ax = plt.subplots(figsize=(10, 8), facecolor=bg_color)
ax.set_facecolor(bg_color)
ax.set_xlim(-1.4, 1.4)
ax.set_ylim(-0.5, 1.4)
ax.set_aspect('equal')
ax.axis('off')

ax.add_patch(Wedge((0.01, -0.01), 1.0, start_angle, end_angle, width=0.15, facecolor='#000000', edgecolor='none', alpha=0.03))

zones = [(0, 30, '#dcfce7'), (30, 60, '#fef3c7'), (60, 100, '#fee2e2')]
for z_start, z_end, z_color in zones:
    z_s_pct = z_start / max_footprint
    z_e_pct = z_end / max_footprint
    ax.add_patch(Wedge((0, 0), 1.0, end_angle - z_e_pct * sweep, end_angle - z_s_pct * sweep, width=0.15, facecolor=z_color, edgecolor='none'))

value_pct = value / 100
value_angle = start_angle + (1 - value_pct) * sweep
for r_off, w_off, alpha in [(0.03, 0.04, 0.2), (0.015, 0.02, 0.45), (0, 0, 0.95)]:
    ax.add_patch(Wedge((0, 0), 1.0 + r_off, value_angle, end_angle, width=0.15 + w_off, facecolor=arc_color, edgecolor='none', alpha=alpha))

for i in range(11):
    pct = i / 10
    angle = np.radians(end_angle - pct * sweep)
    r1, r2 = (0.87, 0.80) if i % 5 == 0 else (0.87, 0.83)
    ax.plot([r1*np.cos(angle), r2*np.cos(angle)], [r1*np.sin(angle), r2*np.sin(angle)], color='#d1d5db', linewidth=2 if i%5==0 else 1)
    if i % 5 == 0:
        ax.text(0.72*np.cos(angle), 0.72*np.sin(angle), f'{int(pct*100)}', fontsize=11, color=dim_color, ha='center', va='center')

needle_angle = np.radians(end_angle - value_pct * sweep)
nx, ny = 0.62 * np.cos(needle_angle), 0.62 * np.sin(needle_angle)
perp = needle_angle + np.pi/2
bx1, by1 = 0.035 * np.cos(perp), 0.035 * np.sin(perp)

ax.add_patch(Polygon([(nx+0.01, ny-0.01), (bx1+0.01, by1-0.01), (-bx1+0.01, -by1-0.01)], facecolor='#000000', edgecolor='none', alpha=0.1))
ax.add_patch(Polygon([(nx, ny), (bx1, by1), (-bx1, -by1)], facecolor=text_color, edgecolor='none'))

ax.add_patch(Circle((0.01, -0.01), 0.09, facecolor='#000000', edgecolor='none', alpha=0.08))
for r, c, a in [(0.10, arc_color, 0.2), (0.08, '#ffffff', 1), (0.06, arc_color, 0.9)]:
    ax.add_patch(Circle((0, 0), r, facecolor=c, edgecolor='none', alpha=a))

ax.text(0, -0.22, f'{footprint}', fontsize=56, fontweight='bold', color=text_color, ha='center', va='center')
ax.text(0, -0.40, 'CARBON INDEX', fontsize=13, color=dim_color, ha='center', va='center', fontweight='500')
ax.text(0, -0.56, 'LOW IMPACT', fontsize=14, color=arc_color, ha='center', va='center', fontweight='bold')
ax.text(0, 1.22, 'Carbon Footprint', fontsize=18, fontweight='bold', color=text_color, ha='center', va='center')

plt.tight_layout()
plt.show()
Library

Matplotlib

Category

Part-to-Whole

Did this help you?

Support PyLucid to keep it free & growing

Support