2012-02-23 13 views
7

Oto moje dane:nakładka okrągłe wiele barcharts w R

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, position, v1bar, v2bar, v3bar) 

Chcę utworzyć wiele kolistych wykresy słupkowe o wartości x = POS i wartości y = v1bar, v2bar, v3bar (wszystkie trzy będą w kolejnych kółkach). Każde koło jest podzielone na chr. Zatem każde koło ma "wycinek koła". Nie jestem pewien, jaki jest taki wykres i czy można go opracować. Poniższy szkic przedstawia tylko mój pomysł.

enter image description here

Edits: My assuption jest jakiś sposób podobny do następującego Circos rysunku.

http://circos.ca/tutorials/images/zoom/8.8

redaguje:

W odpowiedzi na następującej odpowiedzi na Dawida, to co ja sobie wyobrazić - CHR nie circe indywidualne ale klasyfikując jako inny kawałek (tak jak w Circos rysunku) enter image description here

+3

rbloggers miał podobny wykres (histogram) omówiony wcześniej w tym tygodniu [KLIKNIJ TUTAJ] (http://www.r-bloggers.com/polar-histogram-pretty-and-useful/) –

+0

Co konkretnie chcesz dołączyć od liczby cyrografów, że moja odpowiedź, na przykład, nie działa? –

+0

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

Odpowiedz

12

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ć.

circular plot

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.

Circular plot divided

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) 
+0

To nie jest okrągły chromosom raczej przedstawienie drogi jest okrągły, dzięki za komentarz – jon

+0

To nie robi różnicy - nadal można korzystać z oprogramowania w dokładnie taki sam sposób. –

+0

Przykro mi to mówić, ale spojrzałem na podręcznik (http://www.bioconductor.org/packages/release/bioc/manuals/ecolitk/man/ecolitk.pdf) i winiety (http://www.bioconductor.org/ pakiety/release/bioc/vignettes/ecolitk/inst/doc/ecolitk.pdf), nie mogłem znaleźć czegoś podobnego sofar. Byłbym wdzięczny, gdyby ktoś pomógł go zlokalizować ... dzięki – jon

0

OmicCircos w R/BioConductor ma możliwość wyciągnięcia nakładka kilka koliste słupkowe. Komenda OmicCircos circos przyjmuje argument o nazwie cir, w której można określić niestandardowe segmenty genomu lub chromosomy. Na wykresie słupkowym, ma argumentem typ gdzie można określić jedną z barem działce, Wykres pudełkowy, histogram, itp

Sprawdź Vignette R script - numer kodu fragment 14: OmicCircos4vignette1 więcej.