【问题标题】:Colorbar from custom colorRampPalette来自自定义 colorRampPalette 的颜色条
【发布时间】:2012-03-08 01:12:44
【问题描述】:

我已经定义了一个 colorRampPalette:

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

如何为它绘制一个颜色条“图例”项目,最好只使用基本包?我正在寻找一个填充了该颜色渐变的矩形。

我真正追求的是一种生成与“栅格”栅格相同类型的图例(颜色条)的方法:

require(raster)
plot(raster("myfile.tif"), legend=T)

我需要能够将它放在另一个图的顶部。

【问题讨论】:

  • 有趣的是,在基础 R 中做到这一点是多么困难。通常 R 有这么多的魔力,但显然不适合彩条。我猜统计学家只考虑黑白?哈哈

标签: r colors


【解决方案1】:

我知道这是一个非常古老的问题,答案都很棒。我只是想指出你可以从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 的这个功能可能是在你们想出了很好的解决方案之后很久才添加的。

【讨论】:

    【解决方案2】:
    fields 包中的

    colorbar.plot() 是标准解决方案。许多人会在这里寻找将图例置于标准绘图区域或原始 x/y 范围之外的解决方案。 colorbar.plot() 的这种限制很容易通过以下方式克服:

    1. 绘制图像(),
    2. 使用 par(pin = c(width, length)) 扩展绘图设备的大小
    3. 使用原始 x 和 y 值调用 colorbar.plot()

    由于绘图设备的区域现在已扩大,图例将出现在原始 image() 绘图之外。尝试使用 x 和 y 值将图例放在您希望的任何位置。使用标准参数选项,渐变图例可以是水平的或垂直的。

    【讨论】:

    • 是的,但您还需要 'strip' 参数,到目前为止,它并不像应该弄清楚的那么简单。一个有效的代码示例通常是一个好的答案的一部分。
    【解决方案3】:

    不久前我做了一个很好的灵活函数来做这个。

    # 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。
    • 如果您取出 dev.new,您可以使用 package:Hmisc 中的 subplot 将其覆盖到现有地块上。
    • @Spacedman 你怎么能做到这一点?我总是遇到这个错误Error in plot.new() : plot region too large
    • 我有点不清楚“lut”是什么意思。该链接不再有效。
    【解决方案4】:

    制作一个矩阵,使用带有一些坐标轴参数的图像...

    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)
    

    【讨论】:

      猜你喜欢
      • 2020-11-02
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多