使用basemaps_gglayer()添加底图失败的技术求助
问题:使用basemaps包为ggplot绘图添加底图失败
原绘图代码可正常运行:
ggplot() + geom_raster(subset(results, !is.na(var)), mapping = aes(long, lat, fill = var), interpolate = TRUE) + coord_sf(datum = "ESRI:102001") + scale_fill_gradientn('Variance', colours = colors) + #limits = c(0, 1)) + geom_sf(data = lg.parks, fill = NA, color = "black") + geom_sf(data = canada, fill = NA, color = "black") + annotation_scale(location = "bl", width_hint = 0.5) + annotation_north_arrow(location = "bl", which_north = "true", pad_x = unit(0.75, "in"), pad_y = unit(0.5, "in"), style = north_arrow_fancy_orienteering) + theme_void() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.title.x=element_blank(), axis.title.y=element_blank())
尝试添加底图时的错误情况
错误1:使用basemap_gglayer(ext = ext(canada))
Error in st_transform.sfc(st_as_sfc(st_bbox(x)), crs = crs_webmerc) :
cannot transform sfc object with missing crs
错误2:改用ext = st_bbox(canada)后
Error in
scale_fill_gradientn():
! Discrete values supplied to continuous scale.
ℹ Example values: "#91DED8", "#91DED8", "#91DED8", "#91DED8", and "#91DED8"
尝试用tidyterra绘制底图的情况
尝试将底图保存为独立栅格,用tidyterra::geom_spatraster()绘制,代码如下:
bm <- basemaps::basemap_raster(ext = st_bbox(canada)) bm <- as(bm, "SpatRaster") ggplot() + geom_spatraster(data = bm) + geom_raster(subset(results, !is.na(var)), mapping = aes(long, lat, fill = var), interpolate = TRUE) + coord_sf(datum = "ESRI:102001") + scale_fill_gradientn('Variance', colours = colors) + #limits = c(0, 1)) + geom_sf(data = lg.parks, fill = NA, color = "black") + geom_sf(data = canada, fill = NA, color = "black") + annotation_scale(location = "bl", width_hint = 0.5) + annotation_north_arrow(location = "bl", which_north = "true", pad_x = unit(0.75, "in"), pad_y = unit(0.5, "in"), style = north_arrow_fancy_orienteering) + theme_void() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.title.x=element_blank(), axis.title.y=element_blank())
单独绘制底图显示正常,但叠加后效果不符合预期,无法实现底图与原绘图的正常叠加。
数据结构与可复现代码
数据结构
head(results) lat long park ecozone var mean_res mean cv 1 69.425 -125.025 FALSE ARC 0.02040808 -0.15004042 0.2764668 0.682502 2 72.125 -124.125 TRUE ARC 0.03036255 -0.07685251 0.1612495 1.433145 3 73.025 -123.675 TRUE ARC 0.02992938 -0.07491194 0.1648732 1.381233 4 73.025 -123.225 TRUE ARC 0.02981253 -0.07340767 0.1551282 1.444258 5 72.575 -122.775 TRUE ARC 0.02772352 -0.06835325 0.1393356 1.590863 6 72.125 -122.325 TRUE ARC 0.02867879 -0.05654028 0.1109921 1.988154 results.rast class : SpatRaster dimensions : 91, 196, 1 (nrow, ncol, nlyr) resolution : 0.45, 0.45 (x, y) extent : -141, -52.8, 42.2, 83.15 (xmin, xmax, ymin, ymax) coord. ref. : WGS 84 / Pseudo-Mercator (EPSG:3857) source(s) : memory name : var min value : 0.000000 max value : 0.177362
可复现代码
library(ggplot2) library(rgeoboundaries) #for canada shapefile library(basemaps) library(tidyterra) library(terra) #for crop + mask functions #canada shapefile canada <- geoboundaries("Canada") basemaps::set_defaults(map_service = "esri", map_type = "world_terrain_base") #generate a raster x <- raster(ncol=50, nrow=50, xmn=-141, xmx=-52, ymn=41, ymx=83) y <- crop(x, canada) values(y) <- 1:ncell(y) y <- mask(y, canada) z <- as.data.frame(y, xy = TRUE) #convert to dataframe for ggplot ggplot() + #basemap_gglayer(ext = st_bbox(canada)) + geom_raster(subset(z, !is.na(layer)), mapping = aes(x, y, fill = layer), interpolate = TRUE) + coord_sf(datum = "ESRI:102001") + geom_sf(data = canada, fill = NA, color = "black") + theme_void()
环境信息
- R版本:4.3.3
- 系统:Ubuntu 22.04.4
- 已设置basemaps默认参数:
basemaps::set_defaults(map_service = "esri", map_type = "world_terrain_base")
不确定是包的问题还是操作问题,寻求解决方法。
内容的提问来源于stack exchange,提问作者rsmarcus
相关产品推荐
相关产品推荐

