ChIP-seq 绘图设计

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

(0)
联系我们
联系我们
分享本页
返回顶部