24种R语言新手入门之箱线图(二)

编程/开发
569
0
0
2023-04-19
标签   R语言

一、前言

箱线图一般用于可视化基因的表达情况,常化用统计学方法计算组间基因的表达差异情况。以下主要是用boxplot和geom_boxplot

二、初阶画图

2.1 基础语法

boxplot(x, data, notch, varwidth, names, main)
#x:向量或公式
#data:是数据帧
#notch:逻辑值。 设置为TRUE以绘制凹口
#varwidth:一个逻辑值。 设置为true以绘制与样本大小成比例的框的宽度
#names:将打印在每个箱线图下的组标签
#main:用于给图表标题

2.2 简单箱线图

#内置数据集
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
head(ToothGrowth)
p <- ggplot(ToothGrowth, 
            aes(x=dose, y=len)) + 
geom_boxplot()
p

img

#翻转横置
p + coord_flip()

img

#凹形箱线图
ggplot(ToothGrowth, 
       aes(x=dose, y=len)) + 
geom_boxplot(notch=TRUE)

img

#修改离群值、颜色、形状和大小
ggplot(ToothGrowth,
       aes(x=dose, y=len)) + 
geom_boxplot(outlier.colour="red", 
             outlier.shape=8,
             outlier.size=4)

img

2.3 带点箱线图

#初始箱线图
p <- ggplot(ToothGrowth, 
            aes(x=dose, y=len)) + 
geom_boxplot()
#显示每个值
p + geom_dotplot(binaxis='y', 
                 stackdir='center', 
                 dotsize=1)

img

#发散式散点
p + geom_jitter(shape=16, 
                position=position_jitter(0.2)) # 0.2:X方向上的发散程度

img

2.4 给线条“上色”

简单上色
#根据dose列分三色
p<-ggplot(ToothGrowth, 
          aes(x=dose, y=len, color=dose)) +
geom_boxplot()
p

img

自定义修改颜色 scale_color_manual() : 使用自定义颜色 scale_color_brewer() : 使用 RColorBrewer 包中的调色板 scale_color_grey() : 使用灰色调色板
#自定义调色板
p<-ggplot(ToothGrowth, 
          aes(x=dose, y=len, color=dose)) +
geom_boxplot()
p+scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9"))

img

#使用brewer调色板
p+scale_color_brewer(palette="Dark2")

img

2.5 填充“上色”

#使用单色
ggplot(ToothGrowth, aes(x=dose, y=len)) +
geom_boxplot(fill='#A4A4A4', color="black")+
theme_classic()

img

#分组上色
p<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
geom_boxplot()
p

img

修改颜色与上面改线条颜色同理,只不过变成了fill scale_fill_manual() : 使用自定义颜色 scale_fill_brewer() : 使用 RColorBrewer 包中的调色板 scale_fill_grey() : 使用灰色调色板
p<-ggplot(ToothGrowth, 
          aes(x=dose, y=len, color=dose)) +
geom_boxplot()
p+scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))

img

#使用brewer调色板
p+scale_fill_brewer(palette="Dark2")

img

#灰色调色板几乎不使用,不过代码如下大家可以自己运行
#使用黑白色线条
p<-ggplot(ToothGrowth, 
          aes(x=dose, y=len, color=dose)) +
geom_boxplot()
p + scale_color_grey() + theme_classic()
#使用黑白色填充
p<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
  geom_boxplot()
p + scale_fill_grey() + theme_classic()

2.6 修改图形顺序

p + scale_x_discrete(limits=c("2", "0.5", "1"))

img

三、进阶画图

3.1 排序箱线图

library(plyr)
library(ggpubr)

#读取文件
rt=read.table(inputFile, sep="\t", header=T, check.names=F)    
x=colnames(rt)[2]
y=colnames(rt)[3]
colnames(rt)=c("id","Type","expression")

#排序
med=ddply(rt,"Type",summarise,med=median(expression))
rt$Type=factor(rt$Type, levels=med[order(med[,"med"],decreasing = T),"Type"])

#绘制
col=rainbow(length(levels(factor(rt$Type))))
pdf(file=outFile, width=10, height=6) #输出图片文件
p=ggboxplot(rt, x="Type", y="expression", color = "Type",
            palette = col,
            ylab=y,
            xlab=x,
            #add = "jitter",    #绘制每个样品的散点
            legend = "right")
p+rotate_x_text(45) #倾斜角度
dev.off()
print(p+rotate_x_text(45))

img

3.2 差异箱线图

#读取文件
rt=read.table(inputFile,sep="\t",header=T,check.names=F)
x=colnames(rt)[2]
y=colnames(rt)[3]
colnames(rt)=c("id","Group","Expression")

#设置分组
group=levels(factor(rt$Group))
rt$Group=factor(rt$Group, levels=group)
comp=combn(group,2)
my_comparisons=list()
for(i in 1:ncol(comp)){my_comparisons[[i]]<-comp[,i]}

#绘制boxplot
pdf(file=outFile,width=5,height=4.5)
boxplot=ggboxplot(rt,
                  x="Group",
                  y="Expression",
                  color="Group",
                  xlab=x,
                  ylab="TP53 Expression",
                  legend.title=x,
                  palette = c(colornormal,colortumor),
                  add = "jitter")+ 
stat_compare_means(comparisons = my_comparisons,method = "wilcox.test") #默认是wilcox.test,可换成t.test,kruskal.test,anova,下面同理
print(boxplot)
dev.off()

img

3.3 多基因差异箱线图

#读取文件
rt=read.table(inputFile,sep="\t",header=T,check.names=F,row.names=1)
x=colnames(rt)[1]
colnames(rt)[1]="Type"

#整理表格
data=melt(rt,id.vars=c("Type"))
colnames(data)=c("Type","Gene","Expression")

#绘制
pdf(file=outFile, width=6, height=5)
p=ggboxplot(data, x="Gene", y="Expression", color = "Type", 
            ylab="Gene expression",
            xlab="",
            legend.title=x,
            palette = c(colornormal,colortumor),
            width=0.6, add = "none")
p=p+rotate_x_text(60)
#标显著星号
p1=p+stat_compare_means(aes(group=Type),
                        method="wilcox.test",
                        symnum.args=list(cutpoints = c(0, 0.001, 0.01, 0.05, 1), symbols = c("***", "**", "*", " ")),
                        label = "p.signif")
print(p1)
dev.off()

img

3.4 多组差异箱线图

#读取文件
rt=read.table(inputFile,sep="\t",header=T,check.names=F)
x=colnames(rt)[2]
y=colnames(rt)[3]
colnames(rt)=c("id","Type","Expression")

#设置分组
group=levels(factor(rt$Type))
rt$Type=factor(rt$Type, levels=group)
comp=combn(group,2)
my_comparisons=list()
for(i in 1:ncol(comp)){my_comparisons[[i]]<-comp[,i]}

#绘制
pdf(file=outFile, width=5.5, height=5)
boxplot=ggboxplot(rt, x="Type", y="Expression", color="Type",
                  xlab=x,
                  ylab=y,
                  legend.title=x,
                  add = "jitter")+ 
scale_colour_manual(values = c("#FED43999","#709AE199","#8A919799","#D2AF8199"))+
stat_compare_means(comparisons = my_comparisons)
print(boxplot)
dev.off()

img

3.5 多基因多组差异箱线图

#读取文件
rt=read.table(inputFile, header=T,sep="\t",check.names=F,row.names=1)
x=colnames(rt)[1]
colnames(rt)[1]="Type"

#差异分析
geneSig=c("")
for(gene in colnames(rt)[2:ncol(rt)]){
  rt1=rt[,c(gene,"Type")]
  colnames(rt1)=c("expression","Type")
  p=1
  if(length(levels(factor(rt1$Type)))>2){
    test=kruskal.test(expression ~ Type, data = rt1)
    p=test$p.value
  }else{
    test=wilcox.test(expression ~ Type, data = rt1)
    p=test$p.value
  }
  Sig=ifelse(p<0.001,"***",ifelse(p<0.01,"**",ifelse(p<0.05,"*","")))
  geneSig=c(geneSig,Sig)
}
colnames(rt)=paste0(colnames(rt),geneSig)

#整理表格
data=melt(rt,id.vars=c("Type"))
colnames(data)=c("Type","Gene","Expression")

#绘制
pdf(file=outFile, width=9, height=5)
p1=ggplot(data,aes(x=Type,y=Expression,fill=Type))+
  guides(fill=guide_legend(title=x))+
  labs(x = x, y = "Gene expression")+
  geom_boxplot()+
  facet_wrap(~Gene,nrow =1)+ 
  #theme_bw()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
p2=p1+scale_fill_manual(values=c("#FED43999","#709AE199","#8A919799","#D2AF8199"))
print(p2)
dev.off()

img

四、讨论

箱线图最主要的运用场景还是为了展示某个或者某几个变量的分布,如果讨论分组便介入t检验,非参数秩和检验等统计学方法计算其显著性。以上代码都是导入自己的文件可直接运行的。关注公主号生信初学者回复boxplot领取示例数据和代码