前言
通常而言,咱們作完pathway富集分析,就作下氣泡圖或bar圖來進行展現,但它們實際上只考慮了富集因子和Pvalue。若是咱們不關注這兩個因素,而是在意樣本自己的pathway丰度呢?app
對於KEGG熱圖繪製,大部分是作到KO層級,由於基因/蛋白和KO的絕大部分都是一對一的對應關係。若是必定要作Pathway的丰度熱圖呢?通常的方法是將該通路中的基因/蛋白的丰度進行累加來表示該pathway的丰度。函數
好了,如今咱們來計算並繪製熱圖吧。url
數據處理
獲得pathway富集分析結果文件通常是這樣的: Proteins字段中的基因/蛋白是用分號隔開的。spa
> colnames(path) [1] "X.Pathway" "Sample1..1113." "Sample2..15327." "Pvalue" "Pathway.ID" "Level1" [7] "Level2" "Proteins" "KOs"
除此以外,咱們還須要一個基因表達矩陣: 四組樣本,每組3個重複,共12個。.net
咱們的目標就是整理成這樣的table,用來繪製熱圖: 從兩個表可知,數據處理關鍵就是pathway中的蛋白丰度求和。把pathway中對應的各蛋白展開,再匹配到表達矩陣上,最後歸併求和就行了,思路清晰了就動手吧。3d
library(tidyverse) path2 <- path %>% dplyr::select(X.Pathway,Level1,Level2,Proteins) #下面這一步最關鍵,dplyr中爲咱們提供了一個有用的函數unnest path3 <- path2 %>% mutate(ProteinID = strsplit(Proteins, ";")) %>% unnest() colnames(path3)[1] <- "Pathway" #若是不熟悉,這一步也可用Map函數配合do.call來完成: out <- do.call(rbind, Map(cbind, path2$X.Pathway,path2$Level1,path2$Level2,strsplit(path2$Proteins, ";"))) out <- as.data.frame(out) colnames(out) <- colnames(path2)
獲得的結果是這樣的: code
Proteins列中的蛋白都一一和Pathway對應起來了。後面就好辦了,直接貼代碼:blog
#sum scale ibaq2 <- sweep(ibaq,2,apply(ibaq, 2, sum),FUN = "/") #caculate each group mean value group <- factor(rep(c("S01CC","S11SC","S12CC","S12SC"),each=3),levels = c("S11SC","S12SC","S12CC","S01CC")) out <- apply(ibaq2,1,function(x){ dat <- data.frame(group=group,value=x) dat_mean <- dat %>% group_by(group) %>% summarise(mean=mean(value)) %>% select(mean) }) #注意此處計算均值未用na.rm參數 out[[1]] out2 <- as.data.frame(t(do.call(cbind,out))) colnames(out2) <- levels(group) rownames(out2) <- rownames(ibaq2) exp <- data.frame(ProteinID=rownames(out2),out2) data1 <- left_join(path3,exp,by="ProteinID") %>% dplyr::select(1:3,6:9) %>% gather(Sample,Abundance,-c(Pathway,Level1,Level2)) %>% group_by(Pathway,Sample) %>% summarise(Sum=sum(Abundance)) %>% spread(Sample,Sum) tmp <- path3[1:3] annotation <- tmp[!duplicated(tmp),] length(intersect(data1$Pathway,annotation$Pathway)) #先按pathway排序,再按level2,level1排序 plotdat <- left_join(annotation,data1,by="Pathway") %>% arrange(Pathway) %>% arrange(Level2) %>% arrange(Level1)
如今已經獲得想要的數據了。 排序
繪圖
這個就不用多解釋了。圖片
library(pheatmap) Exp_log2=plotdat #實際上我中間處理了別的,這裏便於繪圖直接賦值 colnames(Exp_log2) exp_plot <- select(Exp_log2,S11SC,S12SC,S12CC,S01CC) rownames(exp_plot) <- Exp_log2$Pathway annotation_row <- select(Exp_log2,Level2,Level1) rownames(annotation_row) <- Exp_log2$Pathway pheatmap(exp_plot,cluster_rows = F,cluster_cols = F,scale = "row", annotation_row = annotation_row, border_color = NA, #angle_col=45, color = colorRampPalette(c("blue","white","red"))(50))
圖片大概成這樣: 根據須要挑選一些pathway展現吧,太多很差看。
Ref: https://stackoverflow.com/questions/28719088/r-semicolon-delimited-a-column-into-rows