科研绘图——1.小提琴图(Violin Plot)
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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)