需求
最近做个性化分析,突然发现一张能够很好反应差异富集的柱状图,如下图所示;
上图右侧表示上调代谢通路,左侧代表下调代谢通路,上下调分别有不同的颜色,中间灰色代表没有显著性的结果。
测试数据生成
生成的测试数据集来源网上,主要为x、y两个数据,以及后续对数据的处理。
library(ggplot2)#用于可视化
library(dplyr)#用于数据处理
set.seed(1111)#此命令保证数据结果可以重现在任何电脑上
x <- 1980+1:36#赋值x
y <- round(100*rnorm(36))#赋值y
mydata <- data.frame(x=x, y=y)#创建数据集mydata
head(mydata)
mydata <- mydata%>%mutate(x_t=ifelse(y>=0,-4*nchar(x), 4*nchar(x))) #生成label的坐标
head(mydata)
测试数据集处理
由于需要将y值的绝对值中间的为非显著性的条目,因此需要在矩阵中添加一列,这一列,上调为yes,下调的为no,不显著的为not significant。
max<-50
min<- -50
sig<-c()
for (i in mydata$y ){
print(i)
significant<-''
if(i>=max){significant<-'yes'}else if(i< 0 && abs(i) >= max ){significant<-'no'}else if(min
画图
画图命令如下:
mydata$x<-as.character(mydata$x) #将数字变量转换成字符串变量,防止画图自动排序
mydata<-mydata[order(mydata$y),]
mydata$significant<-sig
mydata$significant<-factor(mydata$significant,levels=c('yes','not significant','no'))#设置排序
mydata$x<-factor(mydata$x,levels=mydata$x)
ggplot(data=mydata, aes(x=x, y=y, fill=significant))+geom_bar(stat = "identity",position = "identity",width=0.9)+coord_flip()+scale_fill_manual(values = c("purple",'grey', "blue"), guide=FALSE)+xlab("Year")+geom_text(aes(y=x_t,label=x), vjust=0.3, color="black",size=3)+geom_abline(linetype="dashed",intercept = 50, slope = 0,size=1,colour='gray')+geom_abline(linetype="dashed",intercept = -50, slope = 0,size=1,colour='gray')+theme(panel.grid=element_blank(),panel.border=element_blank(),axis.title.y=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank())
设定不显著性的阈值为(-50,50),阈值有虚线表示,此图颜色与最开始需求图颜色不一致,这个可以修改,不在这里详述了
修改
后记
修改颜色:
ggplot(data=mydata, aes(x=x, y=y, fill=significant))+geom_bar(stat = "identity",position = "identity",width=0.9)+coord_flip()+scale_fill_manual(values = c("#1C86EE",'grey', "#90EE90"), guide=FALSE)+xlab("Year")+geom_text(aes(y=x_t,label=x), vjust=0.3, color="black",size=3)+geom_abline(linetype="dashed",intercept = 50, slope = 0,size=1,colour='gray')+geom_abline(linetype="dashed",intercept = -50, slope = 0,size=1,colour='gray')+theme(panel.grid=element_blank(),panel.border=element_blank(),axis.title.y=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank())