2011-12-21 5 views
9

Sto creando un reticolo levelplot da x e y fattori che variano da [0,1]:Come si specificano intervalli di colori diversi per livelli diversi?

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

Ecco lo script R che uso per fare la figura da questi dati:

#!/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(); 

Questo funziona bene. Ottengo la figura seguente:

levelplot

Tuttavia, invece di avere cellule marcate NA, desidero lasciarli come 1.00 valori, ma il colore tutte le celle da 10 (a livello di 0.10) e 79 (a livello di 0.79) con colors. Qualunque cosa maggiore di 79 diventa colorata con lo stesso colore di quello che viene applicato a una cella con il ca. livello di 79. O, preferibilmente, dette cellule sarebbero colorate di nero, senza alcun testo al loro interno.

C'è un modo per farlo con levelplot e reticolo?


montaggio finale

Questo non dà molto di un gradiente di colori, ma sono abbastanza vicino che io attribuisco la bontà, e forse guardare in ggplot2 come alternativa. Grazie per tutto il tuo duro lavoro su questo.

Ecco il montaggio finale del mio script:

#! /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() 

Ecco la levelplot che questo script fa:

vFinal

Se io aumento n sopra 15, le interruzioni di colorazione delle cellule una volta di nuovo, tornando a una diagonale di rosso vivo, anziché nero (come mostrato).

+0

avrei costruire bidoni utilizzando 'tagliate (x, pause = c (0, 1, seq (10, 79, 1), 80, Inf))' e assegnare un colore appropriato ognuno usa il tuo 'colorRampPalette'. Attraverso 'seq', puoi sempre creare un numero desiderabile di livelli. Per quanto riguarda i tuoi NA-s, lascia fuori la tua quinta affermazione. –

+0

Si prega di consultare la mia risposta rivista. –

+0

Puoi pubblicare un campione dei tuoi dati online (dropbox o somesuch)? –

risposta

5

Questa è la revisione # 3

Eccoci (di nuovo). :)

Questo è strano, se ho impostato n su qualcosa sotto 15, le cose sembrano funzionare?

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

Mi scuso, ma non capisco questa risposta. –

+0

Questo è il codice da eseguire (con piccole modifiche per adattarlo alla bolletta) prima di chiamare levelplot. Suggerisco di eseguire R in modo interattivo per arrotondare i bordi e quindi passare alla "modalità di produzione" tramite uno script bash. –

+0

Non so come adattare il tuo codice a quello che ho già scritto, mi dispiace. Da dove viene usato 'kats', perché si chiama così, ecc.? –