为什么tmap渲染速度比ggplot2快80倍? [在macOS上使用XQuartz / X11图形设备在ggplot2 :: geom_sf()中用R绘制shapefile]

时间:2018-07-01 18:42:29

标签: r ggplot2 sf xquartz

更新/编辑/重新显示:使用tmap用相同的图形设备渲染相同的空间数据需要1秒,而使用ggplot2则需要80秒,即使{{ 1}}图的R对象的大小大80倍。内部和/或实施方面的差异。包装和图形设备?

tmap

使用的数据:1-来自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) 包本身的'World'shapefile数据,以及

2-{{​​3}},2017年8月18日至2018年8月18日之间仅限于非洲的ACLED冲突事件(7.8 MB .csv;这些过滤器:)

acleddata.com/data

绘图渲染:

tmap

enter image description here

# 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

ggplot2 png


[先前对geom_sf()和图形设备的查询,没有进行tmap比较:]

TL; DR:

由于默认的 Quartz 图形设备运行缓慢,因此我试图通过将图形设备切换为 X11 来加快绘图速度。下载XQuartz(以连接到X11图形设备)并调用# 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 之后,我不明白我得到的错误。

grDevices::X11()

当我改为从macOS上的XQuartz.app终端调用R时,错误消息略有不同:

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 ''

结束TL; DR

~~~~~~~

更广泛的上下文:

使用X11(type = "cairo") #> Error in .External2(C_X11, d$display, d$width, d$height, d$pointsize, : unable to start device X11cairo 绘制大型shapefile时,macOS中使用的石英图形设备的绘制速度比其他设备慢得多,并且在解决了较大的性能问题时,我想将设备从Quartz更改为X11。

我按照tmap png的建议下载了XQuartz,但是即使从XQuartz启动R,我的代码也未成功调用X11。

使用与RStudio论坛发布者相同的数据进行证明:

ggplot2::geom_sf()

RStudio forums

给定大小,此默认设备会运行异常长的129秒。 根据RStudio论坛,X11应该运行得更快。使用默认的图形设备(非Quartz)在(授权的,更快的)Windows 7计算机(32 GB RAM,3.60 GHz)上进行的测试得出:

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!

人们正在解决一般的geom_sf / Quartz性能问题(ShapefileGithub Issue 1)时,如何使用XQuartz安装程序运行X11并加快shapefile的绘制速度?

0 个答案:

没有答案