Поскольку вы представляете хромосомы по кругу, попробуйте инструменты, предоставляемые пакетом ecolitk , предоставленным Bioconductor, который включает в себя инструменты для нанесения различных видов форм на круглые хромосомы.
ETA: Вот пример его использования для создания круговой гистограммы, хотя он лишь царапает поверхность того, что вы можете с ним сделать.
![circular plot](https://i.stack.imgur.com/gL2v2.png)
library(ecolitk)
plot.new()
plot.window(c(-5, 5), c(-5, 5))
plot.chrom = function(data, chromlength, radius=1,
width=chromlength/length(data), ...) {
linesCircle(radius, ...)
starts = seq(1, chromlength - width, width)
scale = .5 / max(abs(data))
for (i in 1:length(starts)) {
polygonChrom(starts[i], starts[i]+width, chromlength, radius,
data[i] * scale + radius, ...)
}
}
plot.chrom(rnorm(100, 10, 1), 10000, radius=1)
plot.chrom(rnorm(100, 10, 2), 10000, radius=2, col="blue")
plot.chrom(rnorm(100, 10, 5), 10000, radius=3, col="red")
plot.chrom(rnorm(100, 10, 10), 10000, radius=4, col="green")
legend("topright", legend=c("chr1", "chr2", "chr3", "chr4"),
col=c("black", "blue", "red", "green"), lty=1)
ETAАх, теперь я понимаю, что вы имели в виду под разделением участков.В этом случае этот код должен быть тем, что вы ищете.Он использует данные, которые вы предоставляете (с одной небольшой модификацией - мне пришлось дать имя столбцу хромосомы, чтобы я мог использовать ddply с ним) и позволяет вам указать расстояние между хромосомами.Несмотря на то, что я не тестировал его подробно, различные вещи, такие как длина отдельных хромосом, среднее значение и дисперсия смоделированных данных, должны работать, как вы ожидаете.
![Circular plot divided](https://i.stack.imgur.com/rKYnE.png)
plot.multi.chrom = function(data, colors, spacing=50) {
plot.new()
plot.window(c(-5, 5), c(-5, 5))
lengths = ddply(data, .(chr), function(x) max(x$position))
nchrom = NROW(lengths)
offsets = cumsum(c(0, lengths[, 2])) + cumsum(c(0, rep(spacing, nchrom)))
tot.length = offsets[length(offsets)] + spacing
scales = .75 / apply(abs(data[, 3:NCOL(data)]), 2, max)
for (i in 1:NROW(data)) {
for (j in 3:NCOL(data)) {
start = offsets[data[i, 1]] + data[i, 2]
polygonChrom(start, start + 1, tot.length,
j - 2, data[i, j] * scales[j - 2] + j - 2,
col=colors[j - 2])
}
}
}
chr <- rep (1:4, each = 200)
position <- c(1:200, 1:200, 1:200, 1:200)
v1bar <- rnorm(800, 10, 2)
v2bar <- rnorm(800, 10, 2)
v3bar <- rnorm(800, 10, 2)
mydata <- data.frame(chr=chr, position, v1bar, v2bar, v3bar)
require(plyr)
plot.multi.chrom(mydata, colors=c("red", "black", "green"), spacing=50)
legend("topright", legend=c("V1", "V2", "V3"),
col=c("red", "black", "green"), lty=1)