使用科学计数法为图表下方的2个栅格生成一个共同的图例(比例)

时间:2015-02-05 04:01:52

标签: r plot legend raster scientific-notation

我正在尝试绘制具有不同值的2个栅格,并使用相同的比例进行比较。我一直在尝试使用thisthis来解决问题。

我遇到两个问题:

  1. 我希望能够以科学记数法表示图例标记(有太多小数位可供使用)
  2. 我希望两个地块都有一个比例,在底部。
  3. 我熟悉使用legend(),但不确定如何使用绘图设置刻度的位置/方向和科学记数法。 我已经生成了一些示例数据来显示我遇到的问题:

    library(raster)
    set.seed(10)
    x = runif(2000000, -0.0005, .9875)
    y = runif(2000000, -0.0008, .99)
    xmat = matrix(x, nrow = 500)
    ymat = matrix(x, nrow = 500)
    xras = raster(xmat)
    yras = raster(ymat)
    min_ = min(minValue(xras), minValue(yras))
    max_ = max(maxValue(xras), maxValue(yras)) 
    

    绘制我正在使用的数据:

    par(mfrow = c(2,1))
    plot( xras, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min_,max_,length.out=100), legend = FALSE,  axes = FALSE )
    plot( yras, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min_,max_,length.out=100), legend = FALSE, axes = FALSE )
    r.range = c(min_, max_)
    

    生成我正在使用的图例:

    plot(xras, legend.only=TRUE, col=rev( rainbow( 99, start=0,end=1 ) ),  legend.width=1, legend.shrink=0.75, axis.args=list(at=seq(r.range[1], r.range[2], abs(r.range[1]-r.range[2])/4), labels=seq(r.range[1], r.range[2], abs(r.range[1]-r.range[2])/4), cex.axis=0.6), legend.args=list(text='Precipitation (m)', side=1, font=2, line=2.5, cex=0.8))
    

    我对任何方法/包都持开放态度来解决这个问题。我已经看到image()是用于绘制栅格的流行解决方案,但是希望能够保持投影与栅格相关联。

    重申我所希望的:显示两个光栅图(具有不同但相似的值(见示例)),下面有一个共同的图例,使用科学记数法。

2 个答案:

答案 0 :(得分:1)

这是一次尝试。它需要更多改进:

library(rasterVis)
set.seed(10)
x = runif(2000000, -0.0005, .9875)
y = runif(2000000, -0.0008, .99)
xmat = matrix(x, nrow = 500)
ymat = matrix(x, nrow = 500)
xras = raster(xmat)
yras = raster(ymat)
min_ = min(minValue(xras), minValue(yras))
max_ = max(maxValue(xras), maxValue(yras))
r.range = c(min_, max_)

levelplot(stack(xras, yras), col.regions = rev(rainbow(99, start=0, end=1)), colorkey = list(space = "bottom"))

enter image description here

答案 1 :(得分:1)

虽然@Pascal能够回答这个问题,但我发现我可以更灵活地完成原来的尝试。虽然我说科学记数法,但我不正确,只是想截断小数位,这是通过添加round函数完成的:

axis.args=list(at=seq(r.range[1], r.range[2], abs(r.range[1]-r.range[2])/4),                      labels=round(seq(r.range[1], r.range[2], abs(r.range[1]-.range[2])/4),2),  cex.axis=1),

我能够将图例放在下面(并修改内边距和外边距),并使用legend.shrinklegend.widthlegend.args调整其上的设置。最后,脚本是:

library(raster)

set.seed(10)
x = runif(2000000, -0.0005, .9875)
y = runif(2000000, -0.0008, .99)
xmat = matrix(x, nrow = 500)
ymat = matrix(x, nrow = 500)
xras = raster(xmat)
yras = raster(ymat)
min_ = min(minValue(xras), minValue(yras))
max_ = max(maxValue(xras), maxValue(yras))
op <- par(mfrow = c(2,1),
  oma = c(2,4,0,0) + 0.1,
  mar = c(5,0,1,1) + 0.1)
plot( xras, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min_,max_,length.out=100), legend = FALSE,  axes = FALSE )
plot( yras, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min_,max_,length.out=100), legend = FALSE, axes = FALSE )
r.range = c(min_, max_) 
plot(xras, col=rev( rainbow( 99, start=0,end=1 ) ), horizontal=TRUE, `breaks=seq(min_,max_,length.out=100), legend.only=TRUE, legend.shrink = 1, legend.width = 3, axis.args = list(at=seq(r.range[1], r.range[2], abs(r.range[1]-r.range[2])/4), labels = round(seq(r.range[1], r.range[2], abs(r.range[1]-r.range[2])/4),2),cex.axis=1), legend.args= list(text='Precipitation (XXX)', side=1, font=3, line = 2, cex=1))` 

使用示例数据看起来像这样:  enter image description here

这是我的真实数据(我在axes = TRUE命令中更改为plot()): enter image description here