大家好,我是你们的小帅学长。
在上一篇我们讲了箱线图(Box plot)。它可以告诉我们:中位数在哪里?数据是否离散?是否存在异常值?但箱线图有一个明显的局限,它看不到“分布形状”。
比如,如果两组数据的中位数相同,四分位数相同,IQR 相同,那么箱线图画出来可能几乎一样。
但真实分布可能完全不同:一组是正态分布,一组是双峰分布,一组是偏态分布,箱线图是看不出来的。
这时候,就轮到今天的主角登场了,小提琴图(Violin Plot)。
01. 小提琴图是什么?
小提琴图其实可以理解为 箱线图 + KDE 密度。
结构是这样的:
外形像一把小提琴,所以叫 Violin Plot。它能表达统计结构,分布形状。因此在科研中越来越常见。
02. 小提琴图最重要的信息
小提琴图最有价值的地方在于,它可以显示分布形状。
例如:单峰分布:中间最宽,两侧变窄。
双峰分布:会出现两个“鼓包”。
偏态分布:一侧明显拉长。
这些结构,在箱线图里是看不到的。
03. 什么时候用小提琴图?
小提琴图特别适合:
1)比较多个组的分布形状
例如:不同模型误差分布
不同地区污染分布
不同实验组结果
不仅可以比较中心值,还能比较分布结构是否不同。
2)数据量较大
因为 KDE 需要足够样本。
一般建议:n > 50
数据越多,小提琴图越稳定。
3)你关心分布形态
例如:是否多峰?是否偏态?是否集中?
小提琴图比箱线图更有信息量。
04. 小提琴图常见误区
1)宽度代表样本数量
实际上,宽度代表概率密度,而不是数量。
2)形状一定真实
小提琴图依赖 KDE。
如果样本量很小,形状可能不稳定。
3)越复杂越好
小提琴图已经很复杂。
不要再叠加太多信息,否则会难读。
05. 小提琴图 vs 箱线图
箱线图看统计,小提琴图看形状。
06. 论文级小提琴图 Python 示例
import osimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as snsfrom matplotlib import font_manager as fmwin_fonts = r"C:\Windows\Fonts"for p in [ os.path.join(win_fonts, "times.ttf"), os.path.join(win_fonts, "timesbd.ttf"), os.path.join(win_fonts, "timesi.ttf"), os.path.join(win_fonts, "simsun.ttc"),]: if os.path.exists(p): try: fm.fontManager.addfont(p) except Exception: passmpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = FalseOUT_DIR = r"D:\py_figs"os.makedirs(OUT_DIR, exist_ok=True)# 示例数据np.random.seed(42)model_A = np.random.normal(0.5,0.08,200)model_B = np.random.normal(0.6,0.10,200)model_C = np.random.normal(0.65,0.07,200)data = [model_A, model_B, model_C]labels = [ "Model A / 模型A", "Model B / 模型B", "Model C / 模型C"]fig, ax = plt.subplots(figsize=(7,4))sns.violinplot( data=data, inner="box", cut=0, ax=ax)ax.set_xticklabels(labels)ax.set_title("Violin Plot Comparison / 小提琴图比较", fontsize=14)ax.set_ylabel("Accuracy / 准确率", fontsize=12)out_path = os.path.join(OUT_DIR,"violin_plot_demo.jpg")fig.savefig( out_path, dpi=300, bbox_inches="tight", pad_inches=0.05)plt.close()print("Saved:", out_path)

箱线图告诉你数据在哪里,小提琴图告诉你数据长什么样。
小提琴图已经能展示 KDE 密度、箱线统计。
但如果我们还想看到 每个真实样本点、分布形状和统计结构,就可以进入一个更高级的图形:《雨云图(Raincloud Plot)》。
——期待你的关注——
往期内容:
用Python做科研级画图——KDE密度
用Python做科研级画图——箱线图(解释统计含义)
用Python做科研级画图——直方图
用Python做科研级画图——哑铃图
用Python做科研级画图——分组对比