【问题标题】:How can I create raster plots with the same colour scale in R如何在 R 中创建具有相同色阶的栅格图
【发布时间】:2011-05-18 00:45:37
【问题描述】:

我正在使用 R 中的“raster”包从栅格文件创建一些地图。我想创建比较栅格,并排显示几个地图。重要的是,所有地图使用的色标都是相同的,无论每张地图中的值如何。例如,如果地图 1 的值介于 0-1 之间,而地图 2 的值介于 0-0.5 之间,则值为 0.5 的单元格在两个地图上应该具有相同的颜色。

例如:

  • 地图 1 的值从 0 到 1
  • 地图 2 的值从 0 到 0.5
  • 颜色从红色(最低)变为绿色(最高)

我希望 0.5 的值在两张地图中具有相同的颜色(即黄色,介于红色和绿色之间)。当前的行为是在地图 1 中为黄色,在地图 2 中为绿色。

我找不到方法来完成这项工作。我看不到任何方法来设置与绘图功能一起使用的像素值范围。 setMinMax() 没有帮助(因为 'plot' 总是计算值)。即使尝试手动设置值(例如 g1@data@max

最后,制作一堆地图(这可能会以相同的色标绘制所有内容)也不起作用 - 每张地图仍然有自己的色标。

关于如何做到这一点的任何想法?

编辑:

我最终使用的解决方案是:

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) ) 

【问题讨论】:

  • 您最终使用的解决方案实际上是最佳答案。请把它作为答案并接受!我差点错过了——我不会在问题中寻找答案。
  • spplot 显示一个RasterStack,其中包含所有图层的全局图例。 raster 包为spplot 定义了一个方法,因此您无需将RasterStack 转换为Spatial* 对象即可使用它。

标签: r maps raster


【解决方案1】:

由于 image::raster 函数指定可以传递 image::base 参数(并建议可能使用 image::base),所以你不应该只为所有指定相同的 col= 和 breaks= 参数吗?调用 image::raster?你确实需要让breaks和col参数“同步”。颜色的数量需要比中断的数量少一。下面的示例基于经典的火山数据,第二个版本显示了如何从图像中排除一系列值:

 x <- 10*(1:nrow(volcano))
 y <- 10*(1:ncol(volcano))
 image(x, y, volcano, col = terrain.colors( length(seq(90, 200, by = 5))-1), axes = FALSE, breaks= seq(90, 200, by = 5) )
 axis(1, at = seq(100, 800, by = 100))
 axis(2, at = seq(100, 600, by = 100))
 box()
 title(main = "Maunga Whau Volcano", font.main = 4)



 x <- 10*(1:nrow(volcano))
 y <- 10*(1:ncol(volcano))
 image(x, y, volcano, col = terrain.colors( length(seq(150, 200, by = 5))-1), axes = FALSE, breaks= seq(150, 200, by = 5) )
 axis(1, at = seq(100, 800, by = 100))
 axis(2, at = seq(100, 600, by = 100))
 box()
 title(main = "Maunga Whau Volcano Restricted to elevations above 150", font.main = 4)

一个具体的例子将有助于这项工作。

【讨论】:

  • 太完美了,非常感谢!我最终做了 plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min(minValue( d )),max(maxValue(d)),length.out= 100) ) (抱歉,无法在 cmets 中格式化!)
  • 编辑您的问题并为后代保存您的解决方案。有一天它可能会派上用场。
【解决方案2】:

现在简单的解决方案是使用 zlim 选项。

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),zlim=c(0,1) )

【讨论】:

    【解决方案3】:

    作为对@Tomas 的回应而添加

    我最终使用的答案是:

    plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), 
        breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) ) 
    

    【讨论】:

      【解决方案4】:

      在“光栅”中还有更多工作要做,但这里有一个技巧:

       library(raster)
       r1 <- r2 <- r3 <- raster(ncol=10, nrow=10)
       r1[] <- runif(ncell(r1))
       r2[] <- runif(ncell(r2)) / 2
       r3[] <- runif(ncell(r3)) * 1.5
       r3 <- min(r3, 1)
       s <- stack(r1, r2, r3)
      
      
       brk <- c(0, 0.25, 0.5, 0.75, 1)
       par(mfrow=c(1,3))
       plot(r1, breaks=brk, col=rainbow(4), legend=F)
       plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)
       plot(r2, breaks=brk, col=rainbow(4), legend=F)
       plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)
       plot(r3, breaks=brk, col=rainbow(4), legend=F)
       plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)
      

      也可以使用spplot函数(sp包)

       s <- stack(r1, r2, r3) 
       sp <- as(s, 'SpatialGridDataFrame')
       spplot(sp)
      

      您还可以将值发送到 ggplot(搜索 r-sig-geo 档案以获取示例) 如果您的 RasterLayer 链接到一个非常大的文件,您可能会先这样做,然后再转到 ggplot

      r <- sampleRegular(r, size=100000, asRaster=TRUE) 
      

      然后也许

      m <- as.matrix(r)
      

      【讨论】:

        【解决方案5】:

        它对我不起作用。我用这个脚本来分割色阶,根据我的数据选择一个更合适的:

        plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05))
        

        【讨论】:

          【解决方案6】:

          一个通常应该有效的非常简单的解决方案(例如,使用 raster 包中的“绘图”功能)是设置“z 轴”限制(控制颜色和颜色图例)。

          例如您可以执行以下操作: plot(d, zlim=c(0,1))

          其中 d 是堆叠的光栅对象。或者,如果您有一堆单独的栅格 d1、d2、d2...,您可以这样做: plot(d1, zlim=c(0,1)) plot(d2, zlim=c(0,1)) plot(d3, zlim=c(0,1)) ...

          【讨论】:

            猜你喜欢
            • 2016-08-08
            • 1970-01-01
            • 1970-01-01
            • 2016-07-29
            • 1970-01-01
            • 1970-01-01
            • 2011-11-08
            • 1970-01-01
            • 2020-12-03
            相关资源
            最近更新 更多