Почему spplot занимает много времени для нескольких панелей - PullRequest
0 голосов
/ 21 января 2019

Я строю несколько шейп-файлов, используя spplot. Вот данные для построения этого

library(raster)
library(randomcoloR)

my.shp <- getData('GADM', country = 'BRA', level = 2)
my.shp$ID<- 1:nrow(my.shp)

Мои данные состоят из переменной X за 10 лет, как показано, где каждый столбец является годом

df <- matrix(sample(100:5000, 55040, replace = T), nrow = 5504, ncol = 10)
df <- data.frame(ID = 1:nrow(my.shp), df)

my.dat <- merge(my.shp, df, by = "ID")

variable.names <- paste0("X",1:10)

spplot(my.dat, rev(variable.names), col = NA, at = seq(from = 100, to = 5000, by = 500), 
          col.regions = distinctColorPalette(length(seq(from = 100, to = 5000, by = 500))),
          main = list(label = "TEST")) 

Моя проблема в том, что этот график занимает так много времени (около часа), чтобы его прорисовать, и мне было интересно, если в самом коде есть что-то не так, что для его построения требуется слишком много времени. Мой ноутбук имеет 32 ГБ оперативной памяти.

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы готовы / можете переключиться на sf вместо sp?

Функция sf plot значительно быстрее, чем spplot, хотя раскладка немного отличается.

library(sf)
my.dat_sf <- st_as_sf(my.dat)
plot(my.dat_sf[rev(variable.names)], max.plot=10, breaks=c(seq(from = 100, to = 5000, by = 500),5000),
     pal = distinctColorPalette(length(seq(from = 100, to = 5000, by = 500))),
     main = "TEST", border=NA, key.pos=4)

Кроме того, вы можете попытаться упростить многоугольник с помощью rmapshaper::ms_simplify() для пространственных * -объектов или sf::st_simplify() для SimpleFeatures, что позволяет вам немного уменьшить размер объекта в зависимости от заданного dTolerance. Таким образом, построение графиков также будет быстрее с упрощенными полигонами.

Оригинальный SpatialPolygon:

format(object.size(my.dat_sf), units="Kb")

"25599,2 Кб"

и упрощенная SimpleFeature:

dat_sf_simple <- st_transform(my.dat_sf, crs = 3035)
dat_sf_simple <- st_simplify(dat_sf_simple, dTolerance = 1000, preserveTopology = T)
dat_sf_simple <- st_transform(dat_sf_simple, crs = 4326)
format(object.size(dat_sf_simple), units="Kb")

"7864,2 Кб"

Составьте график упрощенной SimpleFeature, который занимает около 1 минуты на моей машине с 8 ГБ ОЗУ.

plot(dat_sf_simple[rev(variable.names)], max.plot=10, breaks=c(seq(from = 100, to = 5000, by = 500),5000),
     pal = distinctColorPalette(length(seq(from = 100, to = 5000, by = 500))),
     main = "TEST", border=NA, key.pos=4)

Вы также можете попробовать ggplot2, но я уверен, что наиболее эффективным решением будет sf plot.

library(ggplot2)
library(dplyr)
library(tidyr)

dat_sf_simple_gg <- dat_sf_simple %>% 
  dplyr::select(rev(variable.names), geometry) %>% 
  gather(VAR, SID, -geometry)

ggplot() +
  geom_sf(data = dat_sf_simple_gg, aes(fill=SID)) + 
  facet_wrap(~VAR, ncol = 2) 
0 голосов
/ 23 января 2019

Я не сравнивал этот сюжет с вашим spplot, потому что я не хочу тратить час на его ожидание.

Вместо этого я предлагаю использовать library(mapdeck) для построения интерактивной карты, что занимает считанные секунды.

Две вещи на заметку

  1. Вам нужен токен доступа Mapbox
  2. Вам необходимо преобразовать объект sp в sf
library(raster)

my.shp <- getData('GADM', country = 'BRA', level = 2)
my.shp$ID <- 1:nrow(my.shp)

df <- matrix(sample(100:5000, 55040, replace = T), nrow = 5504, ncol = 10)
df <- data.frame(ID = 1:nrow(my.shp), df)

my.dat <- merge(my.shp, df, by = "ID")


library(sf)
sf <- sf::st_as_sf( my.dat )

library(mapdeck)

set_token( "YOUR_MAPBOX_TOKEN" )

mapdeck() %>% 
  add_sf(
    data = sf
    , fill_colour = "GID_2"
    )

enter image description here

...