使用R,ggmap和ggplot进行热图

Ale*_*ris 1 r heatmap ggplot2 ggmap

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

 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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

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

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

最后,谢谢你的重定向.这个主题确实有广泛的涵盖.

ajr*_*ite 7

所以我抓住了Kaggle的旧金山犯罪数据,我怀疑这是你正在使用的数据集.

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

train_reduced = train[sample(1:nrow(train), 5000),]
Run Code Online (Sandbox Code Playgroud)

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

ggmap(a,extent='device') + geom_point(aes(x=X, y=Y), data=train_reduced)
Run Code Online (Sandbox Code Playgroud)

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

旧金山犯罪地图

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

回到密度轮廓,我们可以使用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')
Run Code Online (Sandbox Code Playgroud)

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

旧金山犯罪等高线图与30个箱子

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

如果您使用较小的数据集样本,您应该能够非常快速地尝试这些想法并找到最适合您要求的参数.该GGPLOT2文档是优秀的,顺便说一句.