我正在try 向我的一些数字添加底图.从网上阅读来看,basemaps
套餐似乎是最好的 Select ,但我一直未能让它发挥作用,并且遇到了几个问题.
这是该图的原始代码,运行得非常好:
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())
这是我现在的身材:
我想在此图中添加底图.
当我try 添加行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
我似乎可以通过指定ext = st_bbox(canada)
来解决这个问题.然而,如果我try 用线basemap_gglayer(ext = st_bbox(canada))
绘制我的图形,我会得到另一个错误:
Error in `scale_fill_gradientn()`:
! Discrete values supplied to continuous scale.
ℹ Example values: "#91DED8", "#91DED8", "#91DED8", "#91DED8", and "#91DED8"
所以这不起作用.我try 将底图保存为单独的格栅,然后使用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())
这是输出:
这真的不是我想让它做的,哈哈.如果我只绘制基层,它看起来像这样:
理想情况下,我的最终身材看起来是这样的,我的原始身材只是分层在上面.
我的默认设置为basemaps::set_defaults(map_service = "esri", map_type = "world_terrain_base")
,因为我想避免需要API密钥的Google/Stadia map .我正在Linux ubuntu v 22.04.4上运行R 4.3.3.
编辑:以下是我的results
个 pyramid 的样子和 pyramid 的格栅:
> 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()
我不确定这是包裹的问题,还是我这边的问题.或者也许有更好的方法来获取底图!欢迎任何建议
编辑:请注意,我原始代码中的results.rast
格栅是从results
rame创建的,而不是相反(正如我在可复制代码中所做的那样)-但是,我认为它应该以同样的方式工作.我正在使用的rame是在很多很多步骤前从网格创建的(因此,如果问题来自这些原始网格,我将不得不重新运行几个月的工作..此时我宁愿放弃底图)