r - 如何创建美国各县的传单分区统计图

标签 r leaflet gis choropleth

通过下面的代码,我得到了包含美国县数据的数据框

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

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

### Get data
mydata <- read.csv("https://www.betydb.org/miscanthus_county_avg_yield.csv",
                   stringsAsFactors = FALSE)

我的目标是制作一个 Avg_yield 的交互式传单分区统计图,所以首先我强化我的美国多边形数据

library(rgeos)
library(maptools)
library(ggplot2)
states.shp.f <- fortify(USA, region = "NAME_2")

然后我对数据集进行子集化并将其与强化数据集合并:

mydata2<-mydata[,c("COUNTY_NAME","Avg_yield")]
colnames(mydata2)[1]<-"id"

## merge shape file with data
merge.shp.coef <- merge(states.shp.f, mydata2, by = "id")

但现在我有一个包含每个县名称多次的数据集,而且有些县具有不同的 Avg_yield 值。为了使用传单代码,处理这些数据的正确方法是什么:

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$Avg_yield),
              popup = paste("Region: ", USA$NAME_2, "<br>",
                            "Avg_yield: ", mydata$Avg_yield, "<br>")) %>%
  addLegend(position = "bottomleft", pal = mypal, values = mydata$Avg_yield,
            title = "Avg_yield",
            opacity = 1)

最佳答案

正确的方法是将多边形对象转换为 sf 对象 与 st_as_sf()

这里有一个工作示例: (我确实使用了一些其他的多边形数据,我认为你的数据太精确并且需要大量资源,而且我让它与 Shiny 一起工作)

library(leaflet)
library(tidyverse)
library(ggplot2)
library(sf)
library(shiny)

USA <- st_read(dsn = '[your path]/cb_2018_us_county_500k.shp')

### Get data
mydata <- read.csv("https://www.betydb.org/miscanthus_county_avg_yield.csv",
                   stringsAsFactors = FALSE)

states_sf <- st_as_sf(USA)

mydata2<-mydata[,c("COUNTY_NAME","Avg_yield")]
colnames(mydata2)[1]<-"NAME"

## merge shape file with data
states_sf_coef <- left_join(states_sf, mydata2, by = "NAME")


ui <- fluidPage(

  leafletOutput("map", height = "100vh")
)

server <- function(input, output, session) {

  bins <- c(0, 5, 10, 15, 20, 25, 30, 35, 40)
  mypal <- colorBin("YlOrRd", domain = states_sf_coef$Avg_yield, bins = bins)

  #Sortie map
  output$map <- renderLeaflet({
    leaflet()%>%
      addProviderTiles("OpenStreetMap.Mapnik")%>%
      setView(lat = 39.8283, lng = -98.5795, zoom = 4) %>%
      addPolygons(
        data = states_sf_coef,
        fillColor = ~mypal(states_sf_coef$Avg_yield),
        stroke = FALSE,
        smoothFactor = 0.2,
        fillOpacity = 0.3,
        popup = paste("Region: ", states_sf_coef$NAME_2, "<br>",
                      "Avg_yield: ", states_sf_coef$Avg_yield, "<br>"))%>%
      addLegend(position = "bottomleft",
                pal = mypal,
                values = states_sf_coef$Avg_yield,
                title = "Avg_yield",
                opacity = 1)
  })

}

# Create Shiny app ----
shinyApp(ui = ui, server = server)

关于r - 如何创建美国各县的传单分区统计图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60289893/

相关文章:

javascript - 传单折线 SmoothFactor 范围

java - 缓存空间查询

gis - 以编程方式访问 ArcGIS Pro 地理处理历史记录

R:如何使用函数参数作为变量名的一部分

r - 二进制R热图仍显示渐变

javascript - Leaflet、JS、示例代码不渲染 map

events - 如何在 Shiny 的应用程序中将传单 map 点击(事件)与绘图创建联系起来

postgresql - 如何将线串的起点和终点顶点对齐到最近的点?

r - 如何同时使用 "for loop"和 "write.csv"?

r - 自动安装自制包的依赖库