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

q9yhzks0  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(121)

我正在使用R中的“raster”包从光栅文件创建一些Map。我想创建比较光栅,并排显示几个Map。重要的是,无论每个Map中的值如何,所有Map使用的色标都是相同的。例如,如果Map1的值为0-1,Map2的值为0-0.5,值为0.5的单元格在两个Map上应具有相同的颜色。
举例来说:

  • Map1具有从0到1的值
  • 图2具有从0到0.5的值
  • 颜色从红色(最低)到绿色(最高)

我希望值0.5在两个贴图中具有相同的颜色(即黄色,介于红色和绿色之间)。当前行为是贴图1中为黄色,贴图2中为绿色。
我找不到一种方法来实现这一点。我找不到任何方法来设置与绘图函数一起使用的像素值范围。setMinMax()没有帮助(因为'plot'总是计算值)。甚至试图手动设置值(例如g1@data@max <- 10)也不起作用(这些在绘图时被忽略)。
最后,制作一堆Map(这可能会被期望以相同的颜色标度绘制所有内容)也不起作用-每个Map仍然有自己的颜色标度。
有什么想法吗?
编辑:
我最终使用的解决方案是:

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

字符串

5lwkijsr

5lwkijsr1#

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

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

字符串

niknxzdl

niknxzdl2#

由于image::raster函数指定了image::base参数可以被传递(并建议可能使用image::base),所以你不需要为所有对image::raster的调用指定相同的col=和breaks=参数吗?你需要让breaks和col参数“同步”。颜色的数量需要比breaks的数量少一个。下面的例子是基于经典的火山数据,第二个版本展示了如何从图像中排除一个范围的值:

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)

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

omhiaaxx

omhiaaxx3#

作为对@Tomas的回应而添加
我最终使用的答案是:

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

字符串

ct2axkht

ct2axkht4#

在“光栅”中还有更多的工作要做,但这里是一个黑客:

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归档文件以获取示例)如果您的栅格图层链接到一个非常大的文件,则可以在转到ggplot之前先执行此操作

r <- sampleRegular(r, size=100000, asRaster=TRUE)


然后也许

m <- as.matrix(r)
jpfvwuh4

jpfvwuh45#

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

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

字符串

5cg8jx4n

5cg8jx4n6#

一个非常简单的解决方案,通常应该工作(例如,与光栅包中的“plot”功能)是设置“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)).

5hcedyr0

5hcedyr07#

尝试rasterVis::levelplot(x),其中x是栅格文件的堆栈

相关问题