Update/Edit/Reprex:使用相同的图形设备渲染相同的空间数据需要 1 秒,tmap
而使用 80 秒ggplot2
,即使tmap
绘图的 R 对象的大小要大 80 倍。顺便说一句,内部和/或实现的差异。包和图形设备?
library(ggplot2); library(sf);
library(tmap); library(tidyverse)
library(here) # project directory
data(World) # sf object from tmap; Provides Africa polygon
# 'd' data pulled from acleddata.com/data, restricted to Aug 18 2017 - Aug 18 2018, Region: N/S/E/W/Middle Africa only
d <- read.csv(here('2017-08-18-2018-08-18-Eastern_Africa-Middle_Africa-Northern_Africa-Southern_Africa-Western_Africa.csv'))
dsf <- st_as_sf(d, coords = c('longitude', 'latitude'), crs = 4326)
tmap
使用的数据:1 - 来自包本身的“世界”shapefile 数据,以及
2 - acleddata.com/data,2017年 8 月 18 日至 2018 年 8 月 18 日期间仅限于非洲的 ACLED 冲突事件(7.8 MB .csv;这些过滤器:)
绘图渲染:
# ggplot2; build plot, assign to object
dev.cur() # RStudioGD on macOS: quartz
system.time(p <- ggplot(World %>% filter(continent == 'Africa')) +
geom_sf() +
geom_sf(data = dsf, aes(fill = event_type,
color = event_type)) +
ggthemes::theme_tufte() +
theme(legend.key.size = unit(.1, 'cm'),
legend.title = element_blank()))
# user system elapsed
# 0.016 0.001 0.017
object.size(p)
# 175312 bytes
# render
system.time(print(p))
# user system elapsed
# 84.755 0.432 85.418 # Note over 80 seconds
# tmap; build plot, assign to object
tmap_mode('plot')
system.time(tm <- tm_shape(World, filter =
(World$continent == 'Africa')) +
tm_polygons(group = 'Countries') +
tm_shape(dsf) +
tm_dots(col = 'event_type', group = 'event_type'))
# user system elapsed
# 0.000 0.000 0.001
object.size(tm)
# 14331968 bytes # This is 80x ggplot2 plot's object size
# 14331968/175312 = 81.75121
# render
dev.cur() # RStudioGD on macOS: quartz
system.time(print(tm))
# user system elapsed
# 1.438 0.038 1.484 # Note 1 second
[先前对 geom_sf() 和图形设备的调查,没有 tmap 比较:]
TL;博士:
我试图通过将图形设备切换到X11来加快我的绘图速度,因为我的默认Quartz图形设备很慢。下载 XQuartz(连接到 X11 图形设备)并调用grDevices::X11()
后,我不明白我得到的错误。
X11(type = "cairo")
# Error in .External2(C_X11, d$display, d$width, d$height, d$pointsize, :
# unable to start device X11
# In addition: Warning message:
# In X11() : unable to open connection to X11 display 'cairo'
#> Warning in X11(type = "cairo"): unable to open connection to X11 display ''
而当我从 macOS 上的 XQuartz.app 终端调用 R 时,错误消息略有不同:
X11(type = "cairo")
#> Error in .External2(C_X11, d$display, d$width, d$height, d$pointsize, : unable to start device X11cairo
结束 TL;DR
~~~~~~~
更广泛的背景:
使用 macOS 中使用的石英图形设备绘制大型 shapefileggplot2::geom_sf()
的绘图速度比其他设备慢得多,虽然这个更大的性能问题正在解决,但我想将我的设备从 Quartz 更改为 X11。
我按照RStudio 论坛的建议下载了 XQuartz,但我的代码没有成功调用 X11,即使我从 XQuartz 启动 R 也是如此。
证明,使用与 RStudio 论坛海报相同的数据:
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.1.3, proj.4 4.9.3
library(ggplot2)
tmpzip <- tempfile(fileext = ".zip")
download.file("https://github.com/bcgov/bcmaps.rdata/blob/master/data-raw/ecoregions/ecoregions.zip?raw=true", destfile = tmpzip)
gdb_path <- unzip(tmpzip, exdir = tempdir())
ecoregions <- sf::read_sf(dirname(gdb_path[1]))
## Create ggplot2 object
ecoregions_gg <- ggplot() + geom_sf(data = ecoregions)
# Running quartz device - default macOS
system.time(print(ecoregions_gg))
#> user system elapsed
#> 128.980 0.774 130.375
### ^ Note two full minutes!
给定大小,此默认设备运行异常长的 129 秒。根据 RStudio 论坛,X11 应该运行得更快。使用其默认图形设备(不是 Quartz)在 Windows 7 机器(32 GB RAM,3.60 GHz)上进行测试,结果如下:
#> user system elapsed
#> 2.16 2.24 4.46
### ^Only two seconds
虽然人们正在解决一般 geom_sf / Quartz 性能问题(Github 问题 1,Github 问题 2),但我如何使用我的 XQuartz 安装来运行 X11 并加快我的 shapefile 绘图?