R 在geom_地图中合并北达科他州和南达科他州
在本例中,使用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,
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())