R语言作图实战——boxplot

阿里云双11来了!从本博客参与阿里云,服务器最低只要86元/年!

一、基础知识

箱式图用于多组数据平均水平和变异程度的直观分析比较。每一组数据均可呈现其最小值(Minimum)、Qlow、Median、Qup、最大值(Maximum),Median表示中位数所在的位置,最小值、最大值形成的间距和QL、QU形成的间距都可以反应数据的变异程度。

箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。《贾俊平、何晓群、金勇.统计学(第四版):中国人民大学出版社,2009年:66-67》


image.png

为了作图和理解ggplot2中的术语,对应的英文图如下:


image.png

median:中位数;
Q1: 下四分位数;
Q3:上四分位数;
IQR:四分位范围; = Q3 – Q1
Maximum = Q3 + 1.5 * IQR;
Minimum = Q1 – 1.5 * IQR;

在区间 Q3+1.5ΔQ,~Q1-1.5ΔQ 之外的值被视为应忽略(farout)。最大值与最小值产生于这个区间。区间外的值被视为outliers显示在图上。

二、ggplot2作图


image.png

这是nature文章上的一张图:doi:10.1038/nature11252。没有原始数据,我们就来模拟一份数据:

library(tidyverse)
#模拟数据
group <- rep(c('No', 'Broad', 'Focal'),each = 50)
set.seed(1)
No <- rnorm(50, mean = -3.2, sd = 1.1)
set.seed(2)
Broad <- rnorm(50, mean = -3.02, sd = 0.5)
set.seed(3)
Focal <- rnorm(50, mean = 2.45, sd = 0.8)
data <- data.frame(group, value = c(No, Broad, Focal))
data1 <- data.frame(group = c('No', 'No', 'No', 'Broad', 'Broad', 'Focal'), value = c(4, 1.8, -1.6, 4.2, 1.5, -3.2 ))#添加几个区间外的值
data <- rbind(data, data1)
data$group<-factor(data$group,levels=c('No', 'Broad', 'Focal'),ordered = TRUE)#按照上图的顺序排列
#绘图
y <- ggplot(data=data,mapping = aes(x=group, y=value, color = group))+
  geom_boxplot(fill ='white', color = "darkgrey", size=0.5, width = 0.5,outlier.shape = NA )+
  geom_jitter(color = "darkblue", shape = 4, size = 1,  width = 0.05)+
  labs(
    x = "",
    y = "mRNA expression",
    title = 'IGF2'
  )+
  theme_bw()+
  theme(
    panel.grid.major=element_blank(),
    panel.grid.minor=element_blank(), #次级网格线), #网格线
    )
tiff("fig.tiff", res = 300, width = 700, height = 800)
y
dev.off()

得到图如下:


image.png

图就做好了,跟文章的图差别不大。但是,上图没有类似误差线的横线,而发表的文章中基本上都会。接下来我们处理这个问题。
在ggplot()后面添加一行

stat_boxplot(geom ='errorbar', width = 0.4)

就可以了。


image.png

完整代码:

y <- ggplot(data=data,mapping = aes(x=group, y=value))+
  stat_boxplot(geom ='errorbar', color = 'darkgrey', width = 0.4) +
  geom_boxplot(fill = "white", color = 'darkgrey', size=0.5, width = 0.8,outlier.shape = NA )+
  geom_jitter(color = "darkblue", shape = 4, size = 1,  width = 0.05)+
  labs(
    x = "",
    y = "mRNA expression",
    title = 'IGF2'
  )+
  theme_bw()+
  theme(
    panel.grid.major=element_blank(),
    panel.grid.minor=element_blank(), #次级网格线), #网格线
    )
tiff("fig.tiff", res = 300, width = 700, height = 800)
y
dev.off()

待完善的地方:IGF2文章中的图用的是斜体,不知道有没有办法改;如何让x坐标轴的No ampl.显示成两行。
横线的添加参考于:https://www.r-bloggers.com/exploring-ggplot2-boxplots-defining-limits-and-adjusting-style/

https://www.jianshu.com/p/10bfd84936ed

Python量化投资网携手4326手游为资深游戏玩家推荐:《《风之大陆》:坐骑图鉴丨时尚与科技感十足!大陆炫酷坐骑了解一下~

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论