3. stars tidyverse methods

Edzer Pebesma

star の vignette のより良いバージョンは、 https://r-spatial.github.io/stars/articles/ を参照。

この vignette は、tidyverseの動詞のいくつかを、stars のオブジェクトに対してどのように使うことができるかを示している。

starstidyverse のパッケージは、以下の方法でロードされる。

library(stars)
## Loading required package: abind
## Loading required package: sf
## Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

現在、クラス stars で利用可能なメソッドは次のとおりである。

methods(class = "stars")
##  [1] [                 [[<-              [<-               %in%             
##  [5] $<-               adrop             aggregate         aperm            
##  [9] as_tibble         as.data.frame     as.POSIXct        c                
## [13] coerce            contour           cut               dim              
## [17] dimnames          dimnames<-        droplevels        filter           
## [21] hist              image             initialize        is.na            
## [25] Math              merge             mutate            Ops              
## [29] plot              predict           print             pull             
## [33] rename            select            show              slice            
## [37] slotsFromS3       split             st_apply          st_area          
## [41] st_as_sf          st_as_sfc         st_as_stars       st_bbox          
## [45] st_coordinates    st_crop           st_crs            st_crs<-         
## [49] st_dimensions     st_dimensions<-   st_downsample     st_extract       
## [53] st_geometry       st_interpolate_aw st_intersects     st_join          
## [57] st_mosaic         st_normalize      st_redimension    st_sample        
## [61] st_set_bbox       st_transform_proj st_transform      time             
## [65] transmute         write_stars      
## see '?methods' for accessing help and source code

ここでは、ランドサット画像の3バンド区間を扱いる。

system.file("tif/L7_ETMs.tif", package = "stars") %>%
    read_stars -> x
x
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif     1      54     69 68.91242      86  255
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

slice slice はキューブから部分配列をスライスするこれは、作用する次元とスライス番号を指定することで行われる {#slice

-slice-slices-a-sub-array-out-of-the-cube;-this-is-done-by-specifying -the-dimension-on-which-to-act-and-the-slice-number.}

x %>% slice(band, 6) -> x6
x6
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif     1      32     60 59.97521      88  255
## dimension(s):
##   from  to  offset delta                     refsys point x/y
## x    1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y    1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]

スライス次元に沿って1つの要素が選択された場合、低次元の配列を返す。

filter slice と同様に、filter は次元を選択するが、インデックスではなく値を評価する: in. {#filter

-similar-to-slice-filter-selects-on-dimensions-but-evaluates-their-values -rather-than-their-index-in}

x %>% filter(x > 289000, x < 291000, band > 3) -> x7
x7
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif     5      54     70 71.79194      88  252
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1  70  289004  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   3       4     1                         NA    NA

の場合、X座標の値に基づいて部分配列が作成される。

なお、filter はオブジェクトを tbl_cube に変換し、dplyr filter メソッドを tbl_cube オブジェクトに対して使用する。これには、レクトリニア、カーブリニア、シンプルフィーチャのジオメトリを持つ stars オブジェクトは扱えないという制限がある。このようなオブジェクトには、通常の [ 選択を使用するか、st_crop を使用することが代替となる場合がある。

pull

pull は、star 形オブジェクトから配列を引き出する。

x %>% pull(1) -> x8
class(x8)
## [1] "array"
dim(x8)
##    x    y band 
##  349  352    6

mutate

x %>% mutate(band2 = 2 * L7_ETMs.tif) -> x2 
x2
## stars object with 3 dimensions and 2 attributes
## attribute(s):
##              Min. 1st Qu. Median      Mean 3rd Qu. Max.
## L7_ETMs.tif     1      54     69  68.91242      86  255
## band2           2     108    138 137.82484     172  510
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

select

select は、属性または属性の集合を選択する。

x2 %>% select(band2) -> x9
x9
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##        Min. 1st Qu. Median     Mean 3rd Qu. Max.
## band2     2     108    138 137.8248     172  510
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

geom_stars

geom_raster は、 geom 関数で、 の引数として のオブジェクトを受け取り ggplot2 data stars

使用例としては

library(ggplot2)
library(viridis)
## Loading required package: viridisLite
ggplot() + 
  geom_stars(data = x) +
  coord_equal() +
  facet_wrap(~band) +
  theme_void() +
  scale_fill_viridis() +
  scale_x_discrete(expand = c(0, 0)) +
  scale_y_discrete(expand = c(0, 0))