Como melhorar o desempenho do ggplot2

Apesar de mais bonitos, os gráficos criados utilizando o pacote ggplot2 são, em geral, mais lentos para serem produzidos do que com as ferramentas padrão do R. Abaixo mostro quanto tempo o mesmo gráfico de dispersão com 1 milhão de pontos leva para ser produzido utilizando as funções plot, nativa do R, e geom_point, do pacote ggplot2:

set.seed(2708) 

n <- 1e6

x = rnorm(n)
y = x + 0.5*rnorm(n)

dados <- data.frame(x, y)

system.time(plot(x, y, data = dados))

##    user  system elapsed 
##   8.932   0.031   8.973
library(ggplot2)

system.time(print(ggplot(dados, aes(x = x, y = y)) + 
              geom_point()))

##    user  system elapsed 
##   9.759   0.141   9.935

Note que a função plot levou 8.973 segundos para ser executada, enquanto a função geom_point levou 9.935 segundos, 10% de tempo a mais. É uma diferença razoável em favor da função plot, que é executada mais rapidamente. Entretanto, é possível melhorar o desempenho de geom_point se utilizarmos o argumento pch = ".":

system.time(print(ggplot(dados, aes(x = x, y = y)) + 
                    geom_point(pch = "."))) 

##    user  system elapsed 
##   4.182   0.116   4.320

Note como o tempo caiu mais da metade (57% mais rápido, para ser preciso), precisando de apenas 4.320 segundos para plotar 1 milhão de pontos. Entretanto, é possível melhorar ainda mais o desempenho do tempo para criar o gráfico utilizando a função geom_scattermore do pacote scattermore:

library(scattermore)

system.time(print(ggplot(dados, aes(x =x, y = y)) + 
                    geom_scattermore())) 

##    user  system elapsed 
##   0.515   0.088   0.623

Impressionantes 0.623 segundos, praticamente 16 (dezesseis!) vezes mais rápido do que o tempo levado originalmente. Portanto, caso precise fazer um gráfico de dispersão com muitos pontos, experimente utilizar a função geom_scattermore.

Obrigado a Gabriele Girelli pela dica!