使用Leaflet的互动式美国县地图

时间:2018-02-25 15:34:11

标签: r leaflet maps

我有所有州的美国县数据集。只提供样本的样子,

county   state   value_x
Adair    Oklahoma  5
Adair    Missouri  2
Adair    Kentucky  10
Adair    lowas     1

我可以使用plotly通过使用map_data向数据集添加lat和long坐标来绘制此图。但是当我绘制整个美国州时,我发现情节太慢,无法悬停/缩放功能。

所以我想尝试使用传单。我在线浏览了一些代码。有趣的是他们都没有纬度/经度坐标。我想了解如何将它们用于我的数据集。因为一些县似乎有相同的名称,但在不同的州可用。如何在没有任何坐标的情况下进行绘制?

这是我试过的代码。根据县,value_x未正确绘制。这很奇怪。请帮忙解决这个问题。我想放大县,并希望我点击它时会弹出value_x。

library(raster)
library(leaflet)
library(tidyverse)

# Get USA polygon data
USA <- getData("GADM", country = "usa", level = 2)

### Get data. I can't provide the date set. It has county, state and value _x as shown above 
mydata <- county,state,value_x

### Check counties that exist in USA, but not in mydata
### Create a dummy data frame and bind it with mydata

mydata <- data.frame(county= setdiff(USA$NAME_2, mydata$county),
                     value_x = NA,
                     stringsAsFactors = FALSE) %>%
          bind_rows(mydata)

### Create a color palette
mypal <- colorNumeric(palette = "viridis", domain = mydata$value_x)

leaflet() %>% 
addProviderTiles("OpenStreetMap.Mapnik") %>%
setView(lat = 39.8283, lng = -98.5795, zoom = 4) %>%
addPolygons(data = USA, stroke = FALSE, smoothFactor = 0.2, fillOpacity = 0.3,
            fillColor = ~mypal(mydata$value_x),
            popup = paste("Region: ", USA$NAME_2, "<br>",
                          "Value X: ", mydata$value_x, "<br>")) %>%
 addLegend(position = "bottomleft", pal = mypal, values = mydata$value_x,
           title = "Value X",
           opacity = 1)

1 个答案:

答案 0 :(得分:1)

我不知道你的数据是怎样的。所以我在以下条件下定制了以下演示,条件是您只有具有相同名称的县的数据点。您可能需要修改以下代码。

这里的关键是将数据集与多边形数据合并(即USA)。使用传单时,有两种方法可以填充多边形。您可以在多边形数据或包含该变量的另一个数据框中使用填充变量。当你有相同名称的县时,我认为在多边形数据集中有填充变量可能会更好。此方法可确保将正确的填充值分配给右多边形。为此,您希望将数据集(即mydata)与多边形数据(即USA)合并。合并它们时,需要指定用于操作的列。

在这种情况下,您有两个名称相同的县(即Adair)。您在USAmydata中拥有不同的列名称。您需要告诉R哪些列与哪些列匹配。例如,NAME_1state匹配。您可以在merge()处理此问题。以下地图仅适用于Adair。俄克拉荷马州的一个有价值100,而不是20;合并过程顺利进行。我希望这可以帮助你。 (顺便说一下,我只能在Adair这个名下有两个县。)

library(raster)
library(leaflet)
library(viridis)

# Get USA polygon data
USA <- getData("GADM", country = "usa", level = 2)

# Prepare data

mydata <- data.frame(state = c("Iowa", "Oklahoma"),
                     county = "Adair",
                     value = c(20, 100),
                     stringsAsFactors = FALSE)

# I do not know how your actual data is like. In this demonstration,
# I have data points for Adair in Iowa and Oklahoma. So 

temp <- merge(USA, mydata,
              by.x = c("NAME_1", "NAME_2"), by.y = c("state", "county"),
              all.x = TRUE)

# Create a color palette
mypal <- colorNumeric(palette = "viridis", domain = temp$value, na.color = "grey")

leaflet() %>% 
addProviderTiles("OpenStreetMap.Mapnik") %>%
setView(lat = 39.8283, lng = -98.5795, zoom = 4) %>%
addPolygons(data = USA, stroke = FALSE, smoothFactor = 0.2, fillOpacity = 0.3,
            fillColor = ~mypal(temp$value),
            popup = paste("Region: ", temp$NAME_2, "<br>",
                          "Value: ", temp$value, "<br>")) %>%
addLegend(position = "bottomleft", pal = mypal, values = temp$value,
          title = "Value",
          opacity = 1)

enter image description here