在《ggplotify - version 0.0.4》一文中,有粉丝说想要支持Gviz包,画图包如果输出的是对象,那么我们可以写方法针对这个对象,然而Gviz的输出,却是list,显然这个方法走不通。

ggsave支持base plot》一文中,我们知道可以使用base2grob来转化base plot为grob对象,乃至于ggplot2对象。然而Gviz包不是使用base plot来写的,它是使用grid来实现的,但又不输出grob对象,而是直接画图。针对这种情况,我在ggplotify包中又加入了grid2grob函数,以对应于base2grob函数。那么顾名思义,grid2grob函数可以把使用grid出图的,都转成grob对象,它适用于所有基于grid出的图,包括图A中的Gviz,当然也包括图B中的ggplot2(虽然例子中转ggplot2是多此一举)。

画图A的代码

library(Gviz)
library(GenomicRanges)
data(cpgIslands)
atrack <- AnnotationTrack(cpgIslands, name = "CpG")
gtrack <- GenomeAxisTrack()
gen<-genome(cpgIslands)
chr <- as.character(unique(seqnames(cpgIslands)))
itrack <- IdeogramTrack(genome = gen, chromosome = chr)
data(geneModels)
grtrack <- GeneRegionTrack(geneModels, genome = gen,
                           chromosome = chr, name = "Gene Model")
plotTracks(list(itrack, gtrack, atrack, grtrack))

其实不使用新版,也是可以支持Gviz的,虽然它的输出(直接画图+返回一个list)不能被直接转变成grob和ggplot2,但直接画图的函数是可以直接的,于是我们只需要简单地把画图的语句包装成一个函数,诸如function() plot_something,然后把这个函数传给as.grob或者as.ggplot就可以实现转化啦,所以旧版本也是支持的,只是你不懂得用而已。