在r circlize包中提供用户定义的颜色

时间:2014-11-25 17:06:02

标签: r plot geometry circlize

我正在尝试使用R.中的circlize包创建圆图。

这里我使用随机颜色的示例:

require(circlize)

circos.par("default.track.height" = 0.1, cell.padding = c(0, 0, 0, 0))
circos.initializeWithIdeogram(plotType = NULL)

bed1 = generateRandomBed(nr = 10)

f = colorRamp2(breaks = c(-1, 0, 1), colors = c("green", "black", "red"))

rand_col = function(k) {
    return(rgb(runif(k), runif(k), runif(k)))
}

circos.genomicTrackPlotRegion(bed1, stack = FALSE,  numeric.column=4, panel.fun = function(region,  value, ...) {
    circos.genomicRect(region, value, col = rand_col(nrow(region)), border = NA, ...)
})

会导致这样的数字:

enter image description here

现在我想传递自己的颜色 - 不是以前的情况下生成的随机颜色。

bed1$clr <- sample(c("red", "green", "blue", "purple", "red",
              "yellow", "blue", "red", "green", "cyan"), nrow(bed1), replace=TRUE)

circos.genomicTrackPlotRegion(bed1, stack = FALSE,  numeric.column=4, panel.fun = function(region,  value,  ...) {
    circos.genomicRect(region, value, col = bed1$clr, border = NA, ...)
})

但是命中错误:

Error in .normalizeGraphicalParam(col, 1, nr, "col") : 
  The length of `col` (19) should be equal to 1 or the number of your regions (1).

2 个答案:

答案 0 :(得分:0)

panel.fun中的

regionvalue对应于每条染色体上的数据,因此您无法使用bed1$clr,因为bed1$clr对应于整个数据。

实际上,在panel.fun中,value包含排除bed1中前三列的列,并且只包含当前染色体的数据(请记住每条染色体上应用的panel.fun) ,因此您可以将代码更改为:

circos.genomicTrackPlotRegion(bed1, panel.fun = function(region,  value,  ...) {
    circos.genomicRect(region, value, col = value$clr, border = NA, ...)
})

BTW,如果您使用的是最新版本的default.track.height(0.1.3),请将track.height替换为circos.par中的circlize

答案 1 :(得分:0)

您可以创建一个新列,其中每一行与一种颜色或相同颜色的不同值相关联。 例如,您可以创建一个空向量,并使用一个解析所有data.frame的循环。在这种情况下,当循环找到值== 1时,它会添加颜色&#34; black&#34;到向量时,当找到值== 2时,它会添加颜色&#34;红色&#34;等等。

vector <- c()
for(i in seq(nrow(test))){
  if (test$Color[i] == 1){
  vector <- c(vector, "black")}
  if (test$Color[i] == 2){
  vector <- c(vector, "red")}
}

之后,您可以在原始data.frame中添加列,如下所示:

test["paint"] <- vector

要结束,您可以在边框选项中添加具有所选颜色的列。

circos.par("track.height" = 0.1, cell.padding = c(0, 0, 0, 0))
circos.initializeWithIdeogram(chromosome.index = chrom)
bed = test
circos.genomicTrackPlotRegion(test, panel.fun = function(region, value, ...) {
circos.genomicRect(region, value, border = bed$paint)
})