[R] need for speed on grid.rect

Paul Murrell p.murrell at auckland.ac.nz
Wed Oct 20 22:51:49 CEST 2010


Hi

On 21/10/2010 9:11 a.m., Mikkel Grum wrote:
> Hi Paul
>
> Thanks ever so much for this. This should help tremendously. My only
reason for using semi-transparent colours was not knowing how to use
colorRampPalette. I'm really just looking at white-to-somecolour
gradients. My examples weren't meant to be written one on top of the other.
>
> Unlike in the examples, my real-life grids are irregular, with
> uneven
distances between rows, so grid.raster probably isn't an option.
>
> Also, in real-life I'm writing the plots to png and pdf files. It
> was
on the png files that I noticed the problem, because these files involve
much more data than the pdfs. I'm not sure to what extent the Windows
graphics drivers affects the png and pdf drivers?

It will affect PNG output, but not PDF.

Paul

p.s.  I notice that you are using "native" coordinates to position the 
top-level viewport.  That requires some care because "native" 
coordinates run top-to-bottom on some devices and bottom-to-top on others.


> Mikkel
>
> --- On Wed, 10/20/10, Paul Murrell<p.murrell at auckland.ac.nz>  wrote:
>
>> From: Paul Murrell<p.murrell at auckland.ac.nz>
>> Subject: Re: [R] need for speed on grid.rect
>> To: "Mikkel Grum"<mi2kelgrum at yahoo.com>
>> Cc: "r-help at r-project.org"<r-help at r-project.org>
>> Date: Wednesday, October 20, 2010, 2:38 PM
>> 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/
>>
>
>
>

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