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!