Gauge Chart

Storage Usage Gauge

Disk space utilization with amber warning indicator

Output
Storage Usage Gauge
Python
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge, Circle, Polygon
import numpy as np

# Data
used_gb = 847
total_gb = 1000
value = (used_gb / total_gb) * 100

# Dynamic color based on usage
arc_color = '#F54927' if value > 85 else '#F5B027' if value > 70 else '#27F5B0'

# Colors
bg_color = '#0a0a0f'
track_color = '#1a1a2e'
text_color = '#ffffff'
dim_color = '#6b7280'

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')

# Track
ax.add_patch(Wedge((0, 0), 1.0, start_angle, end_angle, width=0.15,
                   facecolor=track_color, edgecolor='none'))

# Warning zone indicator at 80%
warn_angle = end_angle - 0.8 * sweep
ax.plot([0.86*np.cos(np.radians(warn_angle)), 1.02*np.cos(np.radians(warn_angle))],
        [0.86*np.sin(np.radians(warn_angle)), 1.02*np.sin(np.radians(warn_angle))],
        color='#F54927', linewidth=2, alpha=0.5)

# Value arc
value_pct = value / 100
value_angle = start_angle + (1 - value_pct) * sweep
for r_off, w_off, alpha in [(0.05, 0.06, 0.1), (0.03, 0.04, 0.2), 
                             (0.015, 0.02, 0.4), (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))

# Ticks
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='#3a3a4a', 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
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)

for scale, alpha in [(1.6, 0.1), (1.3, 0.2)]:
    ax.add_patch(Polygon([(nx*scale, ny*scale), (bx1*2, by1*2), (-bx1*2, -by1*2)],
                         facecolor=arc_color, edgecolor='none', alpha=alpha))
ax.add_patch(Polygon([(nx, ny), (bx1, by1), (-bx1, -by1)], facecolor='#ffffff', edgecolor='none'))

# Hub
for r, c, a in [(0.11, arc_color, 0.3), (0.09, arc_color, 0.5), (0.07, bg_color, 1), (0.05, arc_color, 0.9)]:
    ax.add_patch(Circle((0, 0), r, facecolor=c, edgecolor='none', alpha=a))

# Text
ax.text(0, -0.22, f'{value:.0f}%', fontsize=52, fontweight='bold', color=text_color, ha='center', va='center')
ax.text(0, -0.40, f'{used_gb} GB / {total_gb} GB', fontsize=14, color=arc_color, ha='center', va='center', fontweight='600')
status = 'LOW SPACE' if value > 85 else 'WARNING' if value > 70 else 'HEALTHY'
ax.text(0, -0.56, status, fontsize=12, color=arc_color, ha='center', va='center', fontweight='500')
ax.text(0, 1.22, 'Storage Capacity', 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