使用R,ggmap和ggplot进行热图

时间:2016-05-06 22:14:35

标签: r ggplot2 heatmap ggmap

我想在地图上绘制事件(旧金山)。由于我的事件太多(800k点),我最终会出现过度绘图问题。因此,为了避免这种情况,我想制作二维密度以获得所需的洞察力。问题在于,虽然事件遍布地图,但geom_density2d仅显示了城市的一小部分区域。当然,预期的结果是覆盖几乎所有城市的密度。任何想法为什么会发生这种情况?

CODE

 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')

enter image description here

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

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

现在,我提到的问题是,我从未想过城里的罪行会如此集中。这个发现很清楚,我的输出似乎是假的。事实证明,这个城市就是这种情况。这个人对这个数据集的各种可视化还有一个更详细的方法。

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

最后,谢谢你的重定向。确实涵盖了这个主题。

1 个答案:

答案 0 :(得分:7)

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

首先,建议 - 假设此数据集中有878,049行,请取5000个样本并使用它来试验绘图。它会为您节省大量时间:

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

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

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

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

San Francisco Crime map

所以你的问题只是犯罪集中在城市的东北部。

回到密度等高线,我们可以使用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')

这为我们提供了一个更具信息性的情节,更多地传播到城市的低犯罪地区:

San Francisco Crime contour map with 30 bins

有许多方法可以改善这些图的美学和一致性,但这些已经在StackOverflow的其他地方有所涉及,例如:

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