Skip to content

温馨提示

该文档内容写于很早之前,大概2021年左右,这里发出来的原因是为了和最近学习的ggkegg包做一个对比。

KEGG PathView可视化说明

约 796 个字 56 行代码 预计阅读时间 3 分钟

pathview可视化KEGG通路的思路(从源码获取)

pathview包的主要思路依次是: mapper,downloader, parser,viewer,即:四部分功能:自动下载通路图表数据,解析并映射用户数据,最后把数据渲染到通路图上。

  1. 解析用户提供的基因名称,进行id的转化;
  2. 基于pathview:::download.kegg进行通路的下载,需要同时下载通路的xml和png文件,xml是png的图层的上的元素属性信息记录文件;示例如下:
    S
    librarg(pathview)
    pathview:::download.kegg(pathway.id = "00220", species = "hsa", kegg.dir = "./", file.type = c("xml","png"))
    
  3. 基于pathview:::parseKGML2Graph2函数或者KEGGgraph::parseKGML2Graph()[KEGGgraph::parseKGML2DataFrame()]解析通路的xml文件信息,获取通路中每一个元素(gene/enzyme/compound/ortholog)的位置、大小、性状、标签名称、颜色等信息;
  4. 当设置kegg.native=T时,启用keggview.native进行绘图,keggview.native函数的可视化思路是基于png包读取通路的png文件,然后基于上一步的元素属性信息,将需要标注颜色的元素进行修改,添加其他信息(eg:颜色图例等),然后进行png文件的保存,因此keggview.native只能保存为png格式,且最终保存的结果图片的拓扑结构(也可以理解为layout)与通路原始的png文件是一致的,这里注意对于same.layer参数的设置,主要用于控制添加的绘图层是否与原始的png图层的关系,same.layer=T时,在原始的通路图片上进行元素颜色等修改,否在将在新的图层上先进性元素标签的修改,例如将酶的名称按照对应关系修改为基因名称,再进行基因颜色的标注,最终将新的图层进行保存为png。
  5. 当设置kegg.native=F时,启用keggview.graph进行绘图,采取graphviz layout布局进行通路网络的可视化,最后将用户的数据进行映射渲染生成pdf文件,关于graphviz layout可以查阅https://graphviz.org/docs/layouts/

pathview可视化KEGG通路的拓展

  1. 如何定制KEGG pathway,例如想给某一个关键基因添加一个标识(比如蛋白-转录组联合分析时),例如红色的★,思路可以如下:

pathview:::parseKGML2Graph2获取通路的属性信息,拿到基因在图层上的坐标,然后使用png对通路的png文件进行读取的修改,例如添加文本信息可以使用text函数进行添加,可以参考:pathview:::keggview.native函数的实现过程,最后再把修改后的图层进行保存即可。 2. 如何更自由的可视化KEGG通路

主要思路是将通路中的节点互作信息/节点信息/边信息进行获取,然后基于ggraph/visNetwork等包进行可视化,也可以手动导入cytoscape进行自定义可视化,通路网络信息的获取示例代码如下:

S
library(KEGGgraph)
#解析或读取KGML文件(xml格式)
mapkG <- parseKGML2Graph("hsa00220.xml",expandGenes=TRUE, genesOnly = TRUE)

mapkNodes <- nodes(mapkG)
mapkEdges <- edges(mapkG)

#导出network数据
mapkEdges <- mapkEdges[sapply(mapkEdges, length) > 0]
ddd <- lapply(1:length(mapkEdges), function(t){
    name <- names(mapkEdges)[t]
    len  <- length(mapkEdges[[t]])
    do.call(rbind, lapply(1:len, function(n){
        c(name, mapkEdges[[t]][n])
    }))
})

res <- data.frame(do.call(rbind, ddd))

write.table(res,  "edges.txt", sep = "\t", row.names = F, col.names = F, quote = F)
write.table(mapkNodes, "nodes.txt", sep = "\t", row.names = F, col.names = F, quote = F)

####此外也可直接尝试KEGGgraph::parseKGML2DataFrame()
3. 关于KEGG可视化结果文件png/pdf的保存以及像素优化

主要实现基于png/grid/ggplotify等包具体实现代码如下:

S
  library(png)
  library(ggplotify)
  library(grid)

  img <- readPNG(img_file,native=TRUE)
  width <- ncol(img)
  height <- nrow(img)
  ###以下两行代码可以尝试增加图片像素,需要时可以去除注释进行执行
  # writePNG(image = img,dpi=1200,target = img_file)
  # img <- readPNG(img_file,native=TRUE)

  png2ggplot=function(grid=TRUE){
    ### method1
    if(exists("grid")&grid){
      grid.newpage()
      grid.raster(img)
    }
    ### method2
    if(exists("rasterImage")&!grid) {
      plot(0:2,0:2,type="n",ann=FALSE,axes=FALSE)
      rasterImage(img,0,0,2,2,interpolate = T)
    }
  }

  pp=as.ggplot(png2ggplot)
  png_file=img_file
  pdf_file=sub("png$","pdf",img_file)

  ggsave(png_file, plot = pp, limitsize = FALSE, width = width, height = height,dpi = 600,units = "px")
  ggsave(pdf_file, plot = pp, limitsize = FALSE, width = width, height = height,dpi = 600,units = "px")