Ponieważ prezentujesz chromosomy w okrągły sposób, wypróbuj narzędzia dostarczone przez pakiet ecolitk dostarczony przez Bioconductor, który zawiera narzędzia do drukowania różnych kształtów na okrągłych chromosomach.
ETA: Oto przykład jego użycia do utworzenia okrągłego wykresu słupkowego, ale tylko zarysowuje powierzchnię rzeczy, które można z nim zrobić.
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: Ach, teraz rozumiem, co masz na myśli o podziale działek. W takim przypadku ten kod powinien być tym, czego szukasz. Wykorzystuje dane, które podajesz (z jedną drobną modyfikacją - musiałem nadać kolumnie chromosomowej nazwę, by móc z niej korzystać) i pozwala określić odległość między chromosomami. Chociaż nie przetestowałem go dogłębnie, różne rzeczy, takie jak indywidualne długości chromosomu oraz średnia i wariancja symulowanych danych powinny działać zgodnie z oczekiwaniami.
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)
rbloggers miał podobny wykres (histogram) omówiony wcześniej w tym tygodniu [KLIKNIJ TUTAJ] (http://www.r-bloggers.com/polar-histogram-pretty-and-useful/) –
Co konkretnie chcesz dołączyć od liczby cyrografów, że moja odpowiedź, na przykład, nie działa? –
Twoja figura wszystkie funkcje oprócz (1) chr są różne koło (zamiast var) - które oblyously może łatwo zmienić (2) Chr są oddzielne kawałek ciasta oprócz var w różnych kręgach - postać circos ma tę właściwość – jon