1

Circlize を使用してプロットしたい 3 つのデータ セットがあります。セットの「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)
4

1 に答える 1

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 範囲を明示的に示すことが重要であることを追加しました。

ここに画像の説明を入力

于 2016-08-11T14:28:17.610 に答える