首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的包circlize中的分组轨道

R中的包circlize中的分组轨道
EN

Stack Overflow用户
提问于 2015-04-14 08:06:13
回答 1查看 1.1K关注 0票数 1

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

现在我正试图在基因名称之上叠加一个额外的轨迹,它显示了将基因分组到更大的类别中(在下面的图像中,我试图添加蓝线,希望通过circlize获得更漂亮的图像)。

我有一个新的数据框,其中包含每个较宽区域的开始和结束,以及标签(我正尝试将其添加到这些区域的顶部)。

我尝试了从之前的绘图中获取xlim、ylim和索引信息,但由于它是一个新的数据帧,因此遇到了问题。

这就是我正在做的:假设我的新数据帧(具有与主数据相同的坐标)如下:

代码语言:javascript
复制
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之后,如示例vignette所示,我尝试像这样添加轨迹:

代码语言:javascript
复制
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)

我一直收到这样的错误:"Error in if (ncut) {:参数不能解释为逻辑“。

我做错了什么?

我还尝试使用par(new = TRUE)覆盖整个新的绘图,但我不能让它与我之前的绘图完全重叠,因为它会重新缩放以适应整个圆(虽然我只为更宽的区域定义了一些线段)。如果有人对如何在R中绘制覆盖区域(使用不同的数据集定义这些更宽的区域)有什么建议,我将非常感谢!

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2015-04-18 14:22:16

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

若要使用highlight.sector(),应首先创建一个轨迹(高度非常小),然后通过为轨迹和地段指定索引来高亮显示此轨迹中的两个基因。下面是一个简单的例子(左图):

代码语言:javascript
复制
#########################################
# 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()。与rect()一样,draw.sector()需要两个角的坐标(以极坐标系统测量)。然而,计算正确的坐标有点棘手。circlize()函数将通过转换每个单元格中的数据坐标来为您提供极坐标。但您需要将数据点映射到正确的扇区。你可以从下面的例子中看到这个想法(右图)

代码语言:javascript
复制
############################################
# 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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29617050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档