代码之家  ›  专栏  ›  技术社区  ›  MMM

如何在R中勾勒出美国多个州的轮廓?

  •  2
  • MMM  · 技术社区  · 6 年前

    我想用经度和纬度点在R中画出多个美国州的轮廓。现在我只能画出每个州的轮廓,所以我想知道如何画出多个美国州的轮廓(只有外线)。

    library(tidyverse)
    library(knitr)    
    library(broom)
    library(stringr)
    library(modelr)
    library(forcats)
    library(ggmap)
    
    
    states <- map_data("state")# %>% as_tibble()
    counties <- map_data("county")
    il_df <- filter(fifty_states, id == "illinois")
    midwest <- subset(fifty_states, id %in% c("illinois", "indiana", "iowa",
                                        "kansas", "michigan", "minnesota",
                                        "missouri", "nebraska", "north dakota",
                                        "ohio", "south dakota", "wisconsin"))
    
    
    il_mid <- ggplot(data = midwest, mapping = aes(x = long, y = lat, group = group)) + 
      coord_fixed(1.3) + 
      geom_polygon(color = "black", fill = "gray")
    il_mid
    

    enter image description here

    我想知道如何在下面的图片中画粉红线。

    enter image description here

    2 回复  |  直到 6 年前
        1
  •  3
  •   Calum You    6 年前

    下面是一个使用 sf 包装和方便 geom_sf 在的开发版本中 ggplot2 . 我从尼斯得到地图数据 fiftystater 提供阿拉斯加和夏威夷作为插图的软件包,但需要转换为 SF 格式。我使用的答案来自 here 这样做。

    剩下的很简单,我们只是 filter 到了正确的州,把他们和 summarise.sf ,然后使用 风水 绘制结果。

    library(tidyverse)
    library(sf)
    #> Linking to GEOS 3.6.1, GDAL 2.2.3, proj.4 4.9.3
    library(fiftystater)
    
    sf_fifty <- sf::st_as_sf(fifty_states, coords = c("long", "lat")) %>% 
      group_by(id, piece) %>% 
      summarize(do_union = FALSE) %>%
      st_cast("POLYGON") %>% 
      ungroup()
    
    midwest <- sf_fifty %>%
      filter(
        id %in% c(
          "illinois", "indiana", "iowa",
          "kansas", "michigan", "minnesota",
          "missouri", "nebraska", "north dakota",
          "ohio", "south dakota", "wisconsin"
        )
      ) %>%
      summarise(id = "midwest")
    
    ggplot() +
      theme_minimal() +
      geom_sf(data = sf_fifty) +
      geom_sf(data = midwest, col = "hotpink", alpha = 0, size = 2)
    

    创建于2018-05-24 reprex package (v0.2.0版)。

        2
  •  1
  •   Z.Lin    6 年前

    下面是一个快速而脏的方法,适用于您的示例,假设您希望勾勒出所有外边缘:

    ggplot(data = midwest, mapping = aes(x = long, y = lat, group = group)) + 
      coord_fixed(1.3) + 
      geom_polygon(color = "hotpink", size = 5) + # or some other arbitrarily large number
      geom_polygon(color = "black", fill = "gray")
    

    附加的 geom_polygon 图层的每个多边形都有粉红色的轮廓,但只有原始图层未覆盖的边是可见的。

    plot

    请注意,这对于更复杂的情况(例如,您希望绘制所有美国州,但显示东北/中西部/南/西部州的轮廓)不起作用。在这种情况下,您可能需要将数据帧合并到适当的空间对象并合并基础多边形,例如使用 rgeos::gUnion 根据@r2evans的建议。