繁体   English   中英

使用 R 创建分类栅格值的直方图? (或者,使用经纬度值创建 data.table)

[英]Use R to create a historgram of categorical raster values? (or, create data table with lat/long values)

我是 R 和一般编程的新手,请原谅我即将到来的无能。

我正在处理一个大型分类栅格。 本质上,大堡礁上每一个小于 10 米的像素都被分配了一个值:11、12、13 或 15。(原始文件在这里)。 我的最终目标是创建一个直方图,按纬度显示“碎石”类别(由值 12 给出)的频率。 它看起来与该图的第三个面板非常相似,但在它们显示“珊瑚栖息地”的地方,我会显示瓦砾。

我认为最好的方法是尝试将原始栅格转换为数据框,其中每一行代表一个像素,并且有三列:分类值(11、12、13 或 15)、纬度、和经度。 然后我可以使用这个数据框来创建任意数量的基本图。

理想情况下,我想在创建此数据框的过程中省略 NA,因为栅格为 152,505 x 112,421,但超过 99% 的像素是空的(由于大堡礁的形状)。

我可以使用 Raster 或 Terra 包轻松读取栅格和 plot:

benthic <- ("data/GBR10 GBRMP Benthic.tif")
benthic_r <-rast(benthic)
plot(benthic_r)

我尝试使用它来缩小它,以便将来的计算更容易。

benthic2 <- na.omit(benthic)
benthic2_r <- rast(benthic2)

但是发现 na.omit 只针对矢量数据,所以没有成功。

我正在尝试将Geocomputation 与 R一起使用,并想也许我会以某种方式使用 as.data.frame function,但我一直无法找到一种方法来使用它来创建我想要的那种表。

我也一直在浏览有关 Stars 和 RasterVis 包的信息。 我试图跳过数据框的想法并使用 rasterVis package 直接从原始栅格创建直方图:

dirY <- xyLayer(benthic_r, y) #trying to assign y axis to be the y values of the pixels (which are hopefully latitude...)
dirXY <- xyLayer(count(12), benthic_r) #trying to assign x values to be a count of the number of pixels with a value of 12

histogram(benthic_r, dirXY,
maxpixels = 1e+05,
strip=TRUE,
par.settings=rasterTheme(),
att = 1)

#attempting to follow https://cran.r-project.org/web/packages/rasterVis/rasterVis.pdf "histogram methods" section

我已经以多种方式对此进行了调整,但一切都会导致新的错误。

我不期待一个完整的代码解决方案,而是如果你能帮助我理解在哪里看以及如何逐步构建以创建将非常感激的图表。 首先尝试创建数据框是一种好方法吗? 或者这完全没有必要?

我找到的关于如何处理栅格数据的资源似乎都是关于处理卫星图像(连续栅格)的,我没有找到很多处理分类栅格的技术。 如果您知道使用分类栅格的好教程,那也将不胜感激。

在此先感谢您的任何建议。

我认为最简单的方法是聚合栅格,以便获得一列,其中包含感兴趣的值。 也就是说,每个纬度(行)对应一个像元。 这是一个例子:

# example data 
library(terra)
r <- rast(nrow=18)
values(r) <- sample(c(11,12,13,15), ncell(r), replace=TRUE)

# count the number of cells that are 12
r12 <- r == 12    

# aggregate the columns
a <- aggregate(r12, c(1, ncol(r)), sum)

# get the latitude for each row
lat <- yFromRow(a, 1:nrow(a))

您可以制作不同类型的图。 这里有两个例子。 我更喜欢纵轴上的纬度。

plot(values(a), lat, ylab="latitude", xlab="count")

barplot(rev(values(a)[,1]), horiz=T, names.arg=rev(lat), las=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM