我有所有州的美国县数据集。只提供样本的样子,
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)
答案 0 :(得分:1)
我不知道你的数据是怎样的。所以我在以下条件下定制了以下演示,条件是您只有具有相同名称的县的数据点。您可能需要修改以下代码。
这里的关键是将数据集与多边形数据合并(即USA
)。使用传单时,有两种方法可以填充多边形。您可以在多边形数据或包含该变量的另一个数据框中使用填充变量。当你有相同名称的县时,我认为在多边形数据集中有填充变量可能会更好。此方法可确保将正确的填充值分配给右多边形。为此,您希望将数据集(即mydata
)与多边形数据(即USA
)合并。合并它们时,需要指定用于操作的列。
在这种情况下,您有两个名称相同的县(即Adair)。您在USA
和mydata
中拥有不同的列名称。您需要告诉R哪些列与哪些列匹配。例如,NAME_1
与state
匹配。您可以在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)