自定义调色板的颜色条

21

我已经定义了一个 colorRampPalette:

my.colors = colorRampPalette(c("light green", "yellow", "orange", "red"))

我该如何绘制一个颜色条“图例”项,最好只使用基本包?我想要一个用该颜色渐变填充的矩形。
实际上,我想要一种方法来产生与“raster”栅格绘制的相同类型的图例(颜色条)。
require(raster)
plot(raster("myfile.tif"), legend=T)

我需要将这个放在另一个图表的上面。

2
有趣的是,在基本的R语言中实现这个功能是如此困难。通常情况下,R语言有很多魔法,但显然对于颜色条来说并不适用。我猜统计学家只会想到黑白?哈哈 - wordsforthewise
4个回答

35

我以前写过一个很棒的灵活函数来做这件事。

# Function to plot color bar
color.bar <- function(lut, min, max=-min, nticks=11, ticks=seq(min, max, len=nticks), title='') {
    scale = (length(lut)-1)/(max-min)

    dev.new(width=1.75, height=5)
    plot(c(0,10), c(min,max), type='n', bty='n', xaxt='n', xlab='', yaxt='n', ylab='', main=title)
    axis(2, ticks, las=1)
    for (i in 1:(length(lut)-1)) {
     y = (i-1)/scale + min
     rect(0,y,10,y+1/scale, col=lut[i], border=NA)
    }
}

那么你可以这样做:

> color.bar(colorRampPalette(c("light green", "yellow", "orange", "red"))(100), -1)

输入图像描述

更多示例请参见:http://www.colbyimaging.com/wiki/statistics/color-bars


1
你的轴比我的好看。+1。 - Spacedman
4
如果你删去dev.new,就可以使用Hmisc包中的subplot函数将它叠加在现有的图形上。 - Spacedman
@Spacedman,你怎么做到的?我总是遇到这个错误 Error in plot.new() : plot region too large - gabt
我不太清楚"lut"是什么意思。链接已经失效了。 - John Polo

10

创建一个矩阵,使用图像及一些轴参数...

my.colors = colorRampPalette(c("light green", "yellow", "orange", "red"))
z=matrix(1:100,nrow=1)
x=1
y=seq(3,2345,len=100) # supposing 3 and 2345 are the range of your data
image(x,y,z,col=my.colors(100),axes=FALSE,xlab="",ylab="")
axis(2)

图例


4

fields包中的colorbar.plot()是一个标准解决方案。许多人会在这里寻找将图例放置在标准绘图区域或原始x/y范围之外的解决方案。用colorbar.plot()绘制图像有个限制,可以通过以下方法轻松克服:

  1. 绘制你的image()
  2. 使用par(pin=c(宽度,长度))扩大绘图设备的尺寸
  3. 使用原始的x和y值调用colorbar.plot()

由于绘图设备的面积现在被扩大了,图例将出现在原始image()图之外。通过实验x和y值可以使图例出现在任何位置。渐变图例可以使用标准参数选项水平或垂直。


是的,但你还需要使用'strip'参数,而目前要弄清楚它并不像应该的那么简单。一个有效的代码示例通常是一个好答案的一部分。 - wordsforthewise

0

我知道这是一个非常古老的问题,而且答案都很好。我只想指出你可以从levelplot中平滑颜色条。

制作一些虚假数据和颜色渐变。

mat = matrix(rnorm(400,1,1), ncol=20)
grad = rev(rainbow(1000, start=rgb2hsv(col2rgb('green'))[1], 
       end=rgb2hsv(col2rgb('blue'))[1]))

制作图表并指定颜色条中的间断点。
levelplot(mat, col.regions=grad, colorkey = list(at=seq(0,max(mat),length.out=400)))

这个功能可能是在你们所有人想出好的解决方案之后很长时间才被添加到levelplot中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接