Beeswarm Plot
API Response Latency by Endpoint
Server response times across different API endpoints
Output
Python
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(303)
BG_COLOR = '#0a0a0f'
TEXT_COLOR = 'white'
COLORS = ['#27D3F5', '#F5B027', '#6CF527', '#F5276C']
def simple_beeswarm(y, nbins=None, width=1.):
y = np.asarray(y)
if nbins is None:
nbins = np.ceil(len(y) / 6).astype(int)
nn, ybins = np.histogram(y, bins=nbins)
nmax = nn.max()
x = np.zeros(len(y))
ibs = []
for ymin, ymax in zip(ybins[:-1], ybins[1:]):
i = np.nonzero((y > ymin) * (y <= ymax))[0]
ibs.append(i)
dx = width / (nmax // 2) if nmax > 1 else width
for i in ibs:
yy = y[i]
if len(i) > 1:
j = len(i) % 2
i = i[np.argsort(yy)]
a = i[j::2]
b = i[j+1::2]
x[a] = (0.5 + j / 3 + np.arange(len(b))) * dx
x[b] = (0.5 + j / 3 + np.arange(len(b))) * -dx
return x
endpoints = ['/auth', '/users', '/products', '/orders']
data = {
'/auth': np.random.gamma(2, 20, 45),
'/users': np.random.gamma(2.5, 25, 50),
'/products': np.random.gamma(3, 30, 55),
'/orders': np.random.gamma(4, 35, 48)
}
fig, ax = plt.subplots(figsize=(10, 6), facecolor=BG_COLOR)
ax.set_facecolor(BG_COLOR)
boxplot_data = []
for i, (endpoint, values) in enumerate(data.items()):
x = simple_beeswarm(values, width=0.3)
ax.scatter(x + i + 1, values, c=COLORS[i], alpha=0.7, s=45, edgecolors='white', linewidth=0.5)
boxplot_data.append(values)
bp = ax.boxplot(boxplot_data, positions=range(1, len(endpoints)+1), widths=0.5, patch_artist=True)
for patch in bp['boxes']:
patch.set_facecolor('none')
patch.set_edgecolor('#666')
for element in ['whiskers', 'caps', 'medians']:
for item in bp[element]:
item.set_color('#666')
ax.axhline(100, color='#ef4444', linestyle='--', alpha=0.5, linewidth=1)
ax.text(4.6, 105, 'SLA', color='#ef4444', fontsize=9)
ax.set_xticks(range(1, len(endpoints)+1))
ax.set_xticklabels(endpoints, color=TEXT_COLOR, fontfamily='monospace')
ax.set_xlabel('API Endpoint', fontsize=12, color=TEXT_COLOR, fontweight='500')
ax.set_ylabel('Latency (ms)', fontsize=12, color=TEXT_COLOR, fontweight='500')
ax.set_title('API Response Latency Distribution', fontsize=14, color=TEXT_COLOR, fontweight='bold', pad=15)
ax.tick_params(colors='#888', labelsize=10)
for spine in ax.spines.values():
spine.set_color('#333')
plt.tight_layout()
plt.show()
Library
Matplotlib
Category
Statistical
☕