2011-12-29 21 views
5

Ho un R/ggplot2 caso d'uso che sembra chiamare per geom_raster: una griglia cartesiana regolare con valori z in posizioni x, y. Ho utilizzato geom_tile e mi aspettavo un miglioramento delle prestazioni passando a geom_raster. Ma non mi sembra di vedere uno ...Prestazione relativa di geom_raster()

Ecco un esempio giocattolo (ma circa la dimensione a destra), utilizzando base grafica:

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 

Qui è 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 

Quindi, un guadagno modesto, ma da nessuna parte vicino a quello che mi aspettavo. Sto sbagliando? Molte grazie in anticipo!

risposta

8

Si dovrebbe usare geom_raster dall'ultimo ggplot2 (dev version, al momento), non è il prototipo buggy in ggExtra (questo pacchetto è ormai deprecato, btw).

In questo modo, ottengo risultati migliori, 4.705 contro 1.416 (trascorsi). Piuttosto un miglioramento.

Edit: si scopre che ?geom_raster in ggplot2 offre già un punto di riferimento migliore, sul mio 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