Gauge Chart

Test Coverage Metric

Code coverage percentage with lime green developer theme

Output
Test Coverage Metric
Python
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge, Circle, Polygon
import numpy as np

# Data
coverage = 84.5
max_value = 100
target = 80

# Colors - Light theme
bg_color = '#ffffff'
track_color = '#f3f4f6'
arc_color = '#6CF527'
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')

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

# Target line at 80%
target_ang = np.radians(end_angle - (target / 100) * sweep)
ax.plot([0.86*np.cos(target_ang), 1.02*np.cos(target_ang)],
        [0.86*np.sin(target_ang), 1.02*np.sin(target_ang)], 
        color='#d1d5db', linewidth=2.5, linestyle='--')

# Value arc
value_pct = coverage / 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))

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

# Hub
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))

# Text
ax.text(0, -0.22, f'{coverage}%', fontsize=50, fontweight='bold', color=text_color, ha='center', va='center')
ax.text(0, -0.40, 'COVERAGE', fontsize=13, color=dim_color, ha='center', va='center', fontweight='500')
status = 'PASSING' if coverage >= target else 'BELOW TARGET'
status_color = arc_color if coverage >= target else '#F54927'
ax.text(0, -0.56, status, fontsize=13, color=status_color, ha='center', va='center', fontweight='bold')
ax.text(0, 1.22, 'Test Coverage', 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