如何在R中创建具有相同颜色刻度的光栅图

23
我正在使用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) ) 

你最终采用的解决方案实际上是最佳答案。请将其作为答案并接受!我差点错过了它 - 我不会在问题中寻找答案。 - Tomas
1
spplot 函数可以显示一个包含全局图例的 RasterStackraster 包为 spplot 定义了一种方法,因此您无需将 RasterStack 转换为 Spatial* 对象即可使用它。 - Oscar Perpiñán
6个回答

17

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

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

12

由于image::raster函数指定可以传递image::base参数(并暗示可能使用image::base),因此您只需在所有image::raster调用中指定相同的col=和breaks=参数即可。您需要使得breaks和col参数“同步”。颜色数量必须比breaks数量少一个。下面的示例基于经典的volcano数据,第二个版本显示了如何从图像中排除一系列值:

 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))(抱歉,在评论中似乎无法格式化!) - mo-seph
编辑您的问题并保存您的解决方案,以备将来使用。它可能会在某一天派上用场。 - Roman Luštrik

5

作为对 @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)

1

对我没用。我使用了这个脚本来拆分颜色比例尺并选择更适合我的数据的颜色:

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

1
一个相当简单的解决方案(例如在raster包中使用“plot”函数),通常是设置“z轴”限制(控制颜色和颜色图例)。
例如,您可以执行以下操作: plot(d, zlim=c(0,1)) 其中d是堆叠的栅格对象。或者,如果您有一堆单独的栅格d1、d2、d3...,您可以这样做: plot(d1, zlim=c(0,1)) plot(d2, zlim=c(0,1)) plot(d3, zlim=c(0,1)) ...

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