在R中的image.plot中自定义颜色范围

时间:2015-12-15 21:08:58

标签: r plot colors

有没有办法在image.plot()函数中绘制高于zlim截止值的值?这是一个例子:

library('gplots')
library('fields')
library('RColorBrewer')

rf <- colorRampPalette(rev(brewer.pal(11,'Spectral')))   # make colors
r <- rf(64)

z <- matrix(data = 0, nrow = 3, ncol = 3)
z[1,1] <- .15
z[2, ] <- .10
z[3, ] <- .05

image.plot(z,
           col = r,
           zlim = c(0, .10))

此代码生成此图像:

enter image description here

如果左下角(.15)的颜色为红色(如.10),我会喜欢它。但我无法通过image.plot()函数找到一种方法。

我应该提一下需要传说。而且,真实数据要大得多。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

快速破解,只需在颜色渐变中多次重复最终颜色,使该区域的颜色渐变“平坦”。因此,最高z值将具有相同的颜色:

library('gplots')
library('fields')
library('RColorBrewer')

# Original 11 colors
cols = rev(brewer.pal(11,'Spectral'))

# Repeat the 11th color an extra 5 times
cols = c(cols,rep(cols[11],5))

rf <- colorRampPalette(cols)   # make colors
r <- rf(64)

z <- matrix(data = 0, nrow = 3, ncol = 3)
z[1,1] <- .15
z[2, ] <- .10
z[3, ] <- .05

image.plot(z, col = r, zlim = c(0, .15))

enter image description here

更新:根据您的评论,以您希望的方式获取图例的最简单方法,可能只是将所有大于0.1的值更改为0.1(或者无论您的z-cutoff是什么)在绘图之前(z[z>0.1]=0.1)。然后你可以使用原始代码。

但是,如果出于某些原因你不想这样做,这里有一个解决方案(好吧,无论如何都是hack)来获得高于截止值的z值,而只显示截止值以下值的图例。首先,运行上面的代码。然后,下面的代码使用填充的白色矩形“覆盖”图例,并添加具有所需值范围的新图例。

请注意,在下面的解决方案中,0-0.15颜色渐变中的颜色 - 值映射通常不会完全匹配0-0.1颜色渐变的颜色,但是你可以通过调整在第一个颜色渐变中重复最终颜色的次数来使它们非常接近。为了获得完全匹配,我认为您可以使用colorRamp函数将特定颜色映射到特定的z值。

# Cover legend
rect(1.3,-1,1.6,2, col="white", border="white", xpd=TRUE)

# Go back to original 11 colors for color ramp
cols = rev(brewer.pal(11,'Spectral'))
rf <- colorRampPalette(cols)   # make colors
r <- rf(64)

# Plot only the legend with z cutoff at 0.10
image.plot(z, col = r, zlim = c(0, .10), legend.only=TRUE)

enter image description here