1引言
在前面我们可以使用软件对结果(python deeptools)进行可视化,也可以使用 R 包 EnrichedHeatmap, 后面还写了一个 ggChIPvis 使用 ggplot2 来对结果重新美化和绘图。但是 ggplot2 绘图还是有一些局限性,有些其它控制可能得后期修图。grid 包为我们绘图提供了更多得底层图形控制,我们可以尝试使用grid 来重新绘图。
当你想要绘制一个复杂的图形时, 直接往 viewport(视图) 里添加各种图形,一旦多了起来,你的每个图形的坐标计算可能会变得繁琐难懂。也许你可以画图前先设置一个概括图,每个位置绘制什么图形都提前设置好,根据需要再往对应的位置进行绘制,这样会方便易懂很多。下面我们看看如何来做。
2尝试
示例图形:
假如我们要绘制上面的图形,我们可以对单个图形进行拆解,每个图形由 热图, 上面的折线图, 样本名称,热图底部的坐标, 底部的图例, 热图右侧图例, 热图左边注释, 热图左边注释标签等元素构成。
思路:
如果我们想在一个 viewport 里绘制那么多元素,无疑时困难和繁琐的,我们可以设计多个 panel, 然后往每个子图里面添加相应的图形,这样会变得简单很多。
我们设计一个4×5的布局,绘制热图的地方大一点:
heatmap.size <- c(0.7,0.7)
heatmap.xaxis.h <- 0.1
heatmap.blegend.h <- 0.1
heatmap.rlegend.w <- 0.1
heatmap.profile.h <- 0.1
heatmap.label.h <- 0.1
heatmap.lanno.w <- 0.1
heatmap.lanno.label.w <- 0.1
layout <- grid.layout(ncol = 4,nrow = 5,
widths = unit(c(heatmap.lanno.label.w,heatmap.lanno.w,
heatmap.size[1],heatmap.rlegend.w),"npc"),
heights = unit(c(heatmap.profile.h,heatmap.label.h,
heatmap.size[2],
heatmap.xaxis.h,heatmap.blegend.h),"npc"))
grid.show.layout(layout)
然后根据需要的 panel 位置,添加视图,用不到的就不添加:
# top vp
vp.top <- viewport(layout = layout,name = "top",x = 0.5,y = 0.5,height = 0.8,width = 0.8)
# sub-vps
vp.ht <- viewport(layout.pos.row = 3,layout.pos.col = 3,name = "heatmap")
vp.xaxis <- viewport(layout.pos.row = 4,layout.pos.col = 3,name = "xaxis")
vp.blegend <- viewport(layout.pos.row = 5,layout.pos.col = 3,name = "blegend")
vp.rlegend <- viewport(layout.pos.row = 3,layout.pos.col = 4,name = "rlegend")
vp.profile <- viewport(layout.pos.row = 1,layout.pos.col = 3,name = "profile")
vp.ht.label <- viewport(layout.pos.row = 2,layout.pos.col = 3,name = "heatmap_label")
vp.lanno <- viewport(layout.pos.row = 3,layout.pos.col = 2,name = "heatmap_left_anno")
vp.lanno.label <- viewport(layout.pos.row = 3,layout.pos.col = 1,name = "heatmap_left_anno_label")
# combine vps
all.vps <- vpTree(vp.top,vpList(vp.ht,vp.xaxis,vp.blegend,vp.rlegend,
vp.profile,vp.ht.label,vp.lanno,vp.lanno.label))
这时候我们可以使用 seekViewport 导航到对应的视图进行作图,我们尝试都绘制一个矩形,然后添加该视图的名称:
grid.newpage()
pushViewport(all.vps)
vp.names <- c("heatmap","xaxis","blegend","rlegend","profile","heatmap_label","heatmap_left_anno",
"heatmap_left_anno_label")
text.rot <- c(0,0,0,270,0,0,90,90)
# loop draw
for (i in seq_along(vp.names)) {
seekViewport(vp.names[i])
grid.rect(gp = gpar(fill = "grey90"))
grid.text(vp.names[i],rot = text.rot[i])
}
那么上面就是我们大概设计的布局了。
3结尾
路漫漫其修远兮,吾将上下而求索。
欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群 (微信交流群需收取 20 元入群费用,一旦交费,拒不退还!(防止骗子和便于管理)) 。QQ 群可免费加入, 记得进群按格式修改备注哦。
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/356205.html