R 在geom_地图中合并北达科他州和南达科他州

R 在geom_地图中合并北达科他州和南达科他州,r,ggplot2,R,Ggplot2,在本例中,使用geom_地图绘制美国各州 library(ggplot2) library(dplyr) us <- map_data("state") arr <- USArrests %>% add_rownames("region") %>% mutate(region=tolower(region)) gg <- ggplot() gg <- gg + geom_map(data=us, map=us,

在本例中,使用geom_地图绘制美国各州

library(ggplot2)
library(dplyr)

us <- map_data("state")

arr <- USArrests %>% 
  add_rownames("region") %>% 
  mutate(region=tolower(region))

gg <- ggplot()
gg <- gg + geom_map(data=us, map=us,
                    aes(x=long, y=lat, map_id=region),
                    fill="#ffffff", color="#ffffff", size=0.15)
gg <- gg + geom_map(data=arr, map=us,
                    aes(fill=Murder, map_id=region),
                    color="#ffffff", size=0.15)
gg <- gg + scale_fill_continuous(low='thistle2', high='darkred', 
                                 guide='colorbar')
gg <- gg + labs(x=NULL, y=NULL)
gg <- gg + coord_map("albers", lat0 = 39, lat1 = 45) 
gg <- gg + theme(panel.border = element_blank())
gg <- gg + theme(panel.background = element_blank())
gg <- gg + theme(axis.ticks = element_blank())
gg <- gg + theme(axis.text = element_blank())
gg
库(ggplot2)
图书馆(dplyr)
美国%
变异(区域=较低(区域))

gg结果比我预期的要多,但这里是我的解决方案。基本思想是使用
maps::map
函数以及
boundary=TRUE
interior=FALSE
来获得
“north dekota”
“south dekota”
的坐标,而不包括内部边界,并与其他状态分开绘制

步骤1:获取“megakotas”坐标。。。 在这里,我们使用
gissr::sort_points
按顺时针顺序对
地图
中的坐标进行排序,然后将
区域
替换为
“Megakota”
,而不是
“北达科他州”
“南达科他州”

第2步:在
arr
中将“北达科他州”和“南达科他州”替换为“Megakota”,并将其值相加。。。

最后一步:合并所有内容。。。
#安装gissr
#图书馆(devtools)
#安装依赖项
#安装github(“skgrange/threadr”)
#安装gissr
#安装github(“skgrange/gissr”)
图书馆(GG2)
图书馆(dplyr)
图书馆(地图)
图书馆(gissr)
美国合作伙伴%
排序点(y=“y”,x=“x”)%>%
突变(region=“megakotas”)
arr%
添加行名称(“区域”)%>%
在%c(“北达科他州”、“南达科他州”)中,突变(区域=替换(tolower(区域)、tolower(区域)%,
“megakotas”))%%>%
按地区划分的组别%>%
全部变异(总和)
ggplot(映射=aes(映射=区域,填充=谋杀))+
geom_地图(数据=过滤器(arr,区域!=“megakotas”),
地图=美国坐标,大小=0.15,颜色=“#ffffff”)+
geom_地图(数据=过滤器(arr,区域=“megakotas”),
地图=megakotas_coord,尺寸=0.15,颜色=“#ffffff”)+
扩展限制(x=美国合作$long,y=美国合作$lat)+
比例填充连续(低='thistle2',高='darkred',导向='colorbar')+
实验室(x=NULL,y=NULL)+
坐标图(“阿尔伯斯”,lat0=39,lat1=45)+
主题(panel.border=element_blank(),
panel.background=元素_blank(),
axis.ticks=元素_blank(),
axis.text=元素_blank())


注意:如果
map\u数据
尊重
boundary=TRUE
interior=FALSE
,这个解决方案会简单得多,根据
map\u数据
?map\u数据
明确表示可以将其他参数传递给
map::map()
)。不知何故,
map\u数据(“state”,region=c(“北达科他州”,“南达科他州”),boundary=TRUE,interior=FALSE)
似乎不起作用。

如果您不需要使用
geom\u地图
,并且愿意深入研究R中的一些空间包,例如
sf
,您可以通过以下方式实现这一点。下面是我使用全球行政区域的GADM数据库来划分州边界的示例

  • 使用
    raster::getData
    作为获取边界文件的便捷快捷方式<代码>级别
  • 是指行政级别,其中
    0
    是国家,而
    1
    是低于国家的第一级。请注意,这将把一个文件保存到您的工作目录中。我使用
    st_变换
    转换为Albers投影,正如您的示例所做的那样

  • 将多边形连接到
    USArrests
    数据集,并使用方便的
    dplyr
    工具组合达科他。请注意,我对两个州的值求和,尽管我不清楚这样做是否正确(这个值不是平均值,所以我们应该取平均值吗?),这会自动合并两个州的边界

  • 在打印之前,我使用
    st_simplify
    减少顶点数量,以加快打印速度。然后我们可以简单地使用
    geom\u sf
    并获得所需的绘图

  • 库(光栅)
    图书馆(tidyverse)
    图书馆(sf)
    #图书馆(sp)
    #图书馆(rgeos)
    州%
    st_as_sf()%>%
    st_变换(crs=3310)
    megakotas%
    左联合(
    y=行名到列(USArrests,var=“State”),
    by=c(“名称1”=“状态”)
    ) %>%
    过滤器(!NAME_1%,单位为%c(“哥伦比亚特区”、“阿拉斯加”、“夏威夷”))%>%
    突变(状态=fct\U崩溃(名称1,Megakotas=c(“北达科他州”、“南达科他州”))%>%
    按(州)分组%>%
    总结(谋杀=总和(谋杀))%>%
    st_simplify(公差=1000)
    ggplot(megakotas)+
    geom_sf(aes(填充=谋杀))+
    鳞片_填充_绿色_c()+
    主题_极小值()
    


    由(v0.2.1)于2019-03-07创建的正在使用
    geom_地图
    ,还是您只想拥有地图?答案很好,但这“非常”简单吗?你的代码行和我的答案差不多,没有主题。不需要管理单独的对象感觉概念上更简单,但我想这是一个意见问题。我会取消编辑的,明白了。我只是想知道你为什么认为它更简单
    # To install gissr
    # library(devtools)
    # Install dependency
    # install_github("skgrange/threadr")
    # Install gissr
    # install_github("skgrange/gissr")
    
    library(dplyr)
    library(maps)
    library(gissr)
    
    us_coord <- map_data("state") 
    megakotas_coord <- map("state", regions = c("north dakota", "south dakota"), 
                           boundary = TRUE, interior = FALSE, plot = FALSE)[c("x", "y")] %>%
      as.data.frame() %>%
      sort_points(y = "y", x = "x") %>%
      mutate(region = "megakotas")
    
    > head(megakotas_coord)
              x        y    region
    1 -104.0491 45.21210 megakotas
    2 -104.0434 45.87673 megakotas
    3 -104.0491 45.93976 megakotas
    4 -104.0491 45.93976 megakotas
    5 -104.0434 46.27207 megakotas
    6 -104.0434 46.53563 megakotas
    
    arr <- USArrests %>% 
      add_rownames("region") %>%
      mutate(region = replace(tolower(region), tolower(region) %in% c("north dakota", "south dakota"), 
                              "megakotas")) %>%
      group_by(region) %>%
      mutate_all(sum) 
    
    > arr %>% filter(region == "megakotas")
    # A tibble: 2 x 5
    # Groups:   region [1]
      region    Murder Assault UrbanPop  Rape
      <chr>      <dbl>   <int>    <int> <dbl>
    1 megakotas    4.6     131       89  20.1
    2 megakotas    4.6     131       89  20.1
    
    library(ggplot2)
    
    ggplot(mapping = aes(map_id=region)) +
      geom_map(data = filter(arr, region != "megakotas"), 
               map = us_coord, aes(fill = Murder),
               size = 0.15, color="#ffffff") +
      expand_limits(x = us_coord$long, y = us_coord$lat)
    
    ggplot(mapping = aes(map_id=region)) +
      geom_map(data = filter(arr, region == "megakotas"),
               map = megakotas_coord, aes(fill = Murder), 
               size = 0.15, color = "#ffffff") + 
      expand_limits(x = us_coord$long, y = us_coord$lat)
    
    # To install gissr
    # library(devtools)
    # Install dependency
    # install_github("skgrange/threadr")
    # Install gissr
    # install_github("skgrange/gissr")
    
    library(ggplot2)
    library(dplyr)
    library(maps)
    library(gissr)
    
    us_coord <- map_data("state") 
    megakotas_coord <- map("state", regions = c("north dakota", "south dakota"), 
                           boundary = TRUE, interior = FALSE, plot = FALSE)[c("x", "y")] %>%
      as.data.frame() %>%
      sort_points(y = "y", x = "x") %>%
      mutate(region = "megakotas")
    
    arr <- USArrests %>% 
      add_rownames("region") %>%
      mutate(region = replace(tolower(region), tolower(region) %in% c("north dakota", "south dakota"), 
                              "megakotas")) %>%
      group_by(region) %>%
      mutate_all(sum) 
    
    ggplot(mapping = aes(map_id=region, fill = Murder)) +
      geom_map(data = filter(arr, region != "megakotas"),
               map = us_coord, size = 0.15, color = "#ffffff") +
      geom_map(data = filter(arr, region == "megakotas"),
               map = megakotas_coord, size = 0.15, color = "#ffffff") + 
      expand_limits(x = us_coord$long, y = us_coord$lat) +
      scale_fill_continuous(low = 'thistle2', high = 'darkred', guide = 'colorbar') +
      labs(x=NULL, y=NULL) +
      coord_map("albers", lat0 = 39, lat1 = 45)  +
      theme(panel.border = element_blank(),
          panel.background = element_blank(),
          axis.ticks = element_blank(),
          axis.text = element_blank())