2011-12-29 12 views
5

Tengo un caso de uso R/ggplot2 que parece requerir geom_raster: una cuadrícula cartesiana regular con valores z en las ubicaciones x, y. He estado usando geom_tile, y esperaba una mejora en el rendimiento al cambiar a geom_raster. Pero no me parece estar viendo una ...Rendimiento relativo de geom_raster()

Aquí está un ejemplo de juguete (pero el tamaño adecuado), utilizando gráficos base:

n <- m <- 200 
x <- 1:n 
y <- 1:m 
f <- function(x, y) 10 * sin(x/n) * cos(y/m) 
z <- outer(x, y, f) 
system.time(image(z)) 

    user system elapsed 
    0.998 0.007 1.023 

Aquí está con ggplot2:

obs <- expand.grid(x=x, y=y) 
obs$z <- as.numeric(as.list(z)) 
require(ggplot2) 
p <- ggplot(obs, aes(x=x, y=y, fill=z)) 
system.time(show(p + geom_tile())) 

    user system elapsed 
    7.328 0.891 8.187 

require(ggExtra) 
system.time(show(p + geom_raster())) 

    user system elapsed 
    7.000 0.637 7.799 

Por lo tanto, una ganancia modesta, pero no muy lejos de lo que esperaba. ¿Lo estoy haciendo mal? ¡Muchas gracias de antemano!

Respuesta

8

Debe utilizar geom_raster de la última ggplot2 (dev version, en la actualidad), no es el prototipo de silla de paseo ggExtra (este paquete ahora es obsoleto, por cierto).

Al hacerlo, obtengo mejores resultados, 4.705 vs. 1.416 (transcurrido). Una gran mejora.

Editar: resulta que ?geom_raster en ggplot2 ya ofrece una mejor referencia, en mi sistema

benchplot(base + geom_raster()) 
     step user.self sys.self elapsed 
1 construct  0.006 0.004 0.010 
2  build  0.887 0.212 1.109 
3 render  0.449 0.119 0.584 
4  draw  0.108 0.005 0.141 
5  TOTAL  1.450 0.340 1.844 
> benchplot(base + geom_tile()) 
     step user.self sys.self elapsed 
1 construct  0.016 0.005 0.026 
2  build  1.031 0.329 1.365 
3 render  1.021 0.297 1.318 
4  draw  0.987 0.041 1.040 
5  TOTAL  3.055 0.672 3.749 
Cuestiones relacionadas