将包中的轨道分组为R圈

时间:2015-04-14 00:06:13

标签: r plot circlize

我创建了一个类似于circlize教程第8页的图: http://cran.r-project.org/web/packages/circlize/vignettes/genomic_plot.pdf

现在我试图在基因名称之上覆盖一个额外的轨道,这显示基因分组为更大的类别(在下面的图片中从小插图中取出,我试图添加蓝线,希望得到一个更漂亮的图像与circlize)。

我有一个新的数据框,其中包含每个较宽区域的开始和停止,以及标签(我试图在这些区域之上添加标签)。

enter image description here

我已尝试从之前的绘图中获取xlim,ylim和index信息,但我遇到了麻烦,因为它是一个新的数据框。

这就是我正在做的事情:说我的新数据框(与主要数据的坐标相同)是这样的:

df = structure(list(Chr = c("chr1", "chr10", "chr12"), pos.start = c(2e+06, 2e+06, 2e+06), pos.end = c(3e+06, 6e+06, 3e+06), name = c("A", "B", "C")), .Names = c("Chr", "pos.start", "pos.end", "name"), row.names = c(1L, 2L, 3L), class = "data.frame")

在使用我的主数据集初始化circos并使用示例插图中的基因因子后,我试图添加这样的轨道:

circos.trackPlotRegion(ylim = c(0.5, 0.5), track.index=1,
panel.fun = function(x, y) {
chr = get.cell.meta.data("sector.index")
# find regions in this chromosome
regions  = unique(df[df$Chr == chr, , drop = FALSE]$name)
df2 = df[df$Chr == chr, , drop = FALSE]
for(i in seq_len(nrow(df2))) {
   region = which(regions %in% df2$name[i])
   circos.rect(region, 0.2, 
          region, 0.2, color="blue", border = NA)
}
}, bg.border = NA)

我一直收到这个错误:     “if(ncut){:参数不能解释为逻辑错误。”

我做错了什么?

我还尝试使用par(new = TRUE)覆盖一个全新的情节,但我不能让它与我之前的情节完全重叠,因为它重新调整以适应整个圆(虽然我只有一些段定义为更广泛的地区)。 如果任何人都有关于如何绘制这个覆盖区域的指针(使用定义这些更宽区域的不同数据集),我会非常感谢它!

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您想覆盖整个行业,例如如果你想绘制一条线来覆盖这两个基因(每个基因是图中的一个扇区),你可以尝试highlight.sector()。 该功能最近已添加到circlize,您可以将circlize更新为最新版本。

要使用highlight.sector(),首先应创建一个轨道(高度非常小),然后通过指定轨道和扇区的索引来突出显示该轨道中的两个基因。一个简单的例子如下(左图):

#########################################
# example 1: cover the whole sectors
o.cell.padding = circos.par("cell.padding")

circos.initializeWithIdeogram(plotType = NULL)
circos.trackPlotRegion(ylim = c(0, 1), track.height = 0.01, bg.border = NA, 
    cell.padding = c(0, o.cell.padding[2], 0, o.cell.padding[4]))
circos.trackPlotRegion(ylim = c(0, 1))

highlight.sector(sector.index = c("chr1", "chr2"), track.index = 1, 
    col = "red", border = NA)
circos.clear()

如果您只想突出部分扇区,则应使用draw.sector()代替。与draw.sector()一样,rect()需要两个角的坐标(在极坐标系中测量)。但是,计算正确的坐标有点棘手。 circlize()函数将通过转换每个单元格中的数据坐标来为您提供极坐标。但是您需要将数据点映射到正确的扇区。您可以从以下示例(右图)中看到这个想法

############################################
# example 2: cover only part of the sectors
o.cell.padding = circos.par("cell.padding")

circos.initializeWithIdeogram(plotType = NULL)
circos.trackPlotRegion(ylim = c(0, 1), track.height = 0.01, bg.border = NA, 
    cell.padding = c(0, o.cell.padding[2], 0, o.cell.padding[4]))
circos.trackPlotRegion(ylim = c(0, 1))

pos1 = circlize(1e8, 0, sector.index = "chr1", track.index = 1)
pos2 = circlize(1e8, 1, sector.index = "chr2", track.index = 1)
draw.sector(pos1[1, "theta"], pos2[1, "theta"], pos1[1, "rou"], pos2[1, "rou"], 
    clock.wise = TRUE, col = "red", border = NA)
circos.clear()

enter image description here

相关问题