美文网首页RGEO数据挖掘基因注释/富集分析与功能分类
[R] 如何绘制各样本的pathway丰度热图?

[R] 如何绘制各样本的pathway丰度热图?

作者: 生物信息与育种 | 来源:发表于2019-10-14 16:23 被阅读0次

    前言

    一般而言,我们做完pathway富集分析后,会做下气泡图或bar图来进行展示,这样实际上只考虑了富集因子和Pvalue。如果我们不关注这两个因素,而是在乎样本本身的pathway丰度呢?

    对于KEGG热图绘制,大部分是做到KO层级,因为基因/蛋白和KO的绝大部分都是一对一的对应关系,十分方便地得到想要的结果。如果一定要做Pathway的丰度热图呢?一般的方法是将该通路中的基因/蛋白的丰度进行累加来表示该pathway的丰度。

    好了,现在我们来计算并绘制热图吧。

    数据处理

    得到pathway富集分析结果文件一般是这样的:


    image.png

    Proteins字段中的基因/蛋白是用分号隔开的。

    > colnames(path)
    [1] "X.Pathway"       "Sample1..1113."  "Sample2..15327." "Pvalue"          "Pathway.ID"      "Level1"         
    [7] "Level2"          "Proteins"        "KOs"  
    

    除此之外,我们还需要一个基因表达矩阵:


    image.png

    这个数据有四组样本,每组3个重复,共12个样本。

    我们的目标就是整理成这样的table,用来绘制热图:


    image.png

    从两个表可知,数据处理关键就是pathway中的蛋白丰度求和。把pathway中对应的各蛋白展开,再匹配到表达矩阵上,最后归并求和就好了,思路清晰了就动手吧。

    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)
    

    处理后得到的结果是这样的:


    image.png

    Proteins列中的蛋白都一一和Pathway对应起来,后面就好办了,直接贴代码:

    #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)
    

    现在已经得到想要的数据了。


    image.png

    绘图

    这个就不用多解释了。

    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))
    

    图片大概成这样:


    image.png

    根据自己需要挑选一些pathway展示吧,太多不好看。

    Ref: https://stackoverflow.com/questions/28719088/r-semicolon-delimited-a-column-into-rows

    相关文章

      网友评论

        本文标题:[R] 如何绘制各样本的pathway丰度热图?

        本文链接:https://www.haomeiwen.com/subject/fjvrmctx.html