[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