Gauge Chart

Bug Resolution Rate

Software quality metric with lime green dev theme

Output
Bug Resolution Rate
Python
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge, Circle, Polygon
import numpy as np

resolved = 156
total = 180
rate = (resolved / total) * 100

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

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 = rate / 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 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'{rate:.0f}%', fontsize=52, fontweight='bold', color=text_color, ha='center', va='center')
ax.text(0, -0.40, f'{resolved} / {total} bugs', fontsize=13, color=arc_color, ha='center', va='center', fontweight='600')
ax.text(0, -0.56, 'THIS SPRINT', fontsize=11, color=dim_color, ha='center', va='center')
ax.text(0, 1.22, 'Bug Resolution', 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