21

我正在使用 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 <- 10)也不起作用(绘图时会忽略这些值)。

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

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

编辑:

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

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

6 回答 6

13

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

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),zlim=c(0,1) )
于 2017-08-03T21:06:43.847 回答
12

由于 image::raster 函数指定可以传递 image::base 参数(并建议可能使用 image::base ),所以你不应该为所有对 image 的调用指定相同的 col= 和 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)

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

于 2010-11-30T18:21:10.627 回答
5

添加为响应@Tomas 的答案

我最终使用的答案是:

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), 
    breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) ) 
于 2013-08-28T11:10:18.773 回答
4

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

 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)
于 2010-11-30T18:36:52.040 回答
1

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

plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05))
于 2016-02-02T23:20:45.693 回答
1

一个非常简单的解决方案通常应该有效(例如,使用 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)) ...

于 2020-02-15T15:17:29.097 回答