如何创建仅包含两个 类 的分类栅格值的箱线图?
How to create a boxplot containing the values of a classified raster for only two classes?
我有一个包含 12 个 类 的分类栅格,名称为“1”、“2”、“3”等,代表土地利用。我有第二个栅格,其中包含一些代表蒸散率的值。
我正在尝试为 类 2 和 10 的蒸散率创建一个箱线图。
我能够创建箱线图,但它们包含所有 类,但我只想获得 类 2 和 10。
下面的代码是:
r,包含12的分类栅格类和evapo,包含蒸散值的栅格
boxplot(evapo, r)
任何帮助都会很棒!
在无法看到您的数据集的情况下,我无法确定此解决方案是否适合您,但这应该可以帮助您。
boxplot(evapo[which(class == 2 | 10)], r[which(class == 2 | 10)])
或者,您可以从您的蒸发器和 r 生成 'new' 光栅,其中仅包含 类 为 2 和 10 的信息,然后 运行 包含这些的箱线图。
library(raster)
library(ggplot2)
library(dplyr)
r <- raster(nc=10, nr=5)
r[] <- runif(ncell(r), min=10, max=20) * 2
#plot(r)
s <- setValues(r,
sample(c(1:4), replace = T, size=50)
)
plot(s)
ct <- crosstab(r,s, useNA=TRUE, long=TRUE)
ct2 <- ct[ rep( seq(dim(ct)[1]), ct$Freq), ]
ggplot(filter(ct2, layer.2 %in% c(1,2)), aes(y=as.numeric(layer.1), x=layer.2)) +
geom_boxplot()
这是 Paulo 解决方案的变体
library(raster)
r <- raster(nc=10, nr=5)
r[] <- runif(ncell(r), min=10, max=20) * 2
s <- setValues(r, sample(c(1:4), replace = T, size=50))
rs <- stack(r, s)
names(rs) <- c('r', 's')
d <- as.data.frame(rs)
# all classes
boxplot(r~s, data= d)
# only class 2 and 4
boxplot(r~s, data=d[d$s %in% c(2,4), ])
如果由于栅格太大而无法制作d
,您可以采用大样本来代替近似结果
n <- 10000
d <- data.frame(sampleRegular(rs, n))
我有一个包含 12 个 类 的分类栅格,名称为“1”、“2”、“3”等,代表土地利用。我有第二个栅格,其中包含一些代表蒸散率的值。 我正在尝试为 类 2 和 10 的蒸散率创建一个箱线图。
我能够创建箱线图,但它们包含所有 类,但我只想获得 类 2 和 10。
下面的代码是: r,包含12的分类栅格类和evapo,包含蒸散值的栅格
boxplot(evapo, r)
任何帮助都会很棒!
在无法看到您的数据集的情况下,我无法确定此解决方案是否适合您,但这应该可以帮助您。
boxplot(evapo[which(class == 2 | 10)], r[which(class == 2 | 10)])
或者,您可以从您的蒸发器和 r 生成 'new' 光栅,其中仅包含 类 为 2 和 10 的信息,然后 运行 包含这些的箱线图。
library(raster)
library(ggplot2)
library(dplyr)
r <- raster(nc=10, nr=5)
r[] <- runif(ncell(r), min=10, max=20) * 2
#plot(r)
s <- setValues(r,
sample(c(1:4), replace = T, size=50)
)
plot(s)
ct <- crosstab(r,s, useNA=TRUE, long=TRUE)
ct2 <- ct[ rep( seq(dim(ct)[1]), ct$Freq), ]
ggplot(filter(ct2, layer.2 %in% c(1,2)), aes(y=as.numeric(layer.1), x=layer.2)) +
geom_boxplot()
这是 Paulo 解决方案的变体
library(raster)
r <- raster(nc=10, nr=5)
r[] <- runif(ncell(r), min=10, max=20) * 2
s <- setValues(r, sample(c(1:4), replace = T, size=50))
rs <- stack(r, s)
names(rs) <- c('r', 's')
d <- as.data.frame(rs)
# all classes
boxplot(r~s, data= d)
# only class 2 and 4
boxplot(r~s, data=d[d$s %in% c(2,4), ])
如果由于栅格太大而无法制作d
,您可以采用大样本来代替近似结果
n <- 10000
d <- data.frame(sampleRegular(rs, n))