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)
制作透明度= ..级别的热图
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"))
通过设置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"))
两个结果都不令人满意。我希望看到类似下面使用QlikView制作的热图并使用相同的数据集“T_1024”。
我更喜欢QV版本的三个方面:
我尝试通过尝试静态设置alpha级别以及相对于...级别的不同方法来解决(1)但是我无法获得好的结果。透明度从来都不是很好,如果我看到地图的颜色太苍白了。
(3)我以为我可以通过设置一个高bin值来影响。
如何优化热图渲染或至少方面的任何想法?
答案 0 :(得分:7)
注意:答案的基本结构为this post。
这产生了热图,其中轮廓被清楚地区分,并且下面的地图是可见的。与您的代码的主要区别是:
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()
请注意,在为可重现的示例创建set.seed(1)
之前,我使用了df
。如果你想要相同的情节,你需要添加它。
编辑回应OP的评论。
stat_density2d(...)
通过定义轮廓和绘制填充多边形来封闭它们,因此根据定义,轮廓将是&#34; edgy&#34;。如果你想弄乱轮廓,你可能不得不使用平铺方法。不幸的是,这需要计算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")
从数据可视化的角度来看,这个图明显不如第一个。它是否更漂亮&#34;是不是意见问题。