2011-12-21 14 views
9

Estoy creando un entramado de levelplotx y y factores que van desde [0,1]:¿Cómo especifico diferentes rangos de color para diferentes niveles?

 x  y  level                                                      
1 m3134 m3134 1.0000000                                                      
2 m3134 m416B 0.4189057                                                      
3 m416B m3134 0.2696508                                                      
4 m3134 mA20 0.3322170                                                      
5 mA20 m3134 0.2454191                                                      
6 m3134 mB 0.3176792 
... 

Aquí está la secuencia de comandos R que utilizo para hacer la figura de estos datos:

#!/foo/bar/bin/Rscript --vanilla                                           
args <- commandArgs(TRUE)                                                      
mtxFn <- args[1]                                                        
pdfFn <- args[2]                                                        

mtx <- read.table(mtxFn, col.names=c("x", "y", "level"))                                              
mtx$level[(mtx$level == 1)] <- NA                                                    

library(lattice)                                                        
trellis.device(dev=pdf, file=pdfFn)                                                   
colors <- colorRampPalette(c('red', 'white'))(256)                                                
fig <- levelplot(level~x*y,                                                     
       data=mtx,                                                      
       col.regions=colors,                                                   
       xlab="",                                                      
       ylab="",                                                      
       aspect="iso",                                                     
       scales=list(                                                     
        x=list(rot=90)                                                    
        ),                                                       
       panel=function(...) {                                                   
        arg <- list(...)                                                   
        panel.levelplot(...)                                                  
        panel.text(mtx$x, mtx$y, round(mtx$level*100,0), cex=0.5)                                         
       }                                                        
       )                                                        
print(fig)                                                          
graphics.off(); 

Esto funciona bien. Me da la siguiente figura:

levelplot

Sin embargo, en lugar de haber células marcadas NA, me gustaría dejarlos como 1.00 valores, pero el color de todas las células entre 10 (a nivel de 0.10) y 79 (una nivel de 0.79) con colors. Cualquier cosa mayor que 79 se colorea con el mismo color que lo que se aplica a una celda con el aprox. nivel de 79. O, preferiblemente, dichas celdas serían de color negro, sin ningún texto dentro de ellas.

¿Hay alguna manera de lograr esto con levelplot y celosía?


edición final

Esto no da mucho de un gradiente de colores, pero estoy lo suficientemente cerca que voy a adjudicación La generosidad, y tal vez mirar en ggplot2 como una alternativa. Gracias por todo tu trabajo duro en esto.

Aquí es la edición final de mi guión:

#! /foo/bar/bin/Rscript --vanilla 
args <- commandArgs(TRUE) 
dfFn <- args[1] 
pdfFn <- args[2] 

df <- read.table(dfFn, 
       col.names=c("x", "y", "level"), 
       stringsAsFactors=TRUE, 
       colClasses=c("factor", "factor", "numeric")) 
df$level <- round(df$level*100, 0) 

# reorder cell type row-factors (in reverse of given order) 
df$y <- factor(df$y, levels=unique(df$y[length(df$y):1])) 

lowestValue <- min(df$level) 
secondHighestValue <- unique(sort(df$level, decreasing=TRUE))[2] 

n <- 10 
col.seq <- seq(lowestValue, secondHighestValue, length.out=n) 
brks <- c(0, col.seq, Inf) 
cuts <- cut(df$level, breaks = brks) 
colors <- colorRampPalette(c("white", "red"))(length(levels(cuts))-1) 
colors <- c(colors, "black") 

cls <- rep(colors, times = table(cuts)) 

library(lattice) 
trellis.device(dev=pdf, file=pdfFn) 
fig <- levelplot(cuts~x*y, 
       data = df, 
       cuts = n, 
       col.regions=cls, 
       xlab="", 
       ylab="", 
       aspect="iso", 
       scales=list(
        x=list(rot=90) 
        ), 
       panel=function(...) { 
        arg <- list(...) 
        panel.levelplot(...) 
        panel.text(df$x, df$y, df$level, cex=0.5) 
       }, 
       colorkey=list(col=colorRampPalette(c("white", "red"))(length(col.seq)), at=col.seq) 
       ) 
print(fig) 
graphics.off() 

Aquí es el levelplot que este script hace:

vFinal

Si aumento n anterior 15, los descansos para colorear células una vez de nuevo, volviendo a una diagonal de color rojo brillante, en lugar de negro (como se muestra).

+0

Me gustaría construir contenedores usando 'cortadas (x, breaks = c (0, 1, SEC (10, 79, 1), 80, Inf))' y asignar un color apropiado para cada uno usando su 'colorRampPalette'. A través de 'seq', siempre puedes hacer una cantidad deseable de niveles. En cuanto a sus NA-s, omita su quinta declaración. –

+0

Consulte mi respuesta revisada. –

+0

¿Se puede publicar una muestra de sus datos en línea (dropbox o somesuch)? –

Respuesta

5

Esta es la revisión # 3

Aquí vamos (de nuevo). :)

Esto es extraño, si configuro n por debajo de 15, ¿las cosas parecen funcionar?

enter image description here

df <- read.table("http://dl.dropbox.com/u/31495717/stackoverflow.overlaps.list.txt", 
     sep = "\t", header = FALSE) 
names(df) <- c("x", "y", "level") 
df$level <- round(df$level*100, 0) 

n <- 10 
col.seq <- seq(10, 80, length.out = n) 
brks <- c(0, seq(10, 80, length.out = n), 100) 
cuts <- cut(df$level, breaks = brks) 
colors <- colorRampPalette(c("red", "white"))(length(levels(cuts))-1) 
colors <- c(colors, "black") 

cls <- rep(colors, times = table(cuts)) 

print(levelplot(cuts~x*y, 
       data = df, 
       cuts = n, 
       col.regions=cls, 
       xlab="", 
       ylab="", 
       aspect="iso", 
       scales=list(
         x=list(rot=90) 
       ), 
       panel=function(...) { 
        arg <- list(...) 
        panel.levelplot(...) 
        panel.text(df$x, df$y, df$level, cex=0.5) 
       }, 
       colorkey = list(col = colors, at = brks) 
     )) 
+0

Me disculpo, pero no entiendo esta respuesta. –

+0

Este es el código que debe ejecutar (con cambios menores para que se ajuste a su factura) antes de llamar a levelplot. Sugiero que ejecutes R de forma interactiva para redondear los bordes y luego entrar en "modo de producción" a través de un script bash. –

+0

No sé cómo adaptar tu código a lo que ya he escrito, lo siento. ¿Dónde se usa 'kats', por qué se llama así, etc.? –

Cuestiones relacionadas