使用科学记数法为地块下方的 2 个栅格生成一个通用图例(比例)
Generate a common legend (scale) for 2 rasters underneath the plots using scientific notation
我正在尝试绘制 2 个具有不同值且具有相同比例的栅格以进行比较。我一直在尝试使用 this and this.
找出答案
我 运行 有两个问题:
- 我希望能够用科学记数法来表示图例标签(小数点太多,没有任何用处)
- 我希望底部的两个地块都有一个比例尺。
我熟悉使用 legend(),但不确定如何使用 plot 设置比例的 position/direction 和科学记数法。
我已经生成了一些示例数据来显示我 运行 遇到的问题:
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))
我愿意接受任何 method/packages 来解决这个问题。我已经看到 image() 是一种流行的绘制栅格的解决方案,但更希望能够使投影与栅格保持关联。
重申我所希望的:显示两个光栅图(具有不同但相似的值(参见示例)),下面有一个共同的图例,使用科学记数法。
这是一个尝试。它需要更多的改进:
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"))
虽然@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.shrink
、legend.width
和 legend.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))`
样本数据看起来像这样:
这是我的真实数据(我在 plot()
命令中更改为 axes = TRUE
):
我正在尝试绘制 2 个具有不同值且具有相同比例的栅格以进行比较。我一直在尝试使用 this and this.
找出答案我 运行 有两个问题:
- 我希望能够用科学记数法来表示图例标签(小数点太多,没有任何用处)
- 我希望底部的两个地块都有一个比例尺。
我熟悉使用 legend(),但不确定如何使用 plot 设置比例的 position/direction 和科学记数法。 我已经生成了一些示例数据来显示我 运行 遇到的问题:
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))
我愿意接受任何 method/packages 来解决这个问题。我已经看到 image() 是一种流行的绘制栅格的解决方案,但更希望能够使投影与栅格保持关联。
重申我所希望的:显示两个光栅图(具有不同但相似的值(参见示例)),下面有一个共同的图例,使用科学记数法。
这是一个尝试。它需要更多的改进:
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"))
虽然@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.shrink
、legend.width
和 legend.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))`
样本数据看起来像这样:
这是我的真实数据(我在 plot()
命令中更改为 axes = TRUE
):