Gauge Chart
Sales Target Achievement
Monthly sales performance with coral accent on clean white background
Output
Python
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge, Circle, Polygon
import numpy as np
# Data
value = 92
max_value = 100
# Colors - Light theme
bg_color = '#ffffff'
track_color = '#f3f4f6'
arc_color = '#F5276C'
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 with subtle shadow
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 arc with soft glow
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))
# 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 with shadow
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)
# Shadow
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'{value}%', fontsize=52, fontweight='bold', color=text_color, ha='center', va='center')
ax.text(0, -0.40, 'OF QUOTA', fontsize=13, color=dim_color, ha='center', va='center', fontweight='500')
ax.text(0, -0.56, 'Exceeding Target!', fontsize=13, color=arc_color, ha='center', va='center', fontweight='600')
ax.text(0, 1.22, 'Sales Performance', fontsize=18, fontweight='bold', color=text_color, ha='center', va='center')
plt.tight_layout()
plt.show()
Library
Matplotlib
Category
Part-to-Whole
More Gauge Chart examples
☕