我想使用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)
答案 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范围非常重要。