R语言||rstatix包和ggpubr包复现标注统计检验显著性的各种花样的图形

同名公主号:BBio

rstatix包支持管道符,与tidyverse包设计理念相一致,用于执行基本的统计检验,包括t检验、Wilcoxon检验、ANOVA、Kruskal-Wallis和相关性分析。

ggpubr包提供了一些易于使用的函数,基于ggplot2,可绘制用于文章发表的各种图形。当然,ggpubr也提供了一些统计函数,但是rstatix在统计方面更加丰富。

如何使用两者绘制出下面好看的图形呢?以单细胞数据为例。

//细胞比例组间差异
  1. 生成测试数据
library(Seurat)
library(tidyverse)
library(rstatix)
library(ggpubr)
library(ggplot2)

#生成测试数据
pbmc <- pbmc_small
func <- function(x)str_c('S', x%%12+1)
sample <- pbmc[['groups']] %>% add_column(order=1:dim(pbmc)[2]) %>% mutate(remainder=func(order)) %>% pull(remainder)
df <- table(Idents(pbmc), sample) %>% 
    prop.table(2) %>% 
    as.data.frame.array() %>% 
    rownames_to_column("cluster") %>% 
    pivot_longer(unique(sample), names_to="sample", values_to="percent") %>% 
    left_join(data.frame(sample=str_c("S", 1:12), group=rep(c("G1", "G2"), each = 6)))
df
# A tibble: 18 × 4
#   cluster sample percent group
#   <chr>   <chr>    <dbl> <chr>
# 1 0       S2       0.571 G1
# 2 0       S3       0.429 G1
# 3 0       S4       0.385 G2
# 4 0       S5       0.385 G2
# 5 0       S6       0.462 G2
# 6 0       S1       0.462 G1
# 7 1       S2       0.214 G1
# 8 1       S3       0.357 G1
# 9 1       S4       0.385 G2
#10 1       S5       0.385 G2
#11 1       S6       0.231 G2
#12 1       S1       0.308 G1
#13 2       S2       0.214 G1
#14 2       S3       0.214 G1
#15 2       S4       0.231 G2
#16 2       S5       0.231 G2
#17 2       S6       0.308 G2
#18 2       S1       0.231 G1
  1. 细胞比例组间差异柱状图
#只画cluster 2
data <- df[df$cluster==2, ]
comparisons <- list(c("G1", "G2"))
ggbarplot(data, x = "group", y = "percent", 
          color = "group", 
          palette = c("#00AFBB", "#E7B800"), 
          width = 0.2, 
          x.text.angle = 90, 
          add=c('mean_se')) + 
    labs(x=NULL) + theme(legend.position="none", panel.border=element_rect(color='black', fill=NA, size=0.7, linetype="solid")) + 
    stat_compare_means(comparisons = comparisons, method = 't.test', label = 'p.signif')
image-20220927212134435.png
  1. 细胞比例组间差异箱线图
#只画cluster2
data <- df[df$cluster==2, ]
comparisons <- list(c("G1", "G2"))
p1 <- ggboxplot(data, x = "group", y = "percent", 
          color = "group", 
          palette =c("#00AFBB", "#E7B800"),
          add = "jitter", shape = "group") + 
    labs(x=NULL) + theme(legend.position="none", panel.border=element_rect(color='black', fill=NA, size=0.7, linetype="solid")) + 
    stat_compare_means(comparisons = comparisons, method = 't.test', label = 'p.signif', size=4)

#画所有cluster
p2 <- ggboxplot(df, x = "group", y = "percent", 
          color = "group", 
          facet.by = "cluster", 
          palette =c("#00AFBB", "#E7B800"),
          add = "jitter", shape = "group") + 
    labs(x=NULL) + theme(legend.position="none", panel.border=element_rect(color='black', fill=NA, size=0.7, linetype="solid")) + 
    stat_compare_means(comparisons = comparisons, method = 't.test', label = 'p.signif', size=4)
p1 + p2
image-20220927213718138.png
#以上图形,很坐标都是组别,ggpubr中的stat_compare_means可以直接画图。但是如果横坐标是cluster呢?
stat.test <- df %>%
  group_by(cluster) %>%
  t_test(percent ~ group) %>%
  adjust_pvalue(method = "bonferroni") %>%
  add_significance("p")

stat.test <- stat.test %>%
  add_xy_position(x = "cluster", dodge = 0.8)
# A tibble: 3 × 16
#  cluster .y.     group1 group2    n1    n2 statistic    df      p  p.adj
#  <chr>   <chr>   <chr>  <chr>  <int> <int>     <dbl> <dbl>  <dbl>  <dbl>
#1 0       percent G1     G2         6     6     2.03   9.72 0.0706 0.212
#2 1       percent G1     G2         6     6    -2.52   9.02 0.0326 0.0978
#3 2       percent G1     G2         6     6     0.210  9.04 0.838  1
#  p.signif y.position groups           x  xmin  xmax
#  <chr>             <dbl> <named list> <dbl> <dbl> <dbl>
#1 ns                0.707 <chr [2]>        1   0.8   1.2
#2 ns                0.540 <chr [2]>        2   1.8   2.2
#3 ns                0.469 <chr [2]>        3   2.8   3.2

p3 <- ggboxplot(df, x = "cluster", y = "percent", 
          color = "group",  
          palette =c("#00AFBB", "#E7B800", "#FC4E07"),
          add = "jitter", shape = "group") + 
    labs(x=NULL) + theme(legend.position="none", panel.border=element_rect(color='black', fill=NA, size=0.7, linetype="solid"))
p4 <- p1 + stat_pvalue_manual(stat.test,  label = "p", tip.length = 0)
p5 <- p1 + stat_pvalue_manual(stat.test,  label = "p.signif", tip.length = 0)
p4 + p5
image-20220927222432462.png
//组间基因表达差异
  1. 生成测试数据
library(Seurat)
library(tidyverse)
library(rstatix)
library(ggpubr)
library(ggplot2)

#生成测试数据,添加一个分组
pbmc <- pbmc_small
g3_cells <- sample(colnames(pbmc), 27)
pbmc[['groups']][g3_cells, ] <- "g3"
unique(pbmc$groups)
  1. 组间基因差异表达小提琴图
#绘制组间所有细胞中基因表达差异
data <- pbmc
Idents(data) <- data$groups
levels(data) <- c('g1', 'g2', 'g3')
comparisons <- list(c("g2", "g3"))
p <- VlnPlot(data, features='LYZ', cols=c("#00AFBB", "#E7B800", "#FC4E07")) + 
    theme(legend.position="none", panel.border=element_rect(color='black', fill=NA, size=0.7, linetype="solid"), axis.text.x=element_text(angle=0, hjust=0.5)) + 
    labs(x=NULL)
p6 <- p + stat_compare_means(comparisons = comparisons, method = 't.test', label = 'p.signif', size=8) + lims(y=c(0, 9))
comparisons <- list(c("g2", "g3"), c('g1', 'g2'), c('g1', 'g3'))
p7 <- p + stat_compare_means(comparisons = comparisons, method = 't.test', label = 'p.signif', size=8) + lims(y=c(0, 11))
p6 + p7
png('test.png', height=200, width=360)
print(p)
dev.off()
image-20220928204123772.png
#如果横坐标是细胞类型呢?
data <- pbmc
data$groups <- factor(data$groups, levels=c('g1', 'g2', 'g3'))
comparisons <- list(c("g2", "g3"), c('g1', 'g3'))

p <- VlnPlot(data, features='LYZ', cols=c("#00AFBB", "#E7B800", "#FC4E07"), split.by='groups') + 
    theme(legend.position="none", panel.border=element_rect(color='black', fill=NA, size=0.7, linetype="solid"), axis.text.x=element_text(angle=0, hjust=0.5)) + 
    labs(x=NULL)

#执行统计检验
df <- p$data
head(df)
#                        LYZ ident split
#ATGCCAGAACGACT 4.968834e+00     0    g3
#CATGGCCTGTGCAT 4.776148e+00     0    g3
#GAACCTGATGAACC 4.753098e+00     0    g2
#TGACTGGATTCTCA 6.328626e-06     0    g2
#AGTCAGACTGCACA 4.042683e-06     0    g2
#TCTGATACACGTGT 4.968820e+00     0    g3

stat.test <- df %>%
  group_by(ident) %>%
  t_test(LYZ ~ split, comparisons = comparisons) %>%
  adjust_pvalue(method = "bonferroni") %>%
  add_significance("p")

stat.test <- stat.test %>%
  add_xy_position(x = "ident", dodge = 0.8)
print(stat.test, width=Inf)

p8 <- p + stat_pvalue_manual(stat.test, label = "p.signif", tip.length = 0, step.increase = 0)
p8
#Error in `check_aesthetics()`:
#! Aesthetics must be either length 1 or the same as the data (6): fill
#无解报错,不知所以,试着用ggplot2重画,还是同样报错,ggpubr中的ggviolin就不会报错

p <- ggviolin(df, x = "ident", y = "LYZ", fill = "split",
    palette = c("#00AFBB", "#E7B800", "#FC4E07"), 
    trim = TRUE) + 
    labs(x=NULL, fill=NULL)
p8 <- p + stat_pvalue_manual(stat.test, label = "{p} {p.signif}", tip.length = 0, step.increase = 0)
p8
image-20220928221841351.png

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

推荐阅读更多精彩内容