2011-12-21 40 views
9

Tôi đang làm cho một mạng levelplot từ xy yếu tố dao động từ [0,1]:Làm cách nào để chỉ định các dải màu khác nhau cho các cấp khác nhau?

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

Đây là kịch bản R mà tôi sử dụng để làm cho con số từ dữ liệu này:

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

Điều này hoạt động tốt. Tôi nhận được hình sau:

levelplot

Tuy nhiên, thay vì có các tế bào nhãn NA, tôi muốn để lại chúng như 1.00 giá trị, nhưng màu sắc tất cả các ô từ 10 (một mức độ 0.10) và 79 (một mức 0.79) với colors. Bất cứ điều gì lớn hơn 79 được tô màu với cùng một màu sắc như những gì được áp dụng cho một tế bào với khoảng. mức 79. Hoặc, tốt hơn, các tế bào được nói sẽ có màu đen, không có văn bản bên trong chúng.

Có cách nào để thực hiện điều này với levelplot và mạng không?


CUỐI CÙNG EDIT

này không đưa ra nhiều của một gradient trong màu sắc, nhưng tôi đủ gần mà tôi sẽ trao giải bounty, và có lẽ nhìn vào ggplot2 như một sự thay thế. Cảm ơn tất cả các công việc khó khăn của bạn về điều này.

Đây là chỉnh sửa cuối cùng của kịch bản của tôi:

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

Đây là levelplot rằng kịch bản này làm cho:

vFinal

Nếu tôi tăng n trên 15, vỡ màu tế bào một lần một lần nữa, trở lại một đường chéo của màu đỏ tươi, thay vì màu đen (như được hiển thị).

+0

tôi sẽ xây dựng thùng sử dụng 'cắt (x, phá vỡ = c (0, 1, seq (10, 79, 1), 80 tuổi, Inf))' và gán một màu sắc phù hợp với mỗi bằng cách sử dụng 'colorRampPalette' của bạn. Thông qua 'seq', bạn luôn có thể tạo ra một số mức mong muốn. Đối với NA-s của bạn, hãy để lại tuyên bố thứ 5 của bạn. –

+0

Vui lòng xem câu trả lời đã sửa đổi của tôi. –

+0

Bạn có thể đăng mẫu dữ liệu trực tuyến (dropbox hoặc somesuch) không? –

Trả lời

5

Đây là phiên bản # 3

Ở đây chúng ta đi (một lần nữa). :)

Điều này thật kỳ lạ, nếu tôi đặt n thành bất kỳ điều gì dưới 15, mọi thứ dường như hoạt động?

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

Tôi xin lỗi, nhưng tôi không hiểu câu trả lời này. –

+0

Đây là mã bạn nên chạy (với những thay đổi nhỏ để làm cho nó phù hợp với hóa đơn của bạn) trước khi gọi cấp độ. Tôi đề nghị bạn chạy R tương tác để làm tròn các cạnh và sau đó đi vào "chế độ sản xuất" thông qua một kịch bản bash. –

+0

Tôi không biết làm thế nào để phù hợp với mã của bạn vào những gì tôi đã viết, xin lỗi. Nơi 'kats' được sử dụng, tại sao nó được gọi là, vv? –

Các vấn đề liên quan