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 
##  11.424   0.017  11.554
library(ggplot2)
system.time(print(ggplot(dados, aes(x = x, y = y)) + 
              geom_point()))
##    user  system elapsed 
##  16.918   0.131  17.215

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 
##   3.206   0.105   3.341

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.714   0.104   0.827

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!