from pathlib import Path import matplotlib.pyplot as plt import numpy as np rng = np.random.default_rng(42) latency_ms = [ rng.normal(95, 12, 80), rng.normal(110, 18, 80), rng.normal(132, 25, 80), ] labels = ["API", "Batch", "Search"] colors = ["#d8ecff", "#e6f4d7", "#ffe2c2"] fig, ax = plt.subplots(figsize=(7, 4), layout="constrained") result = ax.boxplot( latency_ms, tick_labels=labels, patch_artist=True, medianprops={"color": "black", "linewidth": 1.4}, boxprops={"edgecolor": "#3973ac"}, ) for patch, color in zip(result["boxes"], colors): patch.set_facecolor(color) ax.set_ylabel("Latency (ms)") ax.set_title("Service latency by workload") ax.grid(axis="y", linestyle=":", alpha=0.5) output = Path("box-plot-create.png") fig.savefig(output, dpi=150) print(f"boxes: {len(result['boxes'])}") print(f"medians: {len(result['medians'])}") print(f"saved: {output}")