温馨提示
该文档内容写于很早之前,大概2021年左右,这里发出来的原因是为了和最近学习的ggkegg
包做一个对比。
KEGG PathView可视化说明¶
约 796 个字 56 行代码 预计阅读时间 3 分钟
pathview可视化KEGG通路的思路(从源码获取)¶
pathview包的主要思路依次是: mapper,downloader, parser,viewer,即:四部分功能:自动下载通路图表数据,解析并映射用户数据,最后把数据渲染到通路图上。
- 解析用户提供的基因名称,进行id的转化;
- 基于pathview:::download.kegg进行通路的下载,需要同时下载通路的xml和png文件,xml是png的图层的上的元素属性信息记录文件;示例如下:
- 基于pathview:::parseKGML2Graph2函数或者KEGGgraph::parseKGML2Graph()[KEGGgraph::parseKGML2DataFrame()]解析通路的xml文件信息,获取通路中每一个元素(gene/enzyme/compound/ortholog)的位置、大小、性状、标签名称、颜色等信息;
- 当设置kegg.native=T时,启用keggview.native进行绘图,keggview.native函数的可视化思路是基于png包读取通路的png文件,然后基于上一步的元素属性信息,将需要标注颜色的元素进行修改,添加其他信息(eg:颜色图例等),然后进行png文件的保存,因此keggview.native只能保存为png格式,且最终保存的结果图片的拓扑结构(也可以理解为layout)与通路原始的png文件是一致的,这里注意对于same.layer参数的设置,主要用于控制添加的绘图层是否与原始的png图层的关系,same.layer=T时,在原始的通路图片上进行元素颜色等修改,否在将在新的图层上先进性元素标签的修改,例如将酶的名称按照对应关系修改为基因名称,再进行基因颜色的标注,最终将新的图层进行保存为png。
- 当设置kegg.native=F时,启用keggview.graph进行绘图,采取graphviz layout布局进行通路网络的可视化,最后将用户的数据进行映射渲染生成pdf文件,关于graphviz layout可以查阅https://graphviz.org/docs/layouts/。
pathview可视化KEGG通路的拓展¶
- 如何定制KEGG pathway,例如想给某一个关键基因添加一个标识(比如蛋白-转录组联合分析时),例如红色的★,思路可以如下:
pathview:::parseKGML2Graph2获取通路的属性信息,拿到基因在图层上的坐标,然后使用png对通路的png文件进行读取的修改,例如添加文本信息可以使用text函数进行添加,可以参考:pathview:::keggview.native函数的实现过程,最后再把修改后的图层进行保存即可。 2. 如何更自由的可视化KEGG通路
主要思路是将通路中的节点互作信息/节点信息/边信息进行获取,然后基于ggraph/visNetwork等包进行可视化,也可以手动导入cytoscape进行自定义可视化,通路网络信息的获取示例代码如下:
S
3. 关于KEGG可视化结果文件png/pdf的保存以及像素优化
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()
主要实现基于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")