带有传单不准确映射数据的交互式等值线图
Interactive choropleth map with leaflet inaccurately mapping data
首先post,我会努力的
我正在尝试用 R 中的传单制作交互式等值线图,基于 this
教程。一切顺利,直到我将地图上表示的数据与我的数据框中的数据进行比较。
我使用的数据与编写教程的人相同。它是一个名为 world_spdf
的大型空间多边形数据框,有 246 行 world_spdf@data
和 world_spdf@polygons
以及我不知道的其他三个对象。数据本质上是具有经度和纬度的国家。我对空间数据一无所知,但我假设它负责渲染地图上国家/地区的形状。
我还有一个名为 results
的数据框,最初有 234 行,也是关于国家和每个国家的一些额外数据。这就是 head(results)
的样子(它继续这样,并且没有 NA):
ISO2 v1 v2 v3
<chr> <dbl> <dbl> <dbl>
1 AD 0.118 0.880 0.001
2 AE 0.226 0.772 0.0016
3 AF 0.197 0.803 0.0001
4 AG 0.0884 0.911 0.0009
5 AI 0.172 0.827 0.00120
6 AL 0.107 0.891 0.0022
我正在通过包含国家代码的 ISO2
列合并两个数据框。到目前为止一切都很好,合并数据框中的数据已正确分配给国家/地区。
world_spdf@data = merge(world_spdf@data, results, by = "ISO2")
但是,当我尝试绘制数据时,生成的交互式地图以 "wrong order" 的形式显示数据,例如,波兰、尼日利亚等的数据。
我尝试的是在较小的数据框中找到缺失的国家,如下所示:
differences = c(setdiff(world_spdf@data$ISO2, results$ISO2)
然后将带有 NA 的行添加到数据框中,这样空间数据框中的所有国家至少都用 NA 表示。但这没有帮助。
我不知道为什么会这样。请帮忙!
我看不到你的一面。但是您的加入过程似乎并不顺利。我以前在这里见过这样的人。在该教程中,作者使用的是 sp 方法。但是现在我们可以使用 sp 方法。 sp 包更好,因为您可以更轻松地处理数据操作。例如,您可以使用 tidyverse 包。如果使用sp包,则不能使用filter()
、mutate()
、left_join()
等。最后,这是您的选择。不过我推荐sf包。
在这里,我使用了您提供的数据。所以你在下面的地图中看不到太多颜色。但我想告诉你国家名称与正确的位置相匹配。在我这边,我看到波兰有 38.2 的 POP2005,这是 mysf
中的正确值。
library(dplyr)
library(sf)
library(leaflet)
library(viridis)
# Read the shapefile as an sf object rather than as sp object.
mysf <- st_read(dsn = ".", layer = "TM_WORLD_BORDERS_SIMPL-0.3")
# Clean up the data as the tutorial shows.
mutate(mysf,
POP2005 = if_else(POP2005 == 0, NA_real_, POP2005),
POP2005 = round(POP2005 / 1000000, 2)) -> mysf
# Now join the results to mysf
left_join(mysf, results, by = "ISO2") -> mysf
# Create a color palette. I am not sure which variable you use.
# But I chose POP2005.
mypal <- colorNumeric(palette = "viridis",
domain = mysf$POP2005, na.color = "transparent")
# Draw a leaflet map
leaflet() %>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addPolygons(data = mysf, group = "continuous",
stroke = FALSE, smoothFactor = 0.2, fillOpacity = 0.5,
fillColor = ~mypal(mysf$POP2005),
popup = paste("Country: ", mysf$NAME, "<br>",
"ISO2: ", mysf$ISO2, "<br>",
"Population:", mysf$POP2005, "<br>")) %>%
addLayersControl(overlayGroups = "continuous") %>%
addLegend(position = "bottomright", pal = mypal, values = mysf$POP2005,
title = "Population 2005",
opacity = 0.5)
首先post,我会努力的
我正在尝试用 R 中的传单制作交互式等值线图,基于 this 教程。一切顺利,直到我将地图上表示的数据与我的数据框中的数据进行比较。
我使用的数据与编写教程的人相同。它是一个名为 world_spdf
的大型空间多边形数据框,有 246 行 world_spdf@data
和 world_spdf@polygons
以及我不知道的其他三个对象。数据本质上是具有经度和纬度的国家。我对空间数据一无所知,但我假设它负责渲染地图上国家/地区的形状。
我还有一个名为 results
的数据框,最初有 234 行,也是关于国家和每个国家的一些额外数据。这就是 head(results)
的样子(它继续这样,并且没有 NA):
ISO2 v1 v2 v3
<chr> <dbl> <dbl> <dbl>
1 AD 0.118 0.880 0.001
2 AE 0.226 0.772 0.0016
3 AF 0.197 0.803 0.0001
4 AG 0.0884 0.911 0.0009
5 AI 0.172 0.827 0.00120
6 AL 0.107 0.891 0.0022
我正在通过包含国家代码的 ISO2
列合并两个数据框。到目前为止一切都很好,合并数据框中的数据已正确分配给国家/地区。
world_spdf@data = merge(world_spdf@data, results, by = "ISO2")
但是,当我尝试绘制数据时,生成的交互式地图以 "wrong order" 的形式显示数据,例如,波兰、尼日利亚等的数据。
我尝试的是在较小的数据框中找到缺失的国家,如下所示:
differences = c(setdiff(world_spdf@data$ISO2, results$ISO2)
然后将带有 NA 的行添加到数据框中,这样空间数据框中的所有国家至少都用 NA 表示。但这没有帮助。
我不知道为什么会这样。请帮忙!
我看不到你的一面。但是您的加入过程似乎并不顺利。我以前在这里见过这样的人。在该教程中,作者使用的是 sp 方法。但是现在我们可以使用 sp 方法。 sp 包更好,因为您可以更轻松地处理数据操作。例如,您可以使用 tidyverse 包。如果使用sp包,则不能使用filter()
、mutate()
、left_join()
等。最后,这是您的选择。不过我推荐sf包。
在这里,我使用了您提供的数据。所以你在下面的地图中看不到太多颜色。但我想告诉你国家名称与正确的位置相匹配。在我这边,我看到波兰有 38.2 的 POP2005,这是 mysf
中的正确值。
library(dplyr)
library(sf)
library(leaflet)
library(viridis)
# Read the shapefile as an sf object rather than as sp object.
mysf <- st_read(dsn = ".", layer = "TM_WORLD_BORDERS_SIMPL-0.3")
# Clean up the data as the tutorial shows.
mutate(mysf,
POP2005 = if_else(POP2005 == 0, NA_real_, POP2005),
POP2005 = round(POP2005 / 1000000, 2)) -> mysf
# Now join the results to mysf
left_join(mysf, results, by = "ISO2") -> mysf
# Create a color palette. I am not sure which variable you use.
# But I chose POP2005.
mypal <- colorNumeric(palette = "viridis",
domain = mysf$POP2005, na.color = "transparent")
# Draw a leaflet map
leaflet() %>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addPolygons(data = mysf, group = "continuous",
stroke = FALSE, smoothFactor = 0.2, fillOpacity = 0.5,
fillColor = ~mypal(mysf$POP2005),
popup = paste("Country: ", mysf$NAME, "<br>",
"ISO2: ", mysf$ISO2, "<br>",
"Population:", mysf$POP2005, "<br>")) %>%
addLayersControl(overlayGroups = "continuous") %>%
addLegend(position = "bottomright", pal = mypal, values = mysf$POP2005,
title = "Population 2005",
opacity = 0.5)