我有美国所有州的县数据集。只提供了它看起来是什么样的样本,
county state value_x
Adair Oklahoma 5
Adair Missouri 2
Adair Kentucky 10
Adair lowas 1
通过使用map_data
向数据集添加经度和经度坐标,我可以使用plotly
绘制此图。但我发现当绘制整个美国的州时,plotly的悬停/缩放功能太慢了。
所以我想试着用leaflet。我在网上看了一些代码。有趣的是,它们都没有纬度/经度坐标。我想了解如何将它们用于我的数据集。因为有些县看起来名字相同,但在不同的州可用。如果没有任何坐标,如何绘制呢?
这是我尝试过的代码。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)
发布于 2018-03-08 09:30:34
我不知道你的数据是什么样的。因此,我在以下条件下定制了以下演示,条件是您具有仅具有相同名称的县的数据点。您可能需要修改以下代码。
这里的关键是将您的数据集与多边形数据(即USA
)合并。使用leaflet时,有两种填充多边形的方法。可以在多边形数据或包含该变量的另一个数据框中具有填充变量。当您有相同名称的县时,我认为在多边形数据集中使用fill变量可能更好。此方法可确保将正确的填充值分配给右侧多边形。为此,您需要将数据集(即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)
https://stackoverflow.com/questions/48975210
复制相似问题