2012-06-11 23 views
21

Tôi muốn tạo bản đồ nhiệt trong ggplot2. dữ liệu đồ chơi của tôi và mã số là:ggplot2 bản đồ nhiệt có màu cho giá trị dao động

set.seed(12345) 
dat <- 
    data.frame(
     Row = rep(x = LETTERS[1:5], times = 10) 
    , Col = rep(x = LETTERS[1:10], each = 5) 
    , Y = rnorm(n = 50, mean = 0, sd = 1) 
    ) 
library(ggplot2) 
p <- ggplot(data = dat, aes(x = Row, y = Col)) + 
     geom_tile(aes(fill = Y), colour = "white") + 
     scale_fill_gradient(low = "white", high = "steelblue") 
p 

Tôi muốn có màu sắc cho các giá trị dao động như thế này:

-3 <= Y < -2 ---> Dark Blue 
-2 <= Y < -1 ---> Blue 
-1 <= Y < 0 ---> Light Blue 
0 <= Y < 1 ---> Light Green 
1 <= Y < 2 ---> Green 
2 <= Y <= 3 ---> Dark Green 

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn

Trả lời

15

Bạn có một số tùy chọn cho một cái gì đó như thế này, nhưng đây là một tùy chọn làm điểm bắt đầu.

Thứ nhất, sử dụng cut để tạo ra một yếu tố từ Y với phạm vi thích hợp:

dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE) 

Sau đó vẽ sử dụng bảng màu từ RColorBrewer:

ggplot(data = dat, aes(x = Row, y = Col)) + 
     geom_tile(aes(fill = Y1), colour = "white") + 
     scale_fill_brewer(palette = "PRGn") 

enter image description here

Màu này lược đồ có nhiều màu tím hơn màu xanh ở cuối thấp, nhưng nó là c Tôi có thể tìm thấy trong số các bảng của nhà sản xuất bia.

Nếu bạn muốn tự xây dựng, bạn có thể chỉ cần sử dụng scale_fill_manual và chỉ định vector màu mong muốn của bạn cho đối số values.

+0

Cảm ơn @joran trả lời của bạn. Tôi tự hỏi làm thế nào để xóa các dòng giữa hai hình chữ nhật của lô. Cảm ơn – MYaseen208

+0

@ MYaseen208 Đặt 'color =" transparent "' trong 'geom_tile'. – joran

+0

Cảm ơn rất nhiều @ joran. Nhiều đánh giá cao. – MYaseen208

38

Không rõ nếu bạn muốn có màu rời rạc hoặc nếu màu bạn liệt kê chỉ là các điểm đánh dấu dọc theo phạm vi Y. Tôi sẽ hiển thị cả hai.

Đối với màu sắc riêng biệt, sử dụng Y1 như Joran định nghĩa nó

dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE) 

Sau đó, bạn có thể nhận được một âm mưu với các màu sắc cụ thể mà bạn liệt kê sử dụng một quy mô thủ công

p <- ggplot(data = dat, aes(x = Row, y = Col)) + 
     geom_tile(aes(fill = Y1)) + 
     scale_fill_manual(breaks=c("\[-Inf,-3)", "\[-3,-2)", "\[-2,-1)", 
           "\[-1,0)", "\[0,1)", "\[1,2)", 
           "\[2,3)", "\[3, Inf)"), 
         values = c("white", "darkblue", "blue", 
            "lightblue", "lightgreen", "green", 
            "darkgreen", "white")) 
p 

tôi không biết những gì bạn muốn cho màu sắc vượt quá -3 và 3, vì vậy tôi đã sử dụng màu trắng.

Nếu bạn muốn có màu liên tục, chuyển từ màu xanh dương sang màu trắng thành 0, thành màu xanh dương, scale_fill_gradient2 sẽ hoạt động.

ggplot(data = dat, aes(x = Row, y = Col)) + 
    geom_tile(aes(fill = Y)) + 
    scale_fill_gradient2(low="darkblue", high="darkgreen", guide="colorbar") 

enter image description here

Nếu bạn muốn kiểm soát chi tiết đẹp của màu sắc, như vậy mà lập bản đồ là "DARKBLUE" tại 3 "xanh" tại 2, "Lightblue" 1, "trắng" tại 0, vv, thì scale_fill_gradientn sẽ làm việc cho bạn:

library("scales") 
ggplot(data = dat, aes(x = Row, y = Col)) + 
    geom_tile(aes(fill = Y)) + 
    scale_fill_gradientn(colours=c("darkblue", "blue", "lightblue", 
           "white", 
           "lightgreen", "green", "darkgreen"), 
         values=rescale(c(-3, -2, -1, 
             0, 
             1, 2, 3)), 
         guide="colorbar") 

+0

Cảm ơn @Brian vì câu trả lời hay. Bạn là thủ thuật của ggplot2.Nhiều đánh giá cao sự giúp đỡ của bạn. – MYaseen208

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