我想用渐变色绘制我的光栅(b1_mosaic_diff
):负值应从黄色变为红色,正数从浅蓝色变为深蓝色。
我有一个代码示例,但遗憾的是(我没有使用渐变红色我将heat.colors
与topo.colors
相同用于渐变蓝色:
plot(b1_mosaic_diff, col=ifelse(na.omit(as.data.frame(b1_mosaic_diff))<0, heat.colors(n=5), topo.colors(n=5)), main="Difference between mean & median: '+' representing higher mean")
我不想使用ggplot,因为我更容易坚持正常情节。这样做有可能吗? 提前谢谢!
答案 0 :(得分:2)
这有点繁琐,但我通常会生成n
(例如1000)颜色与两个互补的colourRampPalette
中的每一个(例如一个由红色/黄色和一个蓝色组成)。之后,如果颜色键的两边都没有均匀的长度,我将颜色向量的颜色向量与颜色键的较短部分对应,按照它的长度作为键的较长部分的比例(这更容易用下面的例子来解释。最后,我连接两个颜色向量并将其传递给rasterVis::levelplot
col.regions
参数。
以下是一个例子:
加载所需的库并创建虚拟栅格:
library(raster)
library(RColorBrewer)
library(rasterVis)
r <- raster(matrix(runif(100, -5, 10), 10))
创建颜色矢量。在这里,我使用RColorBrewer
调色板'YlOrRd'
(我将其反转为红色&gt;橙色&gt;黄色,因为颜色与最负面到最正面的顺序的栅格值相关联),以及'Blues'
。这些调色板每个仅提供9种颜色,因此我们将调色板传递给colorRampPalette
以生成许多插入(插值)颜色。在这里,我为每个调色板生成1000种颜色 - 这足以创建一个平滑的颜色键。
我们希望颜色键跨越栅格数据集中的值范围,范围从-5到10.因此,我们需要对将用于颜色键的较短臂的颜色矢量进行子集化(负值,即红色)。确切地说,我们想要删除红色向量的前500个值,因为密钥的<0
部分是>0
部分长度的一半。这给我们留下了500个橙黄色的矢量(我们丢下了最红的红色)和一个1000蓝色的矢量。
cols <- c(colorRampPalette(rev(brewer.pal(9, 'YlOrRd')))(1000)[501:1000],
colorRampPalette(brewer.pal(9, 'Blues'))(1000))
使用levelplot
绘制栅格,这比raster
个对象的常规绘图方法更灵活一些。为方便起见,我们首先创建一个下限和上限(z-limits)的向量。
zrng <- range(pretty(c(minValue(r), maxValue(r))))
levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000),
col.regions=cols, scales=list(draw=FALSE))
奖金锻炼!
要自动执行矢量子设置,您可以使用以下功能:
asym_colours <- function(r, pal1, pal2, n=2000) {
zrng <- range(pretty(c(minValue(r), maxValue(r))))
brks <- do.call(seq, as.list(c(max(abs(zrng)) * c(-1, 1), length.out=2*n)))
c(pal1(n)[(sum(brks < zrng[1]) + 1):n],
pal2(n)[1:(sum(brks < zrng[2] & brks > 0) + 1)])
}
例如:
r <- raster(matrix(runif(100, -0.3, 0.1), 10))
cols <- asym_colours(r, colorRampPalette(rev(brewer.pal(9, 'YlOrRd'))),
colorRampPalette(brewer.pal(9, 'Blues')))
zrng <- range(pretty(c(minValue(r), maxValue(r))))
levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000),
col.regions=cols, scales=list(draw=FALSE))
或者,使用不同的斜坡:
cols <- asym_colours(r, colorRampPalette(rev(brewer.pal(9, 'GnBu'))),
colorRampPalette(brewer.pal(9, 'PuRd')))
zrng <- range(pretty(c(minValue(r), maxValue(r))))
levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000),
col.regions=cols, scales=list(draw=FALSE))