如何为环形图的每个扇区指定单独的y轴限制集?

时间:2016-07-20 10:51:47

标签: r plot circlize

我想使用Circlize绘制三组数据。 Set的“a”和“b”包含正值和负值,set“c”仅包含正值。我想使用一致的y轴绘制“a”和“b”,将不同的y轴绘制为“c”。不幸的是,我找不到这样做的方法。

我正在使用的代码如下,我似乎只能为每个人设置唯一的y轴或者为所有人设置固定的y轴(如果你在代码中取消注释“ylim ...”)。

我尝试了一些事情,尝试使用circos.lines()函数循环,但这并没有解决它。

circos.info()显示单独的y轴限制,所以我认为应该是可能的。

提前致谢。

library("circlize")
library("reshape")


#--- Data ---#

a <- sort(rnorm(100,0,10))
b <- sort(rnorm(100,0,5))
c <- abs(rnorm(100,0,200))

data <- cbind("a" = a, "b" = b, "c" = c)
data_melt <- melt(data)


#--- Plotting ---#

circos.initialize(      factors = data_melt$X2, 
                        x = data_melt$X1, 
                        sector.width = 1
                        )   

circos.trackPlotRegion( factors = data_melt$X2, 
                        y = data_melt$value, 
#                       ylim = range(data_melt$value),
                        force.ylim = FALSE, 
                        panel.fun = function(x, y) { circos.axis( ) }
                        )

circos.trackLines(      data_melt$X2, 
                        data_melt$X1, 
                        data_melt$value, 
                        type = "h",
                        col = "grey",
                        lwd = 3, 
                        baseline = 0)`

circos.info(sector.index = NULL, track.index = 1)

1 个答案:

答案 0 :(得分:2)

ylim可以是矩阵,其中每行对应于每个扇区中的y范围。

set.seed(123)
a <- sort(rnorm(100,0,10))
b <- sort(rnorm(100,0,1))
c <- abs(rnorm(100,0,200))

data <- cbind("a" = a, "b" = b, "c" = c)
data_melt <- melt(data)


#--- Plotting ---#
r_ab = range(data_melt[data_melt$X2 != "c", "value"])
r_c = range(data_melt[data_melt$X2 == "c", "value"])

circos.par(gap.degree = 5)
circos.initialize(      factors = data_melt$X2, 
                        x = data_melt$X1, 
                        sector.width = 1
                        )   

ylim = rbind(r_ab, r_ab, r_c)
circos.trackPlotRegion( factors = data_melt$X2, 
                        x = data_melt$X1,
                        y = data_melt$value, 
                        ylim = ylim,
                        force.ylim = F, 
                        panel.fun = function(x, y) { 
                            circos.lines(x, y, type = "h", col = "grey", lwd =3, baseline = 0)
                            circos.axis(labels.cex = 0.6) 
                            circos.yaxis(labels.cex = 0.6)
                        }
                       )
circos.clear()

我还将代码从circos.trackLines()移到panel.fun()(因为我认为panel.fun()可以更灵活地添加多层图形。)

此外,我添加了circos.yaxis(),因为y轴在扇区中的范围不同,因此明确显示y范围非常重要。

enter image description here