箱线图 能看中位数、Q1、Q3 和离群点,但它看不到一个重要信息:
数据到底集中在哪些区域?
小提琴图(Violin Plot)把 箱线图 与 核密度分布 结合起来,可以直接看到数据分布的"形状"。
图表达什么?
下面比较三组 LLM 推理服务的 TTFT:

小提琴图中:
- 越宽的位置:说明该 TTFT 附近的请求越多;
- 越窄的位置:说明该区域请求较少;
- 中间横线:表示中位数;
- 上下延伸部分:反映数据的整体范围和尾部。
图中可以看到:
- vLLM 的主要请求集中在约 1.2~1.7 秒;
- SGLang 整体分布更靠下;
- Optimized 分布最集中,典型 TTFT 更低;
- vLLM 和 SGLang 上方都存在较长的尾部,说明仍有少量慢请求。
这正是小提琴图相比箱线图的优势:
不仅知道"中心在哪",还知道"数据是怎么分布的"。
核心代码
cpp
fig, ax = plt.subplots(
figsize=(9, 6)
)
ax.violinplot(
[
df["vLLM"],
df["SGLang"],
df["Optimized"]
],
positions=[1, 2, 3],
# 不显示均值
showmeans=False,
# 显示中位数
showmedians=True,
# 显示最大最小范围
showextrema=True
)
一句话总结
小提琴图通过宽度展示数据密度,比箱线图更直观地揭示 数据的集中区域、偏态和长尾结构。