密度热图-我认为是奇数比例尺和显示问题?

问题描述 投票:1回答:1

我正在尝试对洛杉矶与逮捕相关的数据进行一些映射(使用此数据集:https://data.lacity.org/A-Safe-City/Arrest-Data-from-2010-to-Present/yru6-6re4

当我运行如下所示的代码时,出现以下错误:

Warning message: Removed 11,578 rows containing non-finite values (stat_density2d). 

因此,这意味着在11,808个数据点中,只有230个显示在地图上。考虑到我仅放大洛杉矶体育馆周围的两个或三个街区半径,这似乎是合理的。这意味着,2017年该地区有230人被捕。好。

但是,当我对其进行映射时,我得到的密度标尺从500一直到2500(如下所示)。

这里是location2017.df的小标题:

> as_tibble(location2017.df)
# A tibble: 11,808 x 3
     lon   lat Frequency
   <dbl> <dbl>     <int>
 1 -118.  33.7         5
 2 -118.  33.7         2
 3 -118.  33.7         1
 4 -118.  33.7         1
 5 -118.  33.7         4
 6 -118.  33.7         2
 7 -118.  33.7         2
 8 -118.  33.7         1
 9 -118.  33.7         1
10 -118.  33.7         4
# … with 11,798 more rows

这是我用来设置所有内容的代码。

## Filtering for just 2017 data
arrest2017.df <- laarrestdata.df

## Remove empty 'Latitude' locations
arrest2017.df$lat[arrest2017.df$lat == ''] <- NA
arrest2017.df <- na.omit(arrest2017.df)

## Remove empty 'Longitude' locations
arrest2017.df$lon[arrest2017.df$lon == ''] <- NA
arrest2017.df <- na.omit(arrest2017.df)

## Creating dataframe for just LON and LAT
location2017.df <- as.data.frame(table(arrest2017.df$lon, arrest2017.df$lat))
names(location2017.df) <- c('lon', 'lat', 'Frequency')

## Switching from character to numeric
location2017.df$lon <- as.numeric(as.character(location2017.df$lon))
location2017.df$lat <- as.numeric(as.character(location2017.df$lat))

# Dropping all combos that have a frequency of zero
location2017.df <- subset(location2017.df, Frequency > 0)

# Erasing first row of zero frequency
location2017.df <- location2017.df[-c(1),]

# Creating map of Los Angeles
coliseum <- get_map("LA Coliseum", maptype = "roadmap", zoom = 15)

## Creating plot over data over GGMap of Los Angeles
heatmap <- ggmap(coliseum) +
  stat_density2d(data = location2017.df, aes(x = lon, y = lat, fill = ..density..), geom = 'tile', contour = F, alpha = .5) +
  scale_fill_viridis(option = "inferno") +
  labs(title = "Heat Map of Arrests",
       subtitle = "Los Angeles Coliseum | 2017") +
  theme(text = element_text(color = "#444444")
        ,plot.title = element_text(size = 22, face = 'bold')
        ,plot.subtitle = element_text(size = 12)
        ,axis.text = element_blank()
        ,axis.title = element_blank()
        ,axis.ticks = element_blank()) +
  guides(fill = guide_legend(override.aes = list(alpha = 1)))

这是绘图输出:

enter image description here

如您所见,这是完全“被淘汰”的……对我来说,奇怪的是,基于假定的238次总逮捕,整个地图上出现了紫色。同样,密度图也很奇怪……为什么逮捕人数有限,为什么密度从500上升到2500?

因此,最后有两个问题:

1。整个地图上出现紫色调是否似乎正确?

2。为什么在地图侧面显示密度比例,仅绘制了238个逮捕点?

非常感谢任何关于如何使该图看起来/更好看的想法/建议/更正。

EDIT

决定快速输出与上述相同信息的geom_point。这是情节:

enter image description here

如您所见,第一张图片中的“紫色色调”很有意义。整个区域的逮捕人数有限,在热图的黄色部分所在的地方质量较大。

因此,为了限制当前覆盖地图的色调,有一种方法可以在较少的逮捕与较多的逮捕之间做出更强烈的对比?

r ggplot2 heatmap ggmap
1个回答
0
投票

您的第二个问题可以帮助您回答第一个问题:

ggplot2在选择应绘制的数据集中的元素之前先计算比例范围,因此它看到您的值范围是500到2500-为什么呢?因为您的数据。请注意,当您缩放非常特定的区域时,long lat坐标值非常宽(即33.7)。坐标的准确度可能有所不同,因此,例如,如果您在33.72515处有一些逮捕,而在33.71235处有更多的逮捕,则您会有一些数字可以更准确地描述缩放范围内的实际犯罪数量。

[这也解释了为什么您在整个地块上都有紫色的色调-您的数据表明,即使实际上可能是更具体的街道/小巷,在这些地区也犯下了500多项犯罪。

你能做什么?

  1. 如果您对坐标进行了预处理以在小数点后截取一些数字,则应尝试使用原始坐标数据。
  2. 查看您的数据集,查找是否有犯罪发生地的描述(通常在gov数据库中,每个条目都有大量输入数据),然后您可以尝试查找街道的确切坐标,表示每种犯罪,并以这种方式获取更精确的坐标-这将需要一些工作,并且取决于您是否对数据集中的每一行都有街道名称。

  3. 绘制地图的缩小视图。

这里是我过去从事的一个项目的示例,我在华盛顿特区创建了一个停车引用图。如您所见,与您的数据集相比,我从数据集中获得的准确度非常高(小数点后4位),并且您会看到它如何反映在密度图中:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.