R - 如何改善 RasterVis levelplot 的颜色阴影?

R - How to improve color shading of a RasterVis levelplot?

我正在尝试改善水平图的颜色阴影。请看下面的代码:

# Load required packages
library(raster)
library(rasterVis)
library(viridis)

# Download file
download.file('https://www.dropbox.com/s/caya1ja5ukpih9e/raster_thiago.tif?dl=1',
              destfile="~/Desktop/raster_thiago.tif", method="auto")

# Open file
r <- readAll(raster("~/Desktop/raster_thiago.tif"))

# Raster version
plot(r, col=viridis_pal(option="D")(255))

请注意这张地图用 raster::plot 绘制时看起来如何清晰。颜色渐变很平滑,你看不到它们之间有任何 "contours"。然而,遗憾的是,光栅图不像水平图那样可定制。

现在,看看这个尝试对 RasterVis 做同样的事情:

# RasterVis version
levelplot(r, margin=FALSE,
          par.settings=rasterTheme(viridis_pal(option = "D")(255)))

你看到这张地图不像上一张那么清晰了吗?看起来调色板的分辨率不一样,您可以看到颜色渐变之间的边缘不那么平滑。

有什么方法可以改善这种外观吗?我尝试使用 par.settingscol.regions 参数,但其中 none 似乎有效。我可能遗漏了什么...

使用 levelplot(),您还需要显式提供一个 at = 参数,一个数值向量给出 col.regions = 中颜色对应的级别之间的断点。这是一个简单的可重现示例:

library(rasterVis)
library(viridis)

## Example raster
f <- system.file("external/test.grd", package="raster")
r <- raster(f)

## Option 1: Use `at=` and `col.regions=` to set color gradient
nlev <- 200
my.at <- seq(from = cellStats(r, "min"),
             to = cellStats(r, "max"),
             length.out = nlev + 1)
my.cols <- viridis_pal(option = "D")(nlev)
levelplot(r, margin = FALSE,
          at = my.at,
          col.regions = my.cols)


## Option 2: Pass options via `par.settings = rasterTheme()`
##
## (NOTE: this only works for nlev up to 100)
nlev <- 100
my.at <- seq(cellStats(r, "min"), cellStats(r, "max"),
             length.out = nlev + 1)
my.theme <- rasterTheme(viridis_pal(option = "D")(nlev))
levelplot(r, margin = FALSE,
          at = my.at,
          par.settings = my.theme)

要了解这是否有效,请比较使用 nlev = 10nlev = 200 绘制的图:

我想使用 maxpixels

建议选项 3
require(raster)
require(rasterVis)

pal=colorRampPalette(c("#4575B4","#74ADD1","#E0F3F8","white","#FEE090","#F46D43","#D73027"))
proj <- CRS('+proj=longlat +datum=WGS84')

df <- expand.grid(x = seq(-2, 2, .01), y = seq(-2, 2, .01))
df$z <- with(df, (3*x^2 + y)*exp(-x^2-y^2))
r <- rasterFromXYZ(df, crs=proj)

my.brks=seq(-0.6,1.2,by=0.2)
my.labels=as.character(round(my.brks,digits=1))

默认情节

levelplot(r, col.regions=pal, margin=FALSE,at=my.brks,scales=list(draw=FALSE),xlab=NULL,ylab=NULL)

如果设置了 maxpixels,结果看起来更平滑,就像 raster::plot()

levelplot(r, col.regions=pal, margin=FALSE,at=my.brks,scales=list(draw=FALSE),xlab=NULL,ylab=NULL, maxpixels = 1e6)