[R] heavy graphs

Jim Lemon jim at bitwrit.com.au
Wed Apr 16 13:10:27 CEST 2008


Georg Ehret wrote:
> Dear R community,        I am creating large graphs with hundreds of
> thousands of datapoints. My usual way for output was pdf, but now I am
> getting file sizes of >30Mb that do not open well (or at all) in Adobe. Is
> there a way to reduce the resolution or get rid of overlaying datapoints?
> Any other idea is also warmly welcome!
> 
Hi Georg,
As others have noted, bitmapped graphics will handle overlaid points 
better than pdf. You might be able to use the count.overplot function 
that clumps together points and prints the number of points rather than 
the points themselves. However, with that many points, you might finish 
up with a jumble of numbers.

Another possibility is to bin the points and print a color matrix that 
represents the number of points in each bin.

# not a very elegant function, the example runs pretty slowly
bin.points<-function(x,y,nxbins,nybins) {
  binmat<-matrix(0,nrow=nybins,ncol=nxbins)
  xrange<-range(x)
  yrange<-range(y)
  xinc<-diff(xrange)/nxbins
  yinc<-diff(yrange)/nybins
  for(row in 1:nybins) {
   for(col in 1:nxbins) {
    binmat[row,col]<-
     sum((x >= xrange+xinc*(row-1)) & (x < xrange+xinc*row) &
      (y >= yrange+yinc*(col-1)) & (y < yrange+yinc*col))
    if(col==nxbins)
     binmat[row,col]<-binmat[row,col] + sum((x == xrange[2]) &
      (y >= yrange+yinc*(col-1)) & (y < yrange+yinc*col))
   }
   if(row==nybins)
    binmat[row,col]<-binmat[row,col] + sum((y == yrange[2]) &
     (x >= xrange+xinc*(row-1)) & (x < xrange+xinc*row))
  }
  return(binmat)
}
binmat<-bin.points(rnorm(100000),rnorm(100000),20,20)
require(plotrix)
color2D.matplot(binmat,show.legend=TRUE)

Jim



More information about the R-help mailing list