R绘图系列-带有significant信息的boxplot

这篇文章记录了使用R中的ggsignif包对boxplot两两样本之间添加显著性注释的过程;其实这个包可以两两对比的使用ggplot2画图的都可以添加,对任何可以两两对比的、使用ggplot2画图的都可以添加

背景

boxplot既可以很好地显示某个属性内部样本点的变化,也可以与其他属性进行对比,所以使用非常广泛。但是有时候我们需要对属性之间的样本点变化有个准确的度量,也就是比较两个样本是不是存在显著性地差异,这个时候就需要在原始的boxplot上加上样本之间假设检验的显著性信息。


ggsignif

R中的ggsignif就是专门解决前面遇到问题的包,其他包如ggpubr也可以达到类似的目的,这里主要学习ggsignif,因为其是基于ggplot2的语法,相当于是ggplot2的一个拓展,这也就意味着其不仅可以对boxplot添加显著性,对于任何可以两两对比的使用ggplot2画图的都可以添加,很是方便;同时对熟悉ggplot2的人来说也比较容易上手。下面来简单介绍其使用。

安装

1
2
3
4
5
# 安装
install.packages("ggsignif")
# 导入包
library(ggplot2)
library(ggsignif)

不带分组因素

简单绘制

1
2
3
4
ggplot(iris, aes(x=Species, y=Sepal.Length)) + 
geom_boxplot() +
geom_signif(comparisons = list(c("versicolor", "virginica")),
map_signif_level=TRUE)

boxplot_with_sign.png

注意默认的检验的两个样本的非参检验(不需要样本符合正太分布)‘Mann-Whitney’ test.(wilcox.test)


自定义绘制

1
2
3
4
5
6
7
8
9
10
11
12
# 两两比较的列表
compaired <- list(c("versicolor", "virginica"),
c("versicolor","setosa"),
c("virginica","setosa"))
# 使用t.test代替默认的wilcox.test
ggplot(iris, aes(Species, Sepal.Width, fill = Species)) +
geom_boxplot() +
ylim(1.5, 6.5) +
geom_signif(comparisons = compaired,
step_increase = 0.3,
map_signif_level = F,
test = t.test)
  • step_increase:调整每个显著性标记之间的间隔。
  • test:指定要使用的检验类型,默认是wilcox.test
  • map_signif_level:是显示具体pvalue还是显示符号c("***"=0.001,"**"=0.01, "*"=0.05),可以自行指定符号。

boxplot_with_sign_2.png

1
2
3
4
5
6
7
8
ggplot(iris, aes(Species, Sepal.Width, fill = Species)) +
geom_boxplot() +
ylim(1.5, 6.5) +
geom_signif(comparisons = compaired,
map_signif_level = F,
y_position=c(4,5,6),
tip_length = c(0),
test = t.test)
  • y_position:指定显著性标记的高度,如y_position=c(4,5,6)
  • tip_length:设置横线两端向下生出的长度,如 tip_length = c(0)

boxplot_with_sign_3.png

其他常用参数:

  • annotations:character vector with alternative annotations, if not null test is ignored

带分组条件

简单情况

1
2
3
4
5
6
7
8
9
10
11
# 自定义t检验
# 得到P-value
anno <- t.test(iris[iris$Petal.Width > 1 & iris$Species == "versicolor", "Sepal.Width"],
iris[iris$Species == "virginica", "Sepal.Width"])$p.value

# 将得到的Pvalue加在图形上
ggplot(iris, aes(x=Species, y=Sepal.Width, fill=Petal.Width > 1)) +
geom_boxplot(position="dodge") +
geom_signif(annotation=formatC(anno, digits=1),
y_position=4.05, xmin=2.2, xmax=3,
tip_length = c(0.2, 0.04))

boxplot_with_sign_4.png


分面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 查看数据的基本情况
mpg
# A tibble: 234 x 11
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact
2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact
3 audi a4 2 2008 4 manual(m6) f 20 31 p compact

# 先将trans列以(进行分割,分别得到type、variant列
mpg <- mpg %>%
separate(trans, c("type", "variant"), sep="\\(")

# 对修改之后的mpg进行绘图
ggplot(mpg, aes(type, hwy)) +
geom_boxplot() +
geom_signif(data=data.frame(class=c("2seater", "midsize"), type=0, hwy=0, group=1)
, aes(group=group),
annotations="abc", y_position = 46, xmin=1, xmax=2)+
geom_signif(data=data.frame(class=c("minivan"), type=0, hwy=0, group=1),
aes(group=group),
annotations="123", y_position = 46, xmin=1, xmax=2)+
facet_grid(.~class)

# 其中在geom_signif里面的data是
data.frame(class=c("2seater", "midsize"), type=0, hwy=0, group=1)
class type hwy group
1 2seater 0 0 1
2 midsize 0 0 1

boxplot_with_sign_5.png


分面内批量注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 查看数据
diamonds
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31

# 生成注释数据
annotation_df <- cross_df(list(clarity = unique(diamonds$clarity), cut = unique(diamonds$cut))) %>%
mutate(xmin = factor("Fair", levels = levels(cut)),
annotations = apply(combn(letters, 2), 2, paste0, collapse = "")[1:n()]) %>%
filter(cut != xmin) %>%
group_by(clarity) %>%
arrange(cut) %>%
mutate(y_position = 8000 + 2000 * row_number())
# 注释数据信息
annotation_df
# A tibble: 32 x 5
# Groups: clarity [8]
clarity cut xmin annotations y_position
<fct> <fct> <fct> <chr> <dbl>
1 SI2 Good Fair ar 10000
2 SI1 Good Fair as 10000
3 VS1 Good Fair at 10000
4 VS2 Good Fair au 10000
5 VVS2 Good Fair av 10000
6 VVS1 Good Fair aw 10000
7 I1 Good Fair ax 10000
8 IF Good Fair ay 10000
9 SI2 Very Good Fair az 12000
...

# 批量添加error bar
highsd = function(x) {
return(mean(x, na.rm = T) + sd(x))
}

# 批量画图
ggplot(data = diamonds, aes(x = cut, y = price)) +
stat_summary(fun.y = mean, fun.ymin = mean, fun.ymax = highsd,
width = 0.8, geom = "errorbar",
position = position_dodge(width = 0.9), colour = "black", size = 0.3) +
stat_summary(geom = "bar", fun.y = mean, aes(fill = cut),
width = 0.8, colour = "black",
position = position_dodge(width = 0.9), size = 0.4, show.legend = F) +
geom_signif(data = annotation_df,
aes(annotations = annotations, xmin = xmin, xmax = cut, y_position = y_position),
manual = TRUE) +
facet_wrap(~clarity, scales = "free") +
ylim(NA, 17000)

boxplot_with_sign_6.png


参考链接



-----本文结束感谢您的阅读-----

本文标题:R绘图系列-带有significant信息的boxplot

文章作者:showteeth

发布时间:2019年10月21日 - 14:18

最后更新:2019年11月23日 - 10:56

原始链接:http://showteeth.tech/posts/40911.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%