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

时间:2010-11-30 17:40:49

标签: r maps raster

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

例如:

  • map 1的值为0到1
  • map 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) ) 

6 个答案:

答案 0 :(得分:10)

由于image :: raster函数指定可以传递image :: base参数(并建议可能使用了image :: base),所以你不能只指定相同的col =和breaks = arguments调用image :: raster?你需要让中断和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)

一个具体的例子可以帮助这项工作。

答案 1 :(得分: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)

答案 2 :(得分:4)

作为回应@Tomas

的答案添加

我最终使用的答案是:

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

通常应使用的非常简单的解决方案(例如,使用光栅包中的“绘图”功能)是设置“ 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)) ...

相关问题