2010-11-30 79 views
13

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

例如:

  • 图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)) 
+0

您最终使用的解决方案实际上是最佳答案。请把它作为答案并接受!我几乎错过了 - 我不在一个问题中寻找答案。 – TMS 2013-08-26 08:09:41

+1

`spplot`为所有图层显示一个具有全局图例的`RasterStack`。 `raster`包为`spplot`定义了一个方法,所以你不需要将`RasterStack`转换为`Spatial *`对象来使用它。 – 2013-08-28 22:44:25

回答

7

由于图像::光栅函数指定该图像::碱参数可以被传递(并且表明图像::基地可能会使用),你不会只是指定相同的col =和breaks =参数的所有调用image :: raster?你需要得到“同步”的休息和上校论据。颜色的数量需要少于中断的数量。下面的例子是基于经典的火山数据和第二版本显示了如何值的范围可从图像中排除:

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) 

一个具体的例子将有助于这一努力。

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) 
3

加入响应@Tomas

的答案,我结束了使用的答案是:

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

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

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

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

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