1.小提琴图(Violin Plot)介绍

小提琴图是一种绘制连续型数据的方法,可以认为是箱型图核密度图的结合体。所以,在小提琴图中,我们可以清晰地展示数据的基本统计特征及其概率密度信息。

四分位数范围(First/third  Quartile):小提琴图中心的黑色条。⑤Q3(第一四分位数):位于75%的数据点(有75%的数据小于该值);⑥Q2:中位数(Median):小提琴图中间的一个白点;⑦Q1(第一四分位数):位于25%的数据点(有25%的数据小于该值)

最大最小值:④Max值(Q3+1.5IQR):正常范围内,数据的最大值;⑧Min值(Q1-1.5IQR):正常范围内,数据的最小值
②检测的指标:功能障碍评分
③显著性水平,***P<0.001
⑨宽度=数据分布的密度、频率
⑩异常值:超出正常范围的数据点(Max值~Min值之间,理论上为95%置信区间)

小提琴图中较宽的部分代表观测值取值的概率较高,较窄的部分则对应于较低的概率。位于“栅栏”之外的是离群值。

小提琴图优点:除了显示上述的统计数据外,它还显示了数据的整体分布。这个差异点很有意义,特别是在处理多模态数据时,即有多峰值的分布。

如果数据的四分位数保持不变,箱形图就不会改变。那么,我们可以对数据进行修改,使四分位数不发生变化,但分布的形状会发生很大的变化。下面的图说明了这一点。

2.欣赏一些小提琴图

3.小提琴图绘制

工具:①R包ggplot:ggplot2 是R中最强大的可视化包之一,内置 geom_violin() 函数,支持高度自定义,并能结合其他图层(如箱线图、散点图)增强可视化效果。相关参数可查看文档:Package index • ggplot2

②vioplot(轻量级专用包)vioplot 是一个专门用于绘制小提琴图的包,语法简单,适合快速绘制。

③ ggpubr(基于ggplot2的扩展)ggpubr 提供更简单的语法,适合科研绘图,支持统计检验标注。

④此外,还有多种软件也支持小提琴图的绘制。

3.1 基础图

②内置数据集iris

#基础小提琴图绘制
ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
    geom_violin(color = "black", linewidth = 0.5) +
    scale_fill_brewer(palette = "Pastel1")
ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
    geom_violin(show.legend = FALSE) +
    stat_summary(fun = median, geom = "point", size = 2, color = "black")

3.2 分组小提琴图绘制

③diamonds 数据集

基础分组-按切工

library(ggplot2)
library(dplyr)

# 设置随机种子保证结果可重复
set.seed(123)
# 从diamonds数据集中随机抽取2000个样本
diamonds_sample <- diamonds %>% 
  sample_n(2000)

# 基础分组小提琴图(按切工分组)
ggplot(diamonds_sample, aes(x = cut, y = price, fill = cut)) +
  geom_violin(alpha = 0.7) +
  labs(title = "钻石价格分布(按切工分组)", 
       x = "切工质量", 
       y = "价格(美元)") +
  theme_minimal() +
  theme(legend.position = "none")  # 移除图例(避免冗余)

 双变量分组小提琴图(按切工和颜色分组)

# 双变量分组小提琴图(按切工和颜色分组)
ggplot(diamonds_sample, aes(x = cut, y = price, fill = color)) +
  geom_violin(position = position_dodge(0.8), alpha = 0.7) +
  labs(title = "钻石价格分布(按切工和颜色分组)",
       x = "切工质量",
       y = "价格(美元)",
       fill = "颜色等级") +
  scale_fill_brewer(palette = "Spectral") +  # 使用彩虹色系
  theme_minimal()

分面小提琴图(按颜色分面)

# 分面小提琴图(按颜色分面)
ggplot(diamonds_sample, aes(x = cut, y = price, fill = cut)) +
  geom_violin(alpha = 0.7) +
  facet_wrap(~color, nrow = 1) +  # 水平排列分面
  labs(title = "钻石价格分布(按颜色分面展示)",
       x = "切工质量",
       y = "价格(美元)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # 旋转x轴标签

 高级分组(按切工和净度分组)

# 高级分组(按切工和净度分组)
ggplot(diamonds_sample, aes(x = cut, y = price, fill = clarity)) +
  geom_violin(position = position_dodge(0.8), alpha = 0.7) +
  labs(title = "钻石价格分布(按切工和净度分组)",
       x = "切工质量",
       y = "价格(美元)",
       fill = "净度等级") +
  scale_fill_viridis_d() +  # 使用viridis色系
  theme_minimal()

3.3 组合图,小提琴图+箱线图+散点

#组合图,小提琴图+箱线图+散点
ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
    geom_violin(alpha = 0.5) +
    geom_boxplot(width = 0.1, fill = "white", outlier.shape = NA) +
    geom_jitter(width = 0.05, alpha = 0.3, size = 1.5) +
    scale_fill_viridis_d() +
    theme_bw()

3.4 分面小提琴图

#分面小提琴图
ggplot(mpg, aes(x = factor(cyl), y = hwy, fill = factor(cyl))) +
  geom_violin() +
  facet_wrap(~class) +
  labs(title = "不同车型的油耗分布",
       x = "气缸数",
       y = "高速公路里程(MPG)") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ps:以上作图仅为基础作图,可根据需要调整参数达到需要的效果。

参考资料:

https://zhuanlan.zhihu.com/p/608290992

https://zhuanlan.zhihu.com/p/376055263

FigDraw 11. SCI 文章绘图之小提琴图 (ViolinPlot)-CSDN博客

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐