带有传单不准确映射数据的交互式等值线图

Interactive choropleth map with leaflet inaccurately mapping data

首先post,我会努力的

我正在尝试用 R 中的传单制作交互式等值线图,基于 this 教程。一切顺利,直到我将地图上表示的数据与我的数据框中的数据进行比较。

我使用的数据与编写教程的人相同。它是一个名为 world_spdf 的大型空间多边形数据框,有 246 行 world_spdf@dataworld_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)