單組火山圖和多組火山圖展示差異表達基因(DEGs) 2023-10-12

前言

在各種RNA測序數(shù)據(jù)中剪廉,我們幾乎都避不開差異表達基因(DEGs)的分析员魏。我們可以用氣泡圖疮蹦,提琴圖和熱圖等展示不同細胞亞群或樣本的差異基因表達情況,而火山圖則是最直觀的表現(xiàn)形式之一塔鳍,因此本文將介紹畫火山圖的作圖。

單組火山圖
單組火山圖

這是比較常見的火山圖呻此,但只能展示兩組的差異基因轮纫。
函數(shù)示例:

deg_volcano_plot(all_markers,label='out',fc.filter=1.5,p.val=0.01, wt='avg_log2FC',gene.col='gene',lb.filter=2)

deg_volcano_plot函數(shù)的參數(shù):
all_markers 包含顯著性,差異倍數(shù)焚鲜,基因名的數(shù)據(jù)框掌唾,可由Seurat的FindAllmarkers或FindMarkers得到
label='out' ,輸出文件的前綴忿磅。
fc.filter=1.5 糯彬,展示的基因點FC閾值
p.val=0.01,顯著性閾值
wt='avg_log2FC' 葱她,差異倍數(shù)的列名
gene.col='gene'撩扒,基因名所在列名
lb.filter=2,標記基因名的FC閾值

library(dplyr)
library(ggplot2)
library(stringr)
library(data.table)
deg_volcano_plot <- function(all_markers,label='out',fc.filter=1.5,p.val=0.01, wt='avg_log2FC',gene.col='gene',lb.filter=2){
try({
  a <- all_markers
  a$gene <- a[,gene.col]
  a$logfc <- a[,wt]
  if (wt=='avg_log2FC'){
  a$FC<-2^a$logfc
  }else{
  a$FC<-exp(a$logfc)
  }
  a$log2FC <- log2(a$FC)
  a_h<-a[a$FC>=fc.filter & a$p_val_adj<=p.val,]
  a_l<-a[a$FC<1/fc.filter & a$p_val_adj<p.val,]

  gene_list <- c(a_h$gene, a_l$gene)
  a_all<-rbind(a_h,a_l)
  pos<- a$gene %in% a_all$gene
  a_no<-a[!pos,]
  try(a_h$type<-"Up")
  try(a_l$type<-"Down")
  try(a_no$type<-"None")
  a_all<-rbind(a_h,a_no,a_l)
  mat<-a_all
  ran<-runif(nrow(a_all),min = 25,max =50)
  ran<-100^-ran
  mat$p_val_adj<-mat$p_val_adj+ran
  cdn <- which(mat$gene %in% gene_list)
  mat1 <- mat[cdn,]
pdf(paste0(label,"_vocalno_plot_",".pdf"),12,12)
  p1<-ggplot(mat,aes(log2(FC),-1*log10(p_val_adj)))+
            geom_point(aes(color =type))+
            geom_text_repel(data=subset(mat1, abs(mat1$log2FC) >=log2(lb.filter)),aes(x=log2(FC),y=-log10(p_val_adj),label=gene),size=5,point.padding = 0.5)+
            scale_color_manual(values=c('#377EB8',"lightgrey",'#E41A1C'))+
            theme(panel.background =element_blank(),axis.line=element_line(colour="black"))

  p1<-p1+theme(legend.title=element_blank(),legend.background = element_blank(),legend.key = element_blank(), legend.text = element_text(size=20), legend.position="NA")
  p1<-p1+theme_bw()+theme(axis.text = element_text(size = 20))
  p1<-p1+geom_vline(xintercept=c(-1,1),lty=3,col="black",lwd=0.8)+geom_hline(yintercept = -log10(0.01),lty=3,col="black",lwd=0.8)
  p1<-p1+ggtitle(label)+theme(plot.title = element_text(hjust = 0.5,size=30,face="bold"))+theme(axis.title =element_text(size=20))
  print(p1)
dev.off()
})
}

多組火山圖

多組火山圖

相比于前者可以展示多組的差異基因吨些,plot_mutideg函數(shù)理論上也能畫單組火山圖搓谆。
函數(shù)使用示例:

plot_mutideg(df,incluster='cluster',infc='avg_log2FC',ingene='gene',pos=TRUE,prefix='out',mycol <- c("#E64B357F","#4DBBD57F","#00A0877F","#3C54887F","#F39B7F7F","#8491B47F","#91D1C27F","#DC00007F","#7E61487F"))

plot_mutideg函數(shù)的參數(shù):
df 包含顯著性,差異倍數(shù)豪墅,基因名的數(shù)據(jù)框泉手,可由Seurat的FindAllmarkers得到
incluster,默認為cluster偶器,分組的列名
infc斩萌,默認為avg_log2FC啡氢,差異倍數(shù)所在列名
ingene,默認為gene术裸,基因名所在列名倘是,
pos,默認為TRUE袭艺,是否只展示上調基因搀崭,
prefix='out',輸出文件的前綴
mycol猾编,默認為NULL瘤睹,調色板,顏色數(shù)目需多于分組的數(shù)目答倡。

library(ggplot2)
library(tidyverse)
library(ggrepel)
plot_mutideg <- function(df,incluster='cluster',infc='avg_log2FC',ingene='gene',pos=TRUE,prefix='out',
                         mycol=NULL){
df$cluster=unlist(df[incluster])
df$avg_log2FC=unlist(df[infc])
df$gene=unlist(df[ingene])
df$label <- ifelse(df$p_val_adj<0.01,"adjust P-val<0.01","adjust P-val>=0.01")
top10sig <- df %>% group_by(cluster) %>% top_n(10,wt=avg_log2FC)
df$size <- case_when(!(df$gene %in% top10sig$gene)~ 1,
                     df$gene %in% top10sig$gene ~ 2)
dt <- filter(df,size==1)

b1 <- top10sig %>% group_by(cluster) %>% summarize(bar = max(avg_log2FC,na.rm = T))
b2 <- top10sig %>% group_by(cluster) %>% summarize(bar = min(avg_log2FC,na.rm = T))

lsed= c(1:length(unique(df$cluster)))-1
dfbar<-data.frame(x=lsed,
                  y=b1$bar)
dfbar1<-data.frame(x=lsed,
                   y=b2$bar)
iny=0
if (pos){
p1 <- ggplot()+
geom_col(data = dfbar,
         mapping = aes(x = x,y = y),
         fill = "#dcdcdc",alpha = 0.6)
iny=-0.5
}else{
p1 <- ggplot()+
geom_col(data = dfbar,
         mapping = aes(x = x,y = y),
         fill = "#dcdcdc",alpha = 0.6)+
geom_col(data = dfbar1,
         mapping = aes(x = x,y = y),
         fill = "#dcdcdc",alpha = 0.6)
}

p2 <- p1+
geom_jitter(data = dt,
            aes(x = cluster, y = avg_log2FC, color = label),
            size = 0.85,
            width =0.4)+
geom_jitter(data = data.frame(top10sig),
            aes(x = cluster, y = avg_log2FC, color = label),
            size = 1,
            width =0.4,
            shape=17)

dfcol<-data.frame(x=lsed,
                  y=iny,
                  label=unique(df$cluster))
p3 <- p2 + geom_tile(data = dfcol,
                     aes(x=x,y=y),
                     height=0.4,
                     color = "black",
                     fill = mycol,
                     alpha = 0.6,
                     show.legend = F)

p4 <- p3+
geom_text_repel(
                data=top10sig,
                aes(x=cluster,y=avg_log2FC, label=gene),
                force = 1.2,
                arrow = arrow(length = unit(0.008, "npc"),
                              type = "open", ends = "last")
                )

p5 <- p4 +
scale_color_manual(name=NULL,
                   values = c("red","black"))

p6 <- p5+
labs(x="Cluster",y="average logFC")+
geom_text(data=dfcol,
          aes(x=x,y=y,label=label),
          size =6,
          color ="white")
p7 <- p6+
theme_minimal()+
theme(
      axis.title = element_text(size = 13,
                                color = "black",
                                face = "bold"),
      axis.line.y = element_line(color = "black",
                                 size = 1.2),
      axis.line.x = element_blank(),
      axis.text.x = element_blank(),
      panel.grid = element_blank(),
      legend.position = "top",
      legend.direction = "vertical",
      legend.justification = c(1,0),
      legend.text = element_text(size = 15)
      )

pdf(paste(prefix,'_multideg.pdf'),18,10)
print(p7)
dev.off()
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轰传,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘪撇,更是在濱河造成了極大的恐慌获茬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倔既,死亡現(xiàn)場離奇詭異恕曲,居然都是意外死亡,警方通過查閱死者的電腦和手機渤涌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門佩谣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人实蓬,你說我怎么就攤上這事茸俭。” “怎么了安皱?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵调鬓,是天一觀的道長。 經(jīng)常有香客問我练俐,道長袖迎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任腺晾,我火速辦了婚禮燕锥,結果婚禮上,老公的妹妹穿的比我還像新娘悯蝉。我一直安慰自己归形,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布鼻由。 她就那樣靜靜地躺著暇榴,像睡著了一般厚棵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔼紧,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天婆硬,我揣著相機與錄音,去河邊找鬼奸例。 笑死彬犯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的查吊。 我是一名探鬼主播谐区,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逻卖!你這毒婦竟也來了宋列?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤评也,失蹤者是張志新(化名)和其女友劉穎炼杖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仇参,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡嘹叫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诈乒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡婆芦,死狀恐怖怕磨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情消约,我是刑警寧澤肠鲫,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站或粮,受9級特大地震影響导饲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜氯材,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一渣锦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氢哮,春花似錦袋毙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胀溺。三九已至,卻和暖如春皆看,著一層夾襖步出監(jiān)牢的瞬間仓坞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工腰吟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扯躺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓蝎困,卻偏偏與公主長得像录语,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子禾乘,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容