使用 ggmap 绘制形状文件:当形状文件大于 ggmap 时进行裁剪

Plotting shape files with ggmap: clipping when shape file is larger than ggmap

我在尝试将 ggmap 与形状文件组合时遇到裁剪问题。 Kahle 和 Wickham (2013: 158) 中的示例工作正常,因为来自 ggmap 的光栅图像覆盖了整个形状文件。下面是我尝试为 U.S 绘制形状文件时发生的情况的示例。覆盖较小区域的 ggmap 图上的状态。 ggmap 显示纽约市,我想用 U.S 的边框覆盖它。状态(仅作为示例)。生成的地图没有任何意义。问题是形状文件被剪裁并且 ggplot 连接未剪裁的点。下面是代码。形状文件来自 here。我只是在这里展示最后一个情节。

我该如何解决这个问题?

path <- "PATH TO SHAPEFILE"
library("ggmap")
library("rgdal")

# shapefile
states <- readOGR(dsn = path, layer = "states")
states_df <- fortify(states)
# plot shapefile
plot(states, lwd = 0.1)
ggplot(states_df, aes(long, lat, group = group)) +
    geom_polygon(colour = "black", fill = NA, size = 0.1)


# combine ggmap with shapefile
map <- get_map("new york city", zoom = 10, source = "stamen")
ggmap(map, extent = "device")

ggmap(map, extent = "device") +
    geom_polygon(aes(long, lat, group=group), data = states_df, colour = "red", fill = NA, size = 1)

Kahle、David 和 Hadley Wickham。 2013. “Ggmap:使用 ggplot2 进行空间可视化。” R 杂志 5(1):144–61.

我会检查这个答案,当您放大时,ggmap 似乎没有以理想的方式处理多边形,即不在图上的项目被截断导致 'interesting' 结果到形状文件。

Polygons nicely cropping ggplot2/ggmap at different zoom levels

# transform for good measure
states <- spTransform(states,CRS("+datum=WGS84 +proj=longlat") )

# combine ggmap with shapefile
states_df <- fortify(states)

# get your map
map <-get_map("new york city", zoom = 10, source = "stamen")

a <- ggmap(map, # this is where we get our raster
       base_layer=ggplot(aes(x=long, y=lat), data=states_df), # this defines the region where things are plotted
       extent = "normal",  # this won't work with device, you need normal (see examples in ggmap documentation)
       maprange=FALSE
       ) +
coord_map( # use map's bounding box to setup the 'viewport' we want to see
  projection="mercator",
  xlim= c(attr(map, "bb")$ll.lon, attr(map, "bb")$ur.lon),
  ylim=c(attr(map, "bb")$ll.lat, attr(map, "bb")$ur.lat)
) +
geom_polygon( # plot the polygon
  aes(x=long, y=lat,group=group), data =states_df, color = "red", fill=NA, size = 1)

print(a)

输出:

作为旁注,您可能想使用 U.S 查看。州地图的人口普查数据,它们似乎比 ESRI 数据集的质量更高。

ftp://ftp2.census.gov/geo/pvs/tiger2010st/tl_2010_us_state10.zip

最后一点,两极附近的 ggmap 存在问题,因此我还会根据您感兴趣的州对您的数据进行子集化。

这是我的尝试。我经常使用 GADM 形状文件,您可以使用 raster 包直接导入。我对 NY、NJ 和 CT 的形状文件进行了子集化。您可能最终不必这样做,但减少数据量可能会更好。当我绘制地图时,ggplot 会自动删除位于 ggmap 图像 bbox 之外的数据点。因此,我不必做任何额外的工作。我不确定您使用的是哪个 shapefile。但是,GADM 的数据似乎可以很好地处理 ggmap 图像。希望这对你有帮助。

library(raster)
library(rgdal)
library(rgeos)
library(ggplot2)

### Get data (shapefile)
us <- getData("GADM", country = "US", level = 1)

### Select NY and NJ
states <- subset(us, NAME_1 %in% c("New York", "New Jersey", "Connecticut"))

### SPDF to DF
map <- fortify(states)

## Get a map
mymap <- get_map("new york city", zoom = 10, source = "stamen")


ggmap(mymap) +
geom_map(data = map, map = map, aes(x = long, y = lat, map_id = id, group = group))

如果你只想要线条,下面就是你想要的。

ggmap(mymap) +
geom_path(data = map, aes(x = long, y = lat, group = group))