2011-12-29 36 views
5

Tôi có một trường hợp sử dụng R/ggplot2 có vẻ như gọi cho geom_raster: lưới Descartes thông thường có giá trị z tại vị trí x, y. Tôi đã sử dụng geom_tile và tôi dự kiến ​​cải thiện hiệu suất từ ​​việc chuyển sang geom_raster. Nhưng tôi dường như không thể nhìn thấy một ...Hiệu suất tương đối của geom_raster()

Dưới đây là một ví dụ đồ chơi (nhưng về kích thước phù hợp), sử dụng base đồ họa:

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 

Dưới đây là với 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 

Vì vậy, mức tăng khiêm tốn, nhưng không ở đâu gần những gì tôi mong đợi. Tôi có làm sai không? Rất cám ơn trước!

Trả lời

8

Bạn nên sử dụng geom_raster từ mới nhất ggplot2 (dev version, hiện tại), không phải mẫu thử lỗi trong ggExtra (gói này hiện không được chấp nhận, btw).

Làm như vậy, tôi nhận được kết quả tốt hơn, 4,705 so với 1,416 (đã qua). Khá một cải tiến.

Edit: nó chỉ ra rằng ?geom_raster trong ggplot2 đã cung cấp một chuẩn mực tốt hơn, trên hệ thống của tôi

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