使用 R、ggmap 和 ggplot 的热图

heatmap with R,ggmap and ggplot

我想在地图上绘制事件(旧金山)。由于我的事件太多(800k 点),我最终遇到了过度绘制的问题。所以为了避免这种情况,我想制作一个二维密度以获取所需的洞察力。问题是,虽然事件遍布整个地图,但 geom_density2d 只显示了城市的一小部分区域。当然,预期的结果是涵盖几乎所有 city.Any 想法的密度 为什么会这样?

代码

 a<-get_map("San Francisco",zoom=12,source='osm')

 ggmap(a,extent='device')+    geom_density2d(data=train,aes(x=X,y=Y))+  
 stat_density2d(data=train,aes(x=X,y=Y,fill=..level..,alpha=..level..),
                  geom='polygon')

-------------------------------------------- ------------------

首先,@ajrwhite 感谢您的回答和态度,伙计。您也是对的,在处理这么大的数据集时,您必须进行子集化才能进行实验。就 bin 的数量而言,我在想像 geom_density 最佳内核 binwidth/bin 的数量是内部计算的。看起来,在二维情况下你必须自己调整它。

现在,你提到的我的问题是,我从来没有想过城市里的犯罪活动会如此集中。这一发现是如此清晰,以至于我的输出似乎是错误的。原来,城里就是这样。这个人对这个数据集的各种可视化也有更详细的方法。

https://www.kaggle.com/mircat/sf-crime/violent-crime-mapping

最后,感谢您的重定向。该主题确实涉及广泛。

所以我抓取了 San Francisco Crime data from Kaggle,我怀疑它是您正在使用的数据集。

首先,一个建议 - 鉴于此数据集中有 878,049 行,抽取 5,000 行样本并使用它来试验绘图。它将为您节省大量时间:

train_reduced = train[sample(1:nrow(train), 5000),]

然后您可以轻松绘制个别案例以更好地了解正在发生的事情:

ggmap(a,extent='device') + geom_point(aes(x=X, y=Y), data=train_reduced)

现在我们可以看到坐标和数据正确对齐了:

所以你的问题很简单,犯罪集中在城市的东北部。

回到你的密度等高线,我们可以使用 bins 参数来提高等高线间隔的精度:

ggmap(a,extent='device') +
  geom_density2d(data=train_reduced,aes(x=X,y=Y), bins=30) +
  stat_density2d(data=train_reduced,aes(x=X,y=Y,fill=..level.., alpha=..level..), geom='polygon')

这为我们提供了一个更多信息的情节,该情节更多地分布到城市的低犯罪区域:

有无数种方法可以提高这些图的美感和一致性,但这些已经在 Whosebug 的其他地方进行了介绍,例如:

  • How to make a ggplot2 contour plot analogue to lattice:filled.contour()?
  • Filled contour plot with R/ggplot/ggmap

如果您使用较小的数据集样本,您应该能够非常快速地试验这些想法并找到最适合您要求的参数。顺便说一句,ggplot2 documentation 很棒。