[R] need for speed on grid.rect

Paul Murrell p.murrell at auckland.ac.nz
Wed Oct 20 21:38:19 CEST 2010


Hi

I think the problem is that the Windows graphics device is not great at 
semitransparent colours.  For example, your code runs acceptably fast on 
my Linux system.

If your goal is just a colour gradient, then you could avoid using 
semitransparency by calculating the colours yourself, for example ...

library(colorspace)
finalColour <- rgb(coords(mixcolor(.5,
                                    RGB(1, 0, 0),
                                    RGB(t(col2rgb("lightblue"))/255))))
colourPalette <- colorRampPalette(c("lightblue", finalColour))

... then just draw one set of rectangles ...

system.time(grid.rect(x = unit(rep(1:100, 200) , "native"),
     y = unit(rep(1:200, each = 100), "native"),
     width = unit(1, "native"),
     height = unit(1, "native"),
     gp = gpar(col = NA,
		fill = colourPalette(20000))
))

... or even better, draw the gradient as a raster image ...

system.time(grid.raster(matrix(colourPalette(20000),
                                ncol=100, nrow=200, byrow=TRUE)))

... which is much faster again.

Paul

On 21/10/2010 6:10 a.m., Mikkel Grum wrote:
> When I use grid.rect to print a multi-coloured grid, it is
> incredibly
slow compared to a single colour grid, or even a two colour grid.
>
> I've set out some simplified examples below. This is something I run
literally thousands of times a day, so I would greatly appreciate any
hints on how I might improve the speed???
>
> library(grid)
> pushViewport(viewport(
>      width = unit(100, "native"),
>      height = unit(100, "native"),
>      xscale = c(0, 100),
>      yscale = c(0, 100),
>      ))
> pushViewport(viewport(
>      x = unit(10, "native"),
>      y = unit(10, "native"),
>      width = unit(100, "native"),
>      height = unit(200, "native"),
>      xscale = c(0, 100),
>      yscale = c(0, 200),
>      just = c("left", "bottom"),
>      angle = 10))
> system.time(grid.rect(x = unit(rep(1:100, 200) , "native"),
>      y = unit(rep(1:200, each = 100), "native"),
>      width = unit(1, "native"),
>      height = unit(1, "native"),
>      gp = gpar(col = NA,
> 		fill = "lightblue")
> ))
> system.time(grid.rect(x = unit(rep(1:100, 200) , "native"),
>      y = unit(rep(1:200, each = 100), "native"),
>      width = unit(1, "native"),
>      height = unit(1, "native"),
>      gp = gpar(col = NA,
> 		fill = rgb(1, 0, 0, 1:20000/40000))
> ))
>
> My times for the two plots are:
>     user  system elapsed
>     0.61    0.30    0.92
> vs
>    user  system elapsed
>     0.08    0.36   24.39
>
> The time it takes to calculate the colours clearly doesn't explain
> the
difference:
> system.time(rgb(1, 0, 0, 1:20000/20000))
>     user  system elapsed
>        0       0       0
>
> Even if I do a two coloured grid, it finishes as quickly as the
> single
coloured one, so my first interpretation is that the function finds the
colours fairly quickly, e.g.
>
> system.time(grid.rect(x = unit(rep(1:100, 200) , "native"),
>      y = unit(rep(1:200, each = 100), "native"),
>      width = unit(1, "native"),
>      height = unit(1, "native"),
>      gp = gpar(col = NA,
> 		fill = c("lightblue", "red"))
> ))
>
>     user  system elapsed
>     0.51    0.18    0.70
>
> Best regards,
> Mikkel
>> sessionInfo()
> R version 2.12.0 (2010-10-15)
> Platform: i386-pc-mingw32/i386 (32-bit)
>
> locale:
> [1] LC_COLLATE=English_Ireland.1252  LC_CTYPE=English_Ireland.1252
> [3] LC_MONETARY=English_Ireland.1252 LC_NUMERIC=C
> [5] LC_TIME=English_Ireland.1252
>
> attached base packages:
> [1] grid      stats     graphics  grDevices utils     datasets  methods
> [8] base
>
> loaded via a namespace (and not attached):
> [1] tools_2.12.0
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

-- 
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
paul at stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/



More information about the R-help mailing list