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.murr...@auckland.ac.nz>  wrote:

From: Paul Murrell<p.murr...@auckland.ac.nz>
Subject: Re: [R] need for speed on grid.rect
To: "Mikkel Grum"<mi2kelg...@yahoo.com>
Cc: "r-help@r-project.org"<r-help@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@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
p...@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
p...@stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/

______________________________________________
R-help@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.

Reply via email to