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

7
当我尝试将ggmap与形状文件组合时,我遇到了剪切问题。Kahle和Wickham(2013:158)中的示例效果很好,因为ggmap的光栅图像覆盖了整个形状文件。下面是一个示例,当我尝试在覆盖较小区域的ggmap绘制美国州的形状文件时发生的情况。ggmap显示纽约市,我想将其与美国各州的边界叠加(仅作为示例)。结果地图没有任何意义。问题在于形状文件被剪裁,而ggplot连接未被剪裁的点。以下是代码。形状文件来自这里。我只在此处显示最后一个图。

如何解决这个问题?

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。 enter image description here

这个问题是否与此处的问题相关:https://dev59.com/b2Yr5IYBdhLWcg3ws8NT? - user1965813
2个回答

5
这是我的翻译尝试。我经常使用GADM的shapefile,您可以直接使用raster包导入。我对NY、NJ和CT的shapefile进行了子集处理。您最终可能不必这样做,但最好减少数据量。当我绘制地图时,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))

enter image description here


不错的结果,使用geom_path绘制多边形时会遇到一个问题,如果形状文件中的顶点数量不足够高,则在地图边缘附近会出现截断。 - Jonathan Lisic
这个问题是否解决了截断问题 ggmap(mymap) + geom_map(data = map, map = map, aes(x = long, y = lat, map_id = id, group = group), color = "black", fill=NA, size = 0.5)?我看到边界线的顶部中间有问题,但似乎 geom_mapfill=NA 并不是这种情况。 - user2503795
@user2503795 看起来你的代码运行良好。我为你感到高兴。 :) - jazzurro
@jazzurro:谢谢!根据您的解决方案,我认为回答我的问题最简单的方法是:使用geom_map而不是geom_polygon并调整参数(将“map = [fortified dataframe]”和“map_id = id”添加到aes调用中作为美学要素)。 - user2503795
@user2503795,很高兴听到你基于这个答案找到了解决方案。感谢你在这里分享自己的想法。这将有助于未来其他用户。 :) - jazzurro
谢谢!你如何做相反的操作?将多边形外部变为透明的呢? - Agus camacho

2

我建议查看这个答案,似乎ggmap不能理想地处理多边形,尤其是当你放大时,没有在图上的物品会被截断,导致与形状文件相关的“有趣”结果。

不同缩放级别下,优雅地裁剪ggplot2/ggmap中的多边形

# 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)

输出如下:enter image description here

顺便提一句,你可能想查看使用美国人口普查数据制作州地图的方法,它们似乎比 ESRI 数据集的质量更高。

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

最后,ggmap 在极点附近存在问题,因此我建议您还应该按照您感兴趣的州对数据进行子集划分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接