我使用ggmap和stat_density2d在R中制作密度贴图。代码如下所示:
riverside <- get_map('Riverside, IL', zoom = 14 , color = 'bw' )
RiversideMap <- ggmap(riverside, extent = 'device', legend = 'topleft')
# make the map:
RiversideMap +
stat_density2d(aes(x = lon, y = lat,
fill = ..level.. , alpha = ..level..),size = .01, bins = 16,
data = myData, geom = 'polygon') +
scale_fill_gradient(low = "yellow", high = "blue") +
scale_alpha(range = c(.0, 0.3), guide = FALSE)
地图颜色图例中显示的密度在stat_density2d中通过要求密度超过面积的积分等于1来标准化。
在地图中,x和y轴的单位是十进制度。 (例如,点由坐标lat = 41.81888和lon = -87.84147指定)。
为便于解释,请对地图图例中显示的密度值进行两处更改。
首先,我希望密度的积分为N(数据集中的数据点数 - 或地址数)而不是1.因此图例中显示的值需要乘以N = nrow(myData)。
其次,我希望距离单位为公里而不是十进制度。对于我正在绘制的纬度和经度,这需要将图例中显示的值除以9203.
使用stat_density2d中密度的默认标准化,我在图例中得到这些数字:c(2000,1500,1000,500)。
取N = 1600并执行上述重新缩放,这变为c(348,261,174,87)(= 1600/9203 * 2000等)。显然,这些不是很好的圆形数字,所以如果传说数字是c(400,300,200,100)并且它们在图例颜色条中的位置相应调整则会更好。
进行这些重新缩放的优势在于地图中的密度变得易于解释:它只是每平方公里的人数(而不是每平方度人的概率密度)。
有一种简单的方法吗?我是ggmap和ggplot2的新手。提前致谢。
答案 0 :(得分:1)
简而言之,使用:
scale_fill_continuous(labels = scales::unit_format(unit = "k", scale = 1e-3))
此链接对管理比例尺,轴和标签非常有用:https://ggplot2-book.org/scales.html