2012-02-23 11 views
7

La siguiente es mi datos:superpuesto circulares múltiples gráficos de barras en I

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) 

quiero crear múltiples gráficos de barras y circulares con el valor x = punto de venta y el valor y = v1bar, v2bar, v3bar (Los tres estarán en círculos sucesivos). Cada círculo está dividido en chr. Por lo tanto, cada círculo tiene "sector de tarta". No estoy seguro de qué tipo de gráfico se conoce y sería posible desarrollar uno. El siguiente esbozo para ilustrar mi idea.

enter image description here

ediciones: Mi assuption es de alguna manera similar a la siguiente figura circos.

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

EDITS:

En respuesta a la siguiente respuesta a David, esto lo he imaginado - CHR no Circe separado, pero la clasificación rebanada tan diferente (como en la figura circos) enter image description here

+3

rbloggers tenía un gráfico similar (histograma) discutido anteriormente esta semana [HAGA CLIC AQUÍ] (http://www.r-bloggers.com/polar-histogram-pretty-and-useful/) –

+0

¿Qué desea específicamente? incluir desde la figura del circo que mi respuesta, por ejemplo, no sirve? –

+0

Su figura todas las características excepto (1) chr son círculo diferente (en lugar de var) - que obviamente pueden cambiar fácilmente (2) Chr son porciones separadas de pastel además de var en círculos diferentes - circos figura tiene esta propiedad – jon

Respuesta

12

Dado que presenta los cromosomas de forma circular, pruebe las herramientas proporcionadas por el paquete ecolitk proporcionado por Bioconductor, que incluye herramientas para trazar varios tipos de formas en cromosomas circulares.

ETA: Aquí hay un ejemplo de su uso para crear un diagrama de barra circular, aunque solo araña la superficie de las cosas que puede hacer con él.

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: Ah, ahora entiendo lo que quería decir sobre la división de las parcelas. En ese caso, este código debería ser lo que estás buscando. Utiliza los datos que usted presenta (con una ligera modificación, tuve que darle un nombre a la columna del cromosoma para que pudiera usar ddply) y le permite especificar el espaciado entre los cromosomas. Si bien no lo he probado en profundidad, las variables como la longitud de los cromosomas individuales y la media y la varianza de los datos simulados deberían funcionar como esperabas.

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

No es un cromosoma circular, sino que la presentación es circular, gracias por el comentario – jon

+0

No hace la diferencia: todavía puede usar el software de la misma manera –

+0

Lamento decirlo, pero miré el manual (http://www.bioconductor.org/packages/release/bioc/manuals/ecolitk/man/ecolitk.pdf) y viñetas (http://www.bioconductor.org/ packages/release/bioc/vignettes/ecolitk/inst/doc/ecolitk.pdf), no pude encontrar nada similar sofar. Agradecería que alguien ayudara a localizarlo. Gracias – jon

0

OmicCircos en R/Bioconductor tiene capacidad para extraer múltiples gráficos de barras circulares superpuestas. El comando circos de OmicCircos toma un argumento, llamado cir donde puede especificar segmentos de cromosomas o genomas personalizados. Para gráfico de barras, tiene argumento tipo donde puede especificar uno de diagrama de barras, diagrama de caja, histograma, etc.

Comprobar Vignette R script - código trozo número 14: OmicCircos4vignette1 por más.

Cuestiones relacionadas