一、基础知识
箱式图用于多组数据平均水平和变异程度的直观分析比较。每一组数据均可呈现其最小值(Minimum)、Qlow、Median、Qup、最大值(Maximum),Median表示中位数所在的位置,最小值、最大值形成的间距和QL、QU形成的间距都可以反应数据的变异程度。
箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。《贾俊平、何晓群、金勇.统计学(第四版):中国人民大学出版社,2009年:66-67》
![](https://img.haomeiwen.com/i11927876/851aeaa5519aa82c.png)
为了作图和理解ggplot2中的术语,对应的英文图如下:
![](https://img.haomeiwen.com/i11927876/1e057fa6d3374b8a.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作图
![](https://img.haomeiwen.com/i11927876/ec4bceaff7921390.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()
得到图如下:
![](https://img.haomeiwen.com/i11927876/4c62f5af336a3974.png)
图就做好了,跟文章的图差别不大。但是,上图没有类似误差线的横线,而发表的文章中基本上都会。接下来我们处理这个问题。
在ggplot()后面添加一行
stat_boxplot(geom ='errorbar', width = 0.4)
就可以了。
![](https://img.haomeiwen.com/i11927876/8875ee6542e7ba8c.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/
网友评论