Gauge Chart

Page Load Speed

Web performance metric with coral accent on white background

Output
Page Load Speed
Python
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge, Circle, Polygon
import numpy as np

load_time = 1.8  # seconds
max_time = 5.0
value = (load_time / max_time) * 100

bg_color = '#ffffff'
track_color = '#f3f4f6'
arc_color = '#F5276C' if load_time > 3 else '#F5B027' if load_time > 2 else '#27F5B0'
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))
ax.add_patch(Wedge((0, 0), 1.0, start_angle, end_angle, width=0.15, facecolor=track_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.15), (0.015, 0.02, 0.35), (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, val in enumerate([0, 1, 2, 3, 4, 5]):
    pct = val / max_time
    angle = np.radians(end_angle - pct * sweep)
    ax.plot([0.87*np.cos(angle), 0.80*np.cos(angle)], [0.87*np.sin(angle), 0.80*np.sin(angle)], color='#d1d5db', linewidth=2)
    ax.text(0.72*np.cos(angle), 0.72*np.sin(angle), f'{val}s', fontsize=10, 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'{load_time}s', fontsize=52, fontweight='bold', color=text_color, ha='center', va='center')
ax.text(0, -0.40, 'LOAD TIME', fontsize=13, color=dim_color, ha='center', va='center', fontweight='500')
status = 'FAST' if load_time < 2 else 'MODERATE' if load_time < 3 else 'SLOW'
ax.text(0, -0.56, status, fontsize=14, color=arc_color, ha='center', va='center', fontweight='bold')
ax.text(0, 1.22, 'Page Load Speed', 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