R覆盖geom_polygon与ggmap对象,空间文件转换
R overlay geom_polygon with ggmap object, spatial file conversion
我在几个地方看到过这样的例子,包括 Rjournal 的 ggmap 文章 (https://journal.r-project.org/archive/2013-1/kahle-wickham.pdf)
并查看另一个演练 - https://markhneedham.com/blog/2014/11/17/r-ggmap-overlay-shapefile-with-filled-polygon-of-regions/
我遇到的问题只是实现这个。看起来很简单,但我遗漏了一些东西。
我正在使用威斯康星州自然资源部的威斯康星州县形状文件(免费)
https://data-wi-dnr.opendata.arcgis.com/datasets/8b8a0896378449538cf1138a969afbc6_3?geometry=-110.743%2C42.025%2C-68.93%2C47.48
代码如下:
library(rgdal)
shpfile <- readOGR(dsn = "[file path to the shapefile directory]",
stringsAsFactors = FALSE )
我可以使用 plot(shpfile)
很好地绘制 shapefile。接下来,我将其转换为适合在 ggplot 中绘图的格式。许多示例使用 "fortify" 但似乎已被 "tidy" 替换,后者是 "broom" 包的一部分。 FWIW,我用 fortify 试过它并得到相同的结果。
library(broom)
library(ggplot2)
library(ggmap)
tidydta <- tidy(shpfile, group=group)
现在我可以在 ggplot 中成功将 shapefile 绘制为多边形
ggplot() +
geom_polygon(data=tidydta,
mapping=aes(y=lat , x=long, group=group),
color="dark red", alpha=.2) +
theme_void()
接下来我使用 ggmap 检索背景地图。
wisc <- get_map(center = c(lon= -89.75, lat=44.75), zoom=7, maptype="toner")
问题是我不能合并这些。我假设整洁的转换一定有问题,或者我错过了一步。我收到一个错误:
in min(x): no non-missing arguments to min; returning Inf
我认为这是因为我在某处有一个零长度向量。
命令如下:
ggmap(wisc) +
geom_polygon(aes(x=long, y=lat, group=group),
data=tidydta,
color="dark red", alpha=.2, size=.2)
我已经使用 geom_point 成功地向地图添加了地理编码点,但我被多边形卡住了。
谁能告诉我我做错了什么?
您的 shapefile 使用的坐标系不是经纬度坐标系。在将其转换为 ggplot
的数据框之前,您应该对其进行转换。以下作品:
shpfile <- spTransform(shpfile, "+init=epsg:4326") # transform coordinates
tidydta2 <- tidy(shpfile, group=group)
wisc <- get_map(location = c(lon= -89.75, lat=44.75), zoom=7)
ggmap(wisc) +
geom_polygon(aes(x=long, y=lat, group=group),
data=tidydta2,
color="dark red", alpha=.2, size=.2)
为了将来参考,请通过将数据帧打印到控制台/使用可见的 x/y 轴标签进行绘图来检查您的坐标值。如果数字与背景地图边界框的数字大不相同(例如 7e+05 与 47),您可能需要进行一些转换。例如:
> head(tidydta) # coordinate values of dataframe created from original shapefile
# A tibble: 6 x 7
long lat order hole piece group id
<dbl> <dbl> <int> <lgl> <chr> <chr> <chr>
1 699813. 246227. 1 FALSE 1 0.1 0
2 699794. 246082. 2 FALSE 1 0.1 0
3 699790. 246007. 3 FALSE 1 0.1 0
4 699776. 246001. 4 FALSE 1 0.1 0
5 699764. 245943. 5 FALSE 1 0.1 0
6 699760. 245939. 6 FALSE 1 0.1 0
> head(tidydta2) # coordinate values of dataframe created from transformed shapefile
# A tibble: 6 x 7
long lat order hole piece group id
<dbl> <dbl> <int> <lgl> <chr> <chr> <chr>
1 -87.8 42.7 1 FALSE 1 0.1 0
2 -87.8 42.7 2 FALSE 1 0.1 0
3 -87.8 42.7 3 FALSE 1 0.1 0
4 -87.8 42.7 4 FALSE 1 0.1 0
5 -87.8 42.7 5 FALSE 1 0.1 0
6 -87.8 42.7 6 FALSE 1 0.1 0
> attr(wisc, "bb") # bounding box of background map
# A tibble: 1 x 4
ll.lat ll.lon ur.lat ur.lon
<dbl> <dbl> <dbl> <dbl>
1 42.2 -93.3 47.2 -86.2
# look at the axis values; don't use theme_void until you've checked them
cowplot::plot_grid(
ggplot() +
geom_polygon(aes(x=long, y=lat, group=group),
data=tidydta,
color="dark red", alpha=.2, size=.2),
ggplot() +
geom_polygon(aes(x=long, y=lat, group=group),
data=tidydta2,
color="dark red", alpha=.2, size=.2),
labels = c("Original", "Transformed")
)
我在几个地方看到过这样的例子,包括 Rjournal 的 ggmap 文章 (https://journal.r-project.org/archive/2013-1/kahle-wickham.pdf) 并查看另一个演练 - https://markhneedham.com/blog/2014/11/17/r-ggmap-overlay-shapefile-with-filled-polygon-of-regions/
我遇到的问题只是实现这个。看起来很简单,但我遗漏了一些东西。
我正在使用威斯康星州自然资源部的威斯康星州县形状文件(免费) https://data-wi-dnr.opendata.arcgis.com/datasets/8b8a0896378449538cf1138a969afbc6_3?geometry=-110.743%2C42.025%2C-68.93%2C47.48
代码如下:
library(rgdal)
shpfile <- readOGR(dsn = "[file path to the shapefile directory]",
stringsAsFactors = FALSE )
我可以使用 plot(shpfile)
很好地绘制 shapefile。接下来,我将其转换为适合在 ggplot 中绘图的格式。许多示例使用 "fortify" 但似乎已被 "tidy" 替换,后者是 "broom" 包的一部分。 FWIW,我用 fortify 试过它并得到相同的结果。
library(broom)
library(ggplot2)
library(ggmap)
tidydta <- tidy(shpfile, group=group)
现在我可以在 ggplot 中成功将 shapefile 绘制为多边形
ggplot() +
geom_polygon(data=tidydta,
mapping=aes(y=lat , x=long, group=group),
color="dark red", alpha=.2) +
theme_void()
接下来我使用 ggmap 检索背景地图。
wisc <- get_map(center = c(lon= -89.75, lat=44.75), zoom=7, maptype="toner")
问题是我不能合并这些。我假设整洁的转换一定有问题,或者我错过了一步。我收到一个错误:
in min(x): no non-missing arguments to min; returning Inf
我认为这是因为我在某处有一个零长度向量。
命令如下:
ggmap(wisc) +
geom_polygon(aes(x=long, y=lat, group=group),
data=tidydta,
color="dark red", alpha=.2, size=.2)
我已经使用 geom_point 成功地向地图添加了地理编码点,但我被多边形卡住了。
谁能告诉我我做错了什么?
您的 shapefile 使用的坐标系不是经纬度坐标系。在将其转换为 ggplot
的数据框之前,您应该对其进行转换。以下作品:
shpfile <- spTransform(shpfile, "+init=epsg:4326") # transform coordinates
tidydta2 <- tidy(shpfile, group=group)
wisc <- get_map(location = c(lon= -89.75, lat=44.75), zoom=7)
ggmap(wisc) +
geom_polygon(aes(x=long, y=lat, group=group),
data=tidydta2,
color="dark red", alpha=.2, size=.2)
为了将来参考,请通过将数据帧打印到控制台/使用可见的 x/y 轴标签进行绘图来检查您的坐标值。如果数字与背景地图边界框的数字大不相同(例如 7e+05 与 47),您可能需要进行一些转换。例如:
> head(tidydta) # coordinate values of dataframe created from original shapefile
# A tibble: 6 x 7
long lat order hole piece group id
<dbl> <dbl> <int> <lgl> <chr> <chr> <chr>
1 699813. 246227. 1 FALSE 1 0.1 0
2 699794. 246082. 2 FALSE 1 0.1 0
3 699790. 246007. 3 FALSE 1 0.1 0
4 699776. 246001. 4 FALSE 1 0.1 0
5 699764. 245943. 5 FALSE 1 0.1 0
6 699760. 245939. 6 FALSE 1 0.1 0
> head(tidydta2) # coordinate values of dataframe created from transformed shapefile
# A tibble: 6 x 7
long lat order hole piece group id
<dbl> <dbl> <int> <lgl> <chr> <chr> <chr>
1 -87.8 42.7 1 FALSE 1 0.1 0
2 -87.8 42.7 2 FALSE 1 0.1 0
3 -87.8 42.7 3 FALSE 1 0.1 0
4 -87.8 42.7 4 FALSE 1 0.1 0
5 -87.8 42.7 5 FALSE 1 0.1 0
6 -87.8 42.7 6 FALSE 1 0.1 0
> attr(wisc, "bb") # bounding box of background map
# A tibble: 1 x 4
ll.lat ll.lon ur.lat ur.lon
<dbl> <dbl> <dbl> <dbl>
1 42.2 -93.3 47.2 -86.2
# look at the axis values; don't use theme_void until you've checked them
cowplot::plot_grid(
ggplot() +
geom_polygon(aes(x=long, y=lat, group=group),
data=tidydta,
color="dark red", alpha=.2, size=.2),
ggplot() +
geom_polygon(aes(x=long, y=lat, group=group),
data=tidydta2,
color="dark red", alpha=.2, size=.2),
labels = c("Original", "Transformed")
)