如何为圆图的每个扇区指定单独的 y 轴限制集?
How do you specify seperate sets of y axis limits for each sector of a circlize plot?
我想使用 Circlize 绘制三组数据。集合的 "a" 和 "b" 包含正值和负值,集合 "c" 只包含正值。我想为 "a" 和 "b" 使用一致的 y 轴,为 "c" 使用不同的 y 轴。不幸的是,我找不到这样做的方法。
我正在使用的代码如下,我似乎只能为每个人提供唯一的 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)
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 范围很重要。
我想使用 Circlize 绘制三组数据。集合的 "a" 和 "b" 包含正值和负值,集合 "c" 只包含正值。我想为 "a" 和 "b" 使用一致的 y 轴,为 "c" 使用不同的 y 轴。不幸的是,我找不到这样做的方法。
我正在使用的代码如下,我似乎只能为每个人提供唯一的 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)
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 范围很重要。