我正在使用R中的“光栅”包从光栅文件创建一些地图。我想创建比较光栅,并排显示几张地图。重要的是,无论每个地图中的值如何,所使用的颜色比例对于所有地图都是相同的。例如,如果地图1的值为0-1,而地图2的值为0-0.5,则值为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 :(得分: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))
...