题
我正在使用R中的“栅格”软件包从Raster文件创建一些地图。我想创建比较栅格,并并排显示几张地图。重要的是,无论每个地图中的值如何,所有地图都使用的颜色尺度相同。例如,如果MAP 1的值从0-1起,并且MAP 2的值从0-0.5起,则值为0.5的单元格在两个地图上应具有相同的颜色。
例如:
- 地图1的值从0到1
- 地图2的值从0到0.5
- 颜色从红色(最低)变为绿色(最高)
我希望值为0.5的值在两个地图中具有相同的颜色(即黄色,在红色和绿色之间)。当前的行为是它在地图1中是黄色的,而在地图2中是绿色的。
我找不到做这项工作的方法。我看不到设置用于绘图函数的像素值的范围。 setMinmax()无济于事(因为'绘图始终计算值)。即使尝试通过手动设置值(例如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) )
解决方案
由于图像::栅格函数指定图像::基本参数可以传递(并建议使用image ::基本可能使用),因此您是否不仅指定相同的col = and breaks = rows = to to to to to to Image的所有调用::栅格?你 做 需要“同步”获得休息和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)
一个具体的例子将有助于这项工作。
其他提示
在“栅格”中还有更多工作要做,但这是一个黑客:
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(搜索Rasterlayer链接到一个非常大的文件,您可能会首先要这样做,然后再访问GGPLOT,请先将值发送到GGPLOT(搜索R-Sig-Geo档案以获取示例)。
r <- sampleRegular(r, size=100000, asRaster=TRUE)
然后也许
m <- as.matrix(r)
添加为响应@Tomas的答案
我最终使用的答案是:
plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),
breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) )
现在简单的解决方案是使用Zlim选项。
plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),zlim=c(0,1) )
它对我不起作用。我使用此脚本来分开色标,并根据我的数据选择更合适的颜色:
plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05))