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

时间:2014-07-19 15:37:41

标签: 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)

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

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

通过设置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"))

enter image description here

两个结果都不令人满意。我希望看到类似下面使用QlikView制作的热图并使用相同的数据集“T_1024”。

enter image description here

我更喜欢QV版本的三个方面:

  1. 透明度允许仍然可以看到下面的地图...
  2. ......虽然颜色仍然富有表现力而且不苍白
  3. 着色可以识别更多细节
  4. 我尝试通过尝试静态设置alpha级别以及相对于...级别的不同方法来解决(1)但是我无法获得好的结果。透明度从来都不是很好,如果我看到地图的颜色太苍白了。

    (3)我以为我可以通过设置一个高bin值来影响。

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

1 个答案:

答案 0 :(得分:7)

注意:答案的基本结构为this post

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

  1. 删除了size=...bins=...个参数。不需要size(这里没有任何作用)。
  2. transparency=..levels..替换alpha=..levels..(这是什么??)。
  3. 添加scale_alpha_continuous(...),以alpha为单位设置范围限制并关闭Alpha指南。
  4. 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;是不是意见问题。