科研绘图模板之小提琴分面图

小提琴分面图(Violin plot)是一种用于展示和比较数据分布的可视化图形。它类似于箱线图,但提供了更多关于数据分布密度的信息。小提琴图的核心是小提琴形状,这种形状是通过核密度估计(KDE)来展示数据分布的密度。

小提琴图的组成:

  1. 中心标记:通常在小提琴的中心有一条线或一个点来标记数据的中位数。
  2. 箱线图:有时在小提琴内部会绘制一个简化的箱线图,表示四分位数和极值。
  3. 密度轮廓:小提琴的主体显示数据的密度,宽度表示在该值处的数据密度较高。
  4. 分面:分面是指将数据集分割成多个子集来单独展示每个子集的小提琴图,通常用于比较不同类别或组内的数据分布。

小提琴图的用途:

  • 比较多个分组:小提琴图能够直观地比较不同分组或类别中的数据分布。
  • 显示数据分布的对称性和偏态:通过观察小提琴的形状,可以容易地判断数据的对称性和是否存在偏态。
  • 详细展示数据的多样性:与传统的箱线图相比,小提琴图提供了更多的信息,帮助理解数据在各个值上的密度。

示例

library(ggplot2)
library(reshape2)

inputFile <- "input.txt"
outFile <- "vioplot.pdf"

# 读取输入文件
rt <- read.table(inputFile, header=TRUE, sep="\t", check.names=FALSE, row.names=1)
colnames(rt)[1] <- "Type"  # 只更改一次列名

# 差异分析
geneSig <- sapply(colnames(rt)[-1], function(gene) {
  rt1 <- rt[, c(gene, "Type")]
  test <- if (length(levels(factor(rt1$Type))) > 2) {
    kruskal.test(expression ~ Type, data = rt1)
  } else {
    wilcox.test(expression ~ Type, data = rt1)
  }
  # 根据p值赋予标记
  ifelse(test$p.value < 0.001, "***", ifelse(test$p.value < 0.01, "**", ifelse(test$p.value < 0.05, "*", "")))
})
colnames(rt)[-1] <- paste(colnames(rt)[-1], geneSig, sep="")

# 准备ggplot2绘图数据
data <- melt(rt, id.vars="Type")
colnames(data) <- c("Type", "Gene", "Expression")

# 绘制小提琴图
p1 <- ggplot(data, aes(x=Type, y=Expression, fill=Type)) +
  geom_violin() +
  geom_boxplot(width=0.2, position=position_dodge(0.9)) +
  facet_wrap(~Gene, nrow=1) +
  labs(x="Sample Type", y="Gene Expression", fill="Sample Type") +
  theme_bw() +
  theme(axis.text.x=element_text(angle=45, hjust=1))

# 输出图像
ggsave(filename=outFile, plot=p1, width=9, height=5, device="pdf")

  • 载入库ggplot2 用于绘图,reshape2 用于数据重塑。

  • 读取数据:使用read.tableinput.txt读取数据,其中包含表头,字段间以制表符分隔。将第一列作为行名,且保留原有列名(除第一列外,该列被重命名为"Type")。

  • 差异分析:通过sapply函数对除“Type”列外的每一列(即每个基因)进行统计测试。根据“Type”分类,使用Kruskal-Wallis或Wilcoxon秩和检验来判断表达量差异的显著性。

    • 如果“Type”变量有超过两个水平,则使用Kruskal-Wallis检验。
    • 如果只有两个水平,则使用Wilcoxon秩和检验。
  • 显著性标记:根据p值添加显著性标记(***, **, *, "")。

  • 更新列名:将显著性标记添加到相应基因的列名中。

  • 重塑数据:使用melt函数将数据从宽格式转换为长格式,以便于ggplot2绘图。在此过程中,保留“Type”作为分类变量,其他列(基因及其显著性标记)转换为变量名和值。

  • 构建图层

    • geom_violin:绘制小提琴图,显示数据分布。
    • geom_boxplot:在小提琴图中间叠加一个窄宽度的箱线图,用于显示中位数和四分位数。
  • 分面展示facet_wrap按基因分面显示,每行显示一个基因。

  • 调整图形外观:设置主题(theme_bw())和调整x轴文本角度(以便更好地显示长标签)。

  • 保存为PDF文件ggsave函数直接保存绘制的图形为PDF格式,指定文件名、尺寸等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容