2012-12-22 33 views
8

Hình ảnh bản đồ nhiệt này được tạo trong Excel nhưng tôi đang cố gắng tìm hiểu RI muốn biết cách tạo bản đồ nhiệt như thế với R.2 bản đồ nhiệt màu trong R với màu trung được neo vào một giá trị cụ thể

Excel HeatMap

Ngay bây giờ, mã này đang làm việc nhưng không phải vì nó được cho là ...

(p <- ggplot(melt(heat), aes(Var2, Var1)) 
+ geom_tile(aes(fill = value), colour = "white") 
+ scale_fill_gradient(low = "red", high = "green")) 

tôi muốn có 2 gradient, màu xanh lá cây (giá trị cao nhất) đến màu trắng (số 1000) để màu đỏ (giá trị thấp nhất). Có thể trong R?

bộ dữ liệu nhiệt:

> heat[0:10,0:10] 
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  [,10] 
[1,] 1000.000 0.000 0.0000 0.0000 757.0317 709.3896 843.7676 932.2801 0.0000 1016.7203 
[2,] 1087.658 1000.000 0.0000 0.0000 935.5829 854.5110 889.5042 1091.4610 929.1611 0.0000 
[3,] 1181.599 1361.953 1000.0000 0.0000 0.0000 1102.1590 1147.1300 984.1374 969.0718 1058.3456 
[4,] 1319.012 1405.954 1187.5215 1000.0000 0.0000 1093.8854 1195.7298 1077.0797 1119.4640 1159.5207 
[5,] 0.000 0.000 909.1927 817.5097 1000.0000 0.0000 1101.2891 1064.6516 1037.1623 990.3974 
[6,] 0.000 0.000 0.0000 0.0000 887.7498 1000.0000 1015.9835 1062.1668 1105.2163 983.2319 
[7,] 0.000 0.000 0.0000 0.0000 0.0000 0.0000 1000.0000 911.0699 1026.1989 951.3572 
[8,] 0.000 0.000 0.0000 0.0000 0.0000 0.0000 0.0000 1000.0000 834.8725 927.6802 
[9,] 1261.824 0.000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1000.0000 795.6285 
[10,] 0.000 1121.210 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1000.0000 
+0

nó nên có thể nếu bạn đưa ra một ví dụ reprooducible? http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – agstudy

+0

ví dụ được bao gồm. –

Trả lời

10

Bạn có thể sử dụng không? scale_fill_gradientn

gving bạn giá trị:

library(scales) 
    heat.dat <- heat[0:10,0:10] 
    dat <- expand.grid(var1=1:10, var2=1:10) 
    dat$value <- melt(heat.dat)$value 
    ggplot(dat, aes(x=var1,y=var2))+ 
     geom_tile(aes(fill = value),colour='white')+ 
     scale_fill_gradientn(colours=c("red","white","green"), 
     values = rescale(c(min(dat$value), 1000, max(dat$value))) 

enter image description here

Sử dụng lưới:

with(dat, 
levelplot(round(value,0)~y*x, 
      dat, 
      panel=function(...) { 
       arg <- list(...) 
       panel.levelplot(...) 
       panel.text(arg$x, arg$y,arg$z)}, 
      scales = list(y = list(at=y,labels=y), 
         x = list(at=y,labels=y)), 
      col.regions = colorRampPalette(c("red", "white", "green"),interpolate ='spline')) 
) 

enter image description here

+1

Cảm ơn sự giúp đỡ. Tôi đã chỉnh sửa nó một chút sau khi một số nghiên cứu khác của google: '(p <- ggplot (tan (nhiệt [0: 10,0: 10]), aes (Var2, Var1)) + geom_tile (aes (fill = value), color = "white") + scale_fill_gradientn (màu = c ("đỏ", "trắng", "xanh lục"), giá trị = rescale (c (phút (nhiệt [0: 10,0: 10]), 1000, max (nhiệt [0: 10,0: 10]))), guide = "colorbar")) ' Bằng cách này, số 1000 sẽ luôn có màu trắng và các màu khác sẽ được định vị tương ứng. –

+0

câu trả lời này có đúng không? nhưng tôi nghĩ nếu những gì bạn muốn là để hiển thị số như excel nó là tốt hơn, trong trường hợp này để sử dụng levelplot của gói mạng, ở đây một ví dụ http://stackoverflow.com/questions/13895480/how-to-show-matrix- giá trị-on-levelplot/13895940 # 13895940 – agstudy

+0

Làm thế nào để bạn thực hiện điều này mà các ô trong dữ liệu gốc sẽ khớp với các ô được vẽ bằng ggplot. Các giá trị được đảo ngược. – GabrielMontenegro

0

Ngoài các câu trả lời và ý kiến ​​của/để agstudy, bạn cũng có thể sử dụng cú pháp ggplot tinh khiết và bản đồ các nhãn trong aes() thông qua label:

heat=structure(c(1000, 1087.658, 1181.599, 1319.012, 0, 0, 0, 0, 261.824,0, 0, 1000, 1361.953, 1405.954, 0, 0, 0, 0, 0, 1121.21, 0, 0,1000, 187.5215, 909.1927, 0, 0, 0, 0, 0, 0, 0, 0, 1000, 817.5097,0, 0, 0, 0, 0, 57.0317, 935.5829, 0, 0, 1000, 887.7498, 0, 0,0, 0, 709.3896, 854.511, 1102.159, 093.8854, 0, 1000, 0, 0,0, 0, 843.7676, 889.5042, 1147.13, 1195.7298, 1101.2891, 015.9835,1000, 0, 0, 0, 932.2801, 1091.461, 984.1374, 1077.0797, 1064.6516,1062.1668, 911.0699, 1000, 0, 0, 0, 929.1611, 969.0718, 1119.464,1037.1623, 1105.2163, 1026.1989, 834.8725, 1000, 0, 1016.7203,0, 058.3456, 1159.5207, 990.3974, 983.2319, 951.3572, 927.6802,795.6285, 1000), Dim c(10L, 10L), .Dimnames = list(NULL, NULL)) 

    heat_melted = reshape2::melt(heat[10:0,0:10]) 

    ggplot(heat_melted, aes(Var2, Var1, label = round(value))) + 
    geom_tile(aes(fill = value), colour = "white") + 
    scale_fill_gradientn(colours=c("red", "white", "green"), 
    values=rescale(c(min(heat_melted$value), 1000, max(heat_melted$value))), guide="colorbar") + 
    geom_text() 

plot

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