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版本,我更喜欢三个方面:
我尝试通过尝试静态设置alpha级别以及相对于...级别的不同方法来解决(1)但是我无法获得好的结果.透明度从来都不是很好,如果我看到地图颜色太苍白了.
(3)我认为我可以通过设置高bin值来影响.
任何想法如何优化热图渲染或至少方面?
注意:这篇文章归功于答案的基本结构.
这产生了热图,其中轮廓被清楚地区分,并且下面的地图是可见的.与您的代码的主要区别是:
size=...和bins=...参数.没有必要size(这里没有任何作用).transparency=..levels..(这是什么??),用alpha=..levels...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)

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