2014-07-19 14 views
5
v <- 2^(7:17) 
min_lon <- 6.164780 
max_lon <- 15.744857 
min_lat <- 47.228296 
max_lat <- 54.426407 
center_lon <- (min_lon + max_lon)/2 
center_lat <- (min_lat + max_lat)/2 

df <- data.frame(id = 1:sum(v)) 
df$T <- rep(paste("T", v, sep="_"), v) 
df$lon <- runif(sum(v),min_lon, max_lon) 
df$lat <- runif(sum(v),min_lat,max_lat) 

Làm một bản đồ nhiệt với tính minh bạch = .. mức ..Heatmap minh bạch, màu và độ đặc hiệu không Đáp ứng

gg_heatmap <- function(T){ 
    g <- ggmap(get_map(location=c(lat=center_lat, lon=center_lon), zoom=6, maptype="roadmap", source="google")) 
    g <- g + scale_fill_gradientn(colours=rev(rainbow(100, start=0, end=0.75))) 
    g <- g + stat_density2d(data=df[df$T == "T_1024",], aes(x = lon, y = lat,fill = ..level..,transparency=..level..), 
          size=1, bins=100, geom = 'polygon') 
    print(g) 
} 

system.time(gg_heatmap("T_1024")) 

enter image description here

Làm một bản đồ nhiệt bằng cách thiết lập alpha = 0,05

gg_heatmap <- function(T){ 
    g <- ggmap(get_map(location=c(lat=center_lat, lon=center_lon), zoom=6, maptype="roadmap", source="google")) 
    g <- g + scale_fill_gradientn(colours=rev(rainbow(100, start=0, end=0.75))) 
    g <- g + stat_density2d(data=df[df$T == "T_1024",], aes(x = lon, y = lat,fill = ..level..), alpha=.05, 
          size=1, bins=100, geom = 'polygon') 
    print(g) 
} 

system.time(gg_heatmap("T_1024")) 

enter image description here

Cả hai kết quả đều không thỏa mãn. Tôi muốn thấy một cái gì đó giống như heatmap sau đây được thực hiện với QlikView và sử dụng cùng một bộ dữ liệu "T_1024".

enter image description here

Có ba khía cạnh tôi thích về QV-phiên bản:

  1. Các tính minh bạch cho phép vẫn xem bản đồ bên dưới ...
  2. ... trong khi các màu sắc vẫn còn mang tính biểu cảm và không nhợt nhạt
  3. Màu tô cho phép nhận biết thêm chi tiết

Tôi đã cố gắng giải quyết (1) bằng cách thử nghiệm với các cách khác nhau để thiết lập mức alpha tĩnh cũng như liên quan đến ..level .. Tuy nhiên, tôi không thể có được kết quả tốt. Độ trong suốt không bao giờ thực sự tốt và nếu tôi thấy bản đồ màu sắc quá nhạt.

(3) Tôi nghĩ tôi có thể ảnh hưởng bằng cách đặt giá trị bin cao.

Bất kỳ ý tưởng nào về cách tối ưu hóa hiển thị bản đồ nhiệt hoặc ít nhất các khía cạnh của nó?

+0

'Minh bạch' là đối số hợp lệ cho' stat_density2d (...) '?? Tại sao bạn không sử dụng 'alpha = .. level..'? – jlhoward

Trả lời

7

Lưu ý: tín dụng cho this post cho cấu trúc cơ bản của câu trả lời.

Điều này tạo ra bản đồ nhiệt trong đó các đường bao được phân biệt rõ ràng và bản đồ bên dưới hiển thị. Sự khác biệt chính với mã của bạn là:

  1. Xóa đối số size=...bins=.... Không cần thiết cho size (nó không có gì ở đây).
  2. Thay thế transparency=..levels.. (cái gì vậy ??), với alpha=..levels...
  3. Thêm scale_alpha_continuous(...), đặt giới hạn phạm vi bằng alpha và tắt hướng dẫn alpha.

.

library(ggplot2) 
library(ggmap) 
gg_heatmap <- function(){ 
    g <- ggmap(get_map(location=c(lat=center_lat, lon=center_lon), zoom=6, maptype="roadmap", source="google")) 
    g <- g + scale_fill_gradientn(colours=rev(rainbow(100, start=0, end=0.75))) 
    g <- g + stat_density2d(data=df[df$T == "T_1024",], aes(x = lon, y = lat,fill = ..level..,alpha=..level..), 
          geom = 'polygon') 
    g <- g + scale_alpha_continuous(guide="none",range=c(0,.4)) 
    print(g) 
} 
gg_heatmap() 

Lưu ý rằng tôi đã sử dụng set.seed(1) trước khi tạo df cho một ví dụ tái sản xuất. Bạn sẽ cần phải thêm rằng nếu bạn muốn cùng một cốt truyện.

EDIT Trả lời nhận xét của OP.

stat_density2d(...) hoạt động bằng cách xác định đường viền và vẽ các đa giác được tô đầy để bao quanh chúng, do đó, theo định nghĩa, đường viền sẽ "sắc nét". Nếu bạn muốn làm mờ các đường nét, có thể bạn sẽ phải sử dụng phương pháp ốp lát. Thật không may, điều này đòi hỏi phải tính toán mật độ kernal 2D ngoài ggplot:

gg_heatmap <- function(T){ 
    require(MASS) 
    require(ggplot2) 
    require(ggmap) 
    d <- with(df[df$T==T,], kde2d(lon,lat,h=c(1.5,1.5),n=100)) 
    d.df <- expand.grid(lon=d[[1]],lat=d[[2]]) 
    d.df$z <- as.vector(d$z) 
    g <- ggmap(get_map(location=c(lat=center_lat, lon=center_lon), zoom=6, maptype="roadmap", source="google")) 
    g <- g + scale_fill_gradientn(colours=rev(rainbow(100, start=0, end=0.75))) 
    g <- g + geom_tile(data=d.df, aes(x=lon,y=lat,fill=z),alpha=.8) 
    print(g) 
} 
gg_heatmap("T_1024") 

Từ góc độ của dữ liệu trực quan, âm mưu này là rõ ràng thua kém người đầu tiên. Cho dù đó là "đẹp hơn" hay không là một vấn đề của ý kiến.

+0

cảm ơn bạn rất nhiều vì những hiểu biết của bạn. Tuy nhiên với tất cả sự kính trọng, thưa ông, bản đồ nhiệt của bạn trông khá xấu xí :) nhận được một cái gì đó đẹp trai là trung tâm cho câu hỏi của tôi. ít nhất tôi có thể thấy bản đồ - nhưng tôi không thích sự sắc sảo của các đường nét. – Raffael

+0

Đó là chắc chắn nhất * không * mục tiêu của tôi để tạo ra một cái gì đó bạn tìm thấy "đẹp". Mục tiêu nên là tạo ra một hình ảnh rõ ràng nhất truyền tải nội dung thông tin trong tập dữ liệu. Xem chỉnh sửa của tôi. – jlhoward

+0

tốt - nhưng cho rằng một bản đồ nhiệt là hình dung của một chức năng mịn có giá trị thực (mật độ) một màu không sắc sảo không chỉ trông đẹp hơn nó cũng là toán học acurate hơn. nhưng cảm ơn vì lời giải thích về lý do tại sao sử dụng hình đa giác có xu hướng mang lại kết quả sắc nét hơn. nhưng tại sao cách tiếp cận thứ hai đẹp hơn là kém hơn so với quan điểm viz dữ liệu mà tôi vẫn tò mò muốn tìm hiểu. – Raffael

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