2016-07-20 2 views
1

У меня есть три набора данных, которые я хочу построить, используя Circlize. Установки «a» и «b» содержат положительные и отрицательные значения, а «c» содержит только положительные значения. Я хочу построить с использованием согласованной оси y для «a» и «b» и другой для «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) 

ответ

2

ylim может быть матрица, в которой каждая строка соответствует у-диапазона в каждом секторе.

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

+0

Привет Zuguang, спасибо за ваш ответ. Вы знаете, как это обобщать, когда «a», «b» и «c» содержат различное количество наблюдений? Я столкнулся с ошибкой: «Ошибка в circos.lines (x, y, type =« h », col =« gray », lwd = 3, baseline = 0): Длина x и y отличается.». Я попытался изменить using sector.index, но не смог его обобщить. – Dominic

+0

Число наблюдений в каждой категории не должно влиять на график. Можете ли вы проверить, имеют ли 'data_melt $ X1' и' data_melt $ value' одинаковые длины? Или вы можете проверить другую часть своего кода? Он отлично работает с неравным количеством наблюдений на моей стороне. –

+0

Извинения, я неправильно задал код в коде, который я пишу. Он работает сейчас. Еще раз спасибо и спасибо за пакет. – Dominic

 Смежные вопросы

  • Нет связанных вопросов^_^