我想在地图上绘制事件(旧金山)。由于我的事件太多(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')
起初,@ ajrwhite感谢您的回答和态度。你也是对的,在处理这个大数据集时,你需要进行子集才能进行实验。就bin的数量而言,我认为像geom_density一样,内部计算最佳内核binwidth / bin数。看起来,在二维情况下,你必须自己调整它。
现在,我提到的问题是,我从未想过城里的罪行会如此集中。这个发现很清楚,我的输出似乎是假的。事实证明,这个城市就是这种情况。这个人对这个数据集的各种可视化还有一个更详细的方法。
https://www.kaggle.com/mircat/sf-crime/violent-crime-mapping
最后,谢谢你的重定向。确实涵盖了这个主题。
答案 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)
现在我们可以看到坐标和数据正确对齐:
所以你的问题只是犯罪集中在城市的东北部。
回到密度等高线,我们可以使用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')
这为我们提供了一个更具信息性的情节,更多地传播到城市的低犯罪地区:
有许多方法可以改善这些图的美学和一致性,但这些已经在StackOverflow的其他地方有所涉及,例如:
如果您使用较小的数据集样本,您应该能够非常快速地尝试这些想法并找到最适合您要求的参数。顺便说一下,ggplot2 documentation非常棒。