微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R ggmap 覆盖 geom_contour

如何解决R ggmap 覆盖 geom_contour

给出这个可重现的例子

# set the origin of the grid 
# in cartesian coordinates (epsg 32632)
xmin<-742966
ymin<-5037923

# set x and y axis
x<-seq(xmin,xmin+25*39,by=25)
y<-seq(ymin,ymin+25*39,by =25)

# define a 40 x 40 grid
mygrid<-expand.grid(x = x,y = y)

# set the z value to be interpolated by the contour
set.seed(123)
mygrid$z<- rnorm(nrow(mygrid))

library(tidyverse)

# plot of contour is fine
ggplot(data=mygrid,aes(x=x,y=y,z=z))+
  geom_contour()

library(ggspatial)

# transform coordinates to wgs84 4326
# (one of the possible many other ways to do it)
mygrid_4326<-xy_transform(mygrid$x,mygrid$y,from = 32632,to = 4326)

# create new grid with lon and lat 
# (geographical coordinates espg 4326)
mygrid_4326<-mygrid_4326%>%
  mutate(z=mygrid$z)

# define the bounding Box
my_bb<-c(min(mygrid_4326$x),min(mygrid_4326$y),max(mygrid_4326$x),max(mygrid_4326$y))
names(my_bb)<-c('left','bottom','right','top')

library(ggmap)

# get the background map (by a free provider)
mymap<-get_stamenmap(bBox = c(left = my_bb[['left']],bottom = my_bb[['bottom']],right = my_bb[['right']],top = my_bb[['top']]),zoom = 15,maptype = 'toner-lite')

# plot of the map is fine
mymap%>%
  ggmap()

# overlay the contour of z is failing
mymap%>%
  ggmap()+
  #geom_contour(data=mygrid_4326,mapping=aes(x = x,y = y,z = z))
  stat_contour(data=mygrid_4326,z = z))

Warning messages:
1: stat_contour(): Zero contours were generated 
2: In min(x) : no non-missing arguments to min; returning Inf
3: In max(x) : no non-missing arguments to max; returning -Inf

现在我正在寻找一种可行的解决方案来完成将使用 ggplot 制作的等高线图叠加到使用 ggmap 制作的底图上;由于某些我不完全理解的原因,这似乎是不可能的;

是否可能与坐标变换以某种方式影响网格的形状(变得不完全规则)有关?

这篇文章Plotting contours on map using ggmap 似乎接近问题的核心,但尚未给出明确的解决方案(如果存在)

如果可能的话,我想留在 ggplot (tidyverse) 设施中,而不求助于基本 R 的功能(例如,contourLines)。

感谢您的帮助

解决方法

经过漫长而曲折的道路后,我设法找到了我在这里发布的解决方案

# set the origin of the grid 
# in cartesian coordinates (epsg 32632)
xmin<-742966
ymin<-5037923

# set x and y axis
x<-seq(xmin,xmin+25*39,by=25)
y<-seq(ymin,ymin+25*39,by =25)

# define a 40 x 40 grid
mygrid<-expand.grid(x = x,y = y)

# set the z value to be interpolated by the contour
set.seed(123)
mygrid$z<- rnorm(nrow(mygrid))

library(sf)
# create simple feature in original crs
mygrid_sf <- st_as_sf(mygrid,coords = c("x","y"),crs = 32632)

# transform to crs 4326
mygrid_sf_4326<-st_transform(mygrid_sf,4326)    

# create contourlines
cL<-contourLines(x,y,matrix(mygrid$z,40,byrow = TRUE))

library(maptools)
# spatial line df
epsg_in<-'+init=epsg:32632'
cLdf<-ContourLines2SLDF(cL,proj4string=CRS(epsg_in))

# transform to sf
cLdf_sf <- st_as_sf(cLdf)

# reproject sf to 4326
cLdf_sf_4326<-st_transform(cLdf_sf,4326)

# define the bounding box
min_lon<-min(st_coordinates(mygrid_sf_4326)[,1])
max_lon<-max(st_coordinates(mygrid_sf_4326)[,1])
min_lat<-min(st_coordinates(mygrid_sf_4326)[,2])
max_lat<-max(st_coordinates(mygrid_sf_4326)[,2])

library(ggplot2) 
library(ggmap)

# get the map
mymap<-get_stamenmap(bbox = c(left = min_lon,bottom = min_lat,right = max_lon,top = max_lat),zoom = 15,maptype = 'toner-lite')


# this aproach is failing
mymap%>%
  ggmap()+
  geom_sf(data=cLdf_sf_4326,aes(colour=level))

#Adding new coordinate system,which will replace the existing one.
#Error in FUN(X[[i]],...) : object 'lon' not found

# but this is fine,because of this hack
# https://github.com/r-spatial/sf/issues/336

mymap%>%
  ggmap()+
  geom_sf(data=cLdf_sf_4326,aes(color=level),inherit.aes = FALSE)


# and finally this is another,cleaner,approach using ggspatial facilities

library(ggspatial)

ggplot() +
  annotation_map_tile(type = "osm") +
  geom_sf(data=cLdf_sf_4326,aes(color=level))

# rosm::osm.types()

ggplot() +
  annotation_map_tile(type = "stamenbw") +
  geom_sf(data=cLdf_sf_4326,aes(color=level))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。