簡體   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