我尝试使用R为我的FieldBio项目生成带有示例区域的图形。到目前为止,我已经能够绘制我想要的美国州,绘制加拿大(国界),以覆盖这两张地图;但是,我想要做的是专门绘制以下州/省,不包括其他州/省: 加州 内华达 犹他州 科罗拉多州 怀俄明 蒙大拿 爱达荷州 华盛顿 俄勒冈 不列颠哥伦比亚省 艾伯塔
以下是我目前使用的代码:
>map('state', region = c('california', 'nevada', 'utah', 'colorado', 'wyoming', 'montana', 'idaho', 'oregon', 'washington'), xlim=c(-130,-90), ylim=c(30,60), fill=TRUE, col="gray95")
>map("worldHires","Canada", xlim=c(-130,-90), ylim=c(30,60), col="gray95", fill=TRUE, add=TRUE)
这会生成一个具有所需状态的地图,但加拿大作为一个国家(在我设置的分隔符处切断)。
有没有办法只做我想要的省份?我想我知道如何在这之后绘制点(我将它们作为带有纬度和长数据的.csv)。
我意识到(R: creating a map of selected Canadian provinces and U.S. states)非常相似,但我在这个特定示例的代码中有点迷失,而且我不需要突出显示任何特定内容。
由于
答案 0 :(得分:9)
喜欢这个吗?
library(raster)
states <- c('California', 'Nevada', 'Utah', 'Colorado', 'Wyoming', 'Montana', 'Idaho', 'Oregon', 'Washington')
provinces <- c("British Columbia", "Alberta")
us <- getData("GADM",country="USA",level=1)
canada <- getData("GADM",country="CAN",level=1)
us.states <- us[us$NAME_1 %in% states,]
ca.provinces <- canada[canada$NAME_1 %in% provinces,]
us.bbox <- bbox(us.states)
ca.bbox <- bbox(ca.provinces)
xlim <- c(min(us.bbox[1,1],ca.bbox[1,1]),max(us.bbox[1,2],ca.bbox[1,2]))
ylim <- c(min(us.bbox[2,1],ca.bbox[2,1]),max(us.bbox[2,2],ca.bbox[2,2]))
plot(us.states, xlim=xlim, ylim=ylim)
plot(ca.provinces, xlim=xlim, ylim=ylim, add=T)
因此,它使用包getData(...)
中的raster
函数从GADM站点获取美国各州和加拿大省的SpatialPolygonDataFrames。然后它只提取你想要的状态(注意相关的属性表字段是NAME_1
,并且状态/省需要正确地大写)。然后我们从两个(子集)映射的边界框计算x和y限制。最后我们渲染地图。请注意在第二次调用add=T
时使用plot(...)
。
这是一个ggplot
解决方案。
library(ggplot2)
ggplot(us.states,aes(x=long,y=lat,group=group))+
geom_path()+
geom_path(data=ca.provinces)+
coord_map()
此处的优点是ggplot
可以为您管理图层,因此您无需明确计算xlim
和ylim
。此外,IMO在添加附加层方面具有更大的灵活性。缺点是,对于像这样的高分辨率地图(尤其是加拿大西海岸),它的很多较慢。