[R] boxplot of raster and shapefile
sibyiie@stoeckii m@iii@g oii gmx@ch
sibyiie@stoeckii m@iii@g oii gmx@ch
Wed Aug 28 09:34:58 CEST 2024
Dear Ivan
In the meantime I have found a much easier function. As before the code does not work with my own dataset, probably because of my multipolygonal shape file. There is a warning, that z coordinate are ignored. I provided the output of my shapefile. I changed from read_sf to vect() as I have read that this would work better.
Probably this warming message drives the error when running e <- extract(r,v): “ cannot find an inherited method for function ‘extract’ for signature ‘’RasterLayer‘, “SpatVector”’
Working example
# load libraries
library(terra)
library(ggplot2)
# Load shp and raster from example files of terra
(v <- vect(system.file("ex/lux.shp", package="terra")))
(r <- rast(system.file("ex/elev.tif", package="terra")))
plot(r); plot(v, add = TRUE); text(v, labels = "NAME_2", col=c("white"))
# extract, include names from vector attributes
e <- extract(r,v)
e$NAME_2 <- v$NAME_2[e$ID]
str(e)
# plot
ggplot(e, aes(x = NAME_2, y = elevation)) +
geom_boxplot() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45))
Personal example not working
# Load shp file
> v <- vect("C:/Users/…._BiogeoRegion.shp")
Warning message:
[vect] Z coordinates ignored
> str(v)
S4 class 'SpatVector' [package "terra"]
> names(v)
[1] "RegionNumm" "RegionName" "Unterregio" "Unterreg_1" "ObjNummer" "Version" "Shape_Leng" "Shape_Area" "DERegionNa" "FRRegionNa" "ITRegionNa"
[12] "DEBioBedeu" "FRBioBedeu" "ITBioBedeu"
> v
class : SpatVector
geometry : polygons
dimensions : 12, 14 (geometries, attributes)
extent : 2485410, 2833842, 1075268, 1295934 (xmin, xmax, ymin, ymax)
source : N2020_Revision_BiogeoRegion.shp
coord. ref. : CH1903+ / LV95 (EPSG:2056)
names : RegionNumm RegionName Unterregio Unterreg_1 ObjNummer Version Shape_Leng Shape_Area DERegionNa FRRegionNa (and 4 more)
type : <int> <chr> <int> <chr> <chr> <chr> <num> <num> <chr> <chr>
values : 1 R1 11 U11 1 2020/05/08 7.251e+05 4.171e+09 Jura Jura
2 R2 21 U21 2 2020/05/08 3.344e+05 1.112e+09 Mittelland Plateau
2 R2 22 U22 3 2020/05/08 5.397e+05 1.068e+09 Mittelland Plateau
# lodad raster files
#first import all files in a single folder as a list
rastlist_pres <- list.files(path ="C:/Users/….presence", pattern='.tif$', all.files= T, full.names= T)
rastlist_RCP85P2 <- list.files(path ="C:/Users/…._bee_RCP85P2", pattern='.tif$', all.files= T, full.names= T)
#import all raster files in folder using lapply
allrasters_pres <- lapply(rastlist_pres, raster)
allrasters_RCP85P2 <- lapply(rastlist_RCP85P2, raster)
r <- allrasters_pres[[1]]
> r
class : RasterLayer
dimensions : 9200, 14400, 132480000 (nrow, ncol, ncell)
resolution : 25, 25 (x, y)
extent : 2480000, 2840000, 1070000, 1300000 (xmin, xmax, ymin, ymax)
crs : +proj=somerc +lat_0=46.9524055555556 +lon_0=7.43958333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +units=m +no_defs
source : Andrena.barbilabris_glo_ensemble.tif
names : Andrena.barbilabris_glo_ensemble
values : 0, 53 (min, max)
> str(r)
Formal class 'RasterLayer' [package "raster"] with 13 slots
..@ file :Formal class '.RasterFile' [package "raster"] with 13 slots
.. .. ..@ name : chr "C:\\Users\\.......\\Andren"| __truncated__
.. .. ..@ datanotation: chr "INT2U"
.. .. ..@ byteorder : chr "little"
.. .. ..@ nodatavalue : num -Inf
.. .. ..@ NAchanged : logi FALSE
.. .. ..@ nbands : int 1
.. .. ..@ bandorder : chr "BIL"
.. .. ..@ offset : int 0
.. .. ..@ toptobottom : logi TRUE
.. .. ..@ blockrows : Named int 1
.. .. .. ..- attr(*, "names")= chr "rows"
.. .. ..@ blockcols : Named int 14400
.. .. .. ..- attr(*, "names")= chr "cols"
.. .. ..@ driver : chr "gdal"
.. .. ..@ open : logi FALSE
..@ data :Formal class '.SingleLayerData' [package "raster"] with 13 slots
.. .. ..@ values : logi(0)
.. .. ..@ offset : num 0
.. .. ..@ gain : num 1
.. .. ..@ inmemory : logi FALSE
.. .. ..@ fromdisk : logi TRUE
.. .. ..@ isfactor : logi FALSE
.. .. ..@ attributes: list()
.. .. ..@ haveminmax: logi TRUE
.. .. ..@ min : num 0
.. .. ..@ max : num 53
.. .. ..@ band : int 1
.. .. ..@ unit : chr ""
.. .. ..@ names : chr "Andrena.barbilabris_glo_ensemble"
..@ legend :Formal class '.RasterLegend' [package "raster"] with 5 slots
.. .. ..@ type : chr(0)
.. .. ..@ values : logi(0)
.. .. ..@ color : logi(0)
.. .. ..@ names : logi(0)
.. .. ..@ colortable: logi(0)
..@ title : chr(0)
..@ extent :Formal class 'Extent' [package "raster"] with 4 slots
.. .. ..@ xmin: num 2480000
.. .. ..@ xmax: num 2840000
.. .. ..@ ymin: num 1070000
.. .. ..@ ymax: num 1300000
..@ rotated : logi FALSE
..@ rotation:Formal class '.Rotation' [package "raster"] with 2 slots
.. .. ..@ geotrans: num(0)
.. .. ..@ transfun:function ()
..@ ncols : int 14400
..@ nrows : int 9200
..@ crs :Formal class 'CRS' [package "sp"] with 1 slot
.. .. ..@ projargs: chr "+proj=somerc +lat_0=46.9524055555556 +lon_0=7.43958333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +units=m +no_defs"
.. .. ..$ comment: chr "PROJCRS[\"unknown\",\n BASEGEOGCRS[\"unknown\",\n DATUM[\"Unknown based on Bessel 1841 ellipsoid\",\n"| __truncated__
..@ srs : chr "+proj=somerc +lat_0=46.9524055555556 +lon_0=7.43958333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +units=m +no_defs"
..@ history : list()
..@ z : list()
> e <- extract(r,v)
Error in (function (classes, fdef, mtable) :
kann keine vererbte Methode finden für Funktion ‘extract’ für Signatur ‘"RasterLayer", "SpatVector"’
Kind regards
Sibylle
-----Original Message-----
From: Ivan Krylov <ikrylov using disroot.org>
Sent: Tuesday, August 27, 2024 6:55 PM
To: SIBYLLE STÖCKLI via R-help <r-help using r-project.org>
Cc: sibylle.stoeckli using gmx.ch
Subject: Re: [R] boxplot of raster and shapefile
В Mon, 26 Aug 2024 14:33:02 +0200
SIBYLLE STÖCKLI via R-help < <mailto:r-help using r-project.org> r-help using r-project.org> пишет:
> > # Extract raster values within the shapefile extracted_values <-
> > extract(raster_file, shape_file)
> > # Assuming the shapefile has multiple polygons and you want to #
> > create a boxplot for each data_list <-
> > lapply(1:length(extracted_values), function(i) {
> + data.frame(value = extracted_values[[i]], polygon = i)
> + })
> > data <- do.call(rbind, data_list)
> > names(data)
> [1] "value" "polygon"
> > # Create the boxplot
> > bp<-ggplot(data, aes(x = factor(polygon), y = value)) +
> + geom_boxplot() +
> + labs(x = "Polygon", y = "Raster Values") +
> + theme_minimal()
> > bp
> Error in UseMethod("depth") :
> no applicable method for 'depth' applied to an object of class
> "NULL"
> In addition: Warning message:
> Removed 452451 rows containing non-finite outside the scale range
> (`stat_boxplot()`).
Thank you for providing a runnable example! Could you please also show
the output of str(extracted_values) and str(data)?
--
Best regards,
Ivan
[[alternative HTML version deleted]]
More information about the R-help
mailing list