为什么 spplot 为多个面板花费这么多时间
Why does spplot take so much time for multiple panels
我正在使用 spplot 绘制多个 shapefile。这是构建
的数据
library(raster)
library(randomcoloR)
my.shp <- getData('GADM', country = 'BRA', level = 2)
my.shp$ID<- 1:nrow(my.shp)
我的数据包含一个 10 年的变量 X
,如图所示,其中每一列都是一年
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 GB RAM。
谢谢
我没有将此情节与您的 spplot
进行比较,因为我不想花一个小时等待它。
相反,我建议使用 library(mapdeck)
绘制交互式地图,这需要几秒钟的时间。
注意两点
- 您需要一个 Mapbox 访问令牌
- 您需要将
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"
)
你willing/able要切换到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
。因此,使用简化的多边形进行绘图也会更快。
原始空间多边形:
format(object.size(my.dat_sf), units="Kb")
"25599.2 Kb"
和一个简化的 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 Kb"
绘制简化的 SimpleFeature,这在我配备 8GB RAM 的机器上大约需要 1 分钟。
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 图。
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)
我正在使用 spplot 绘制多个 shapefile。这是构建
的数据library(raster)
library(randomcoloR)
my.shp <- getData('GADM', country = 'BRA', level = 2)
my.shp$ID<- 1:nrow(my.shp)
我的数据包含一个 10 年的变量 X
,如图所示,其中每一列都是一年
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 GB RAM。
谢谢
我没有将此情节与您的 spplot
进行比较,因为我不想花一个小时等待它。
相反,我建议使用 library(mapdeck)
绘制交互式地图,这需要几秒钟的时间。
注意两点
- 您需要一个 Mapbox 访问令牌
- 您需要将
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"
)
你willing/able要切换到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
。因此,使用简化的多边形进行绘图也会更快。
原始空间多边形:
format(object.size(my.dat_sf), units="Kb")
"25599.2 Kb"
和一个简化的 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 Kb"
绘制简化的 SimpleFeature,这在我配备 8GB RAM 的机器上大约需要 1 分钟。
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 图。
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)