热图透明度,着色和特异性不令人满意

Raf*_*ael 5 r heatmap ggmap

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)
Run Code Online (Sandbox Code Playgroud)

制作透明度= ..级别的热图.

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"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

通过设置alpha = .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"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

两个结果都不令人满意.我更愿意看到类似于使用QlikView制作的以下热图并使用相同的数据集"T_1024".

在此输入图像描述

关于QV版本,我更喜欢三个方面:

  1. 透明度允许仍然可以看到下方的地图......
  2. ......虽然颜色仍然富有表现力而且不苍白
  3. 着色允许识别更多细节

我尝试通过尝试静态设置alpha级别以及相对于...级别的不同方法来解决(1)但是我无法获得好的结果.透明度从来都不是很好,如果我看到地图颜色太苍白了.

(3)我认为我可以通过设置高bin值来影响.

任何想法如何优化热图渲染或至少方面?

jlh*_*ard 7

注意:这篇文章归功于答案的基本结构.

这产生了热图,其中轮廓被清楚地区分,并且下面的地图是可见的.与您的代码的主要区别是:

  1. 删除size=...bins=...参数.没有必要size(这里没有任何作用).
  2. 替换transparency=..levels..(这是什么??),用alpha=..levels...
  3. 添加scale_alpha_continuous(...),设置范围限制为alpha并关闭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()
Run Code Online (Sandbox Code Playgroud)

请注意,我set.seed(1)在创建df可重复的示例之前使用过.如果你想要相同的情节,你需要添加它.

编辑回应OP的评论.

stat_density2d(...)通过定义轮廓和绘制填充多边形来封闭它们,因此根据定义,轮廓将是"前卫".如果你想弄乱轮廓,你可能不得不使用平铺方法.不幸的是,这需要在以下范围之外计算2D核密度估计值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")
Run Code Online (Sandbox Code Playgroud)

从数据可视化的角度来看,该图明显不如第一个图.它是否"更漂亮"是一个意见问题.