Skip to content

latex, eps graphics and transparent colors

5 messages · Michael Friendly, Thomas Lumley, Ben Bolker +1 more

#
I have a diagram to be included in latex, where all my figures are .eps 
graphics (so pdflatex is not an
option) and I want to achieve something
like the following: three concentric filled circles varying in lightness 
or saturation.  It is easiest to do this using
transparency, but in my test using the postscript driver, the 
transparent color fills do not appear.  Is it
correct that postscript() does not support transparency?

circle <-function (radius = 1, segments=61) {
         angles <- (0:segments)*2*pi/segments
         radius * cbind( cos(angles), sin(angles))
}

plot(1:5, 1:5, type='n', xlim=c(-1,5), ylim=c(-1,5), xlab='', ylab='',
         asp=1, xaxt="n", yaxt="n")

#clrs <- trans.colors("lightblue", alpha=c(.2, .4, .6))  ## from heplots 
package
clrs <- c("#ADD8E633", "#ADD8E666", "#ADD8E699")

c1 <- circle(3)
polygon(    c1, col=clrs[1], border="lightblue")
polygon(.67*c1, col=clrs[2], border="lightblue")
polygon(.33*c1, col=clrs[3], border="lightblue")

arrows(-1,  0, 5, 0, angle=10, length=.2, lwd=2, col="darkgray")
arrows( 0, -1, 0, 5, angle=10, length=.2, lwd=2, col="darkgray")

One alternative that sort of works is to use the png() driver, and then
convert fig.png fig.eps
but I need very high resolution to make the real diagram legible.

It might suffice to use hcl() colors to approximate what I've done with 
transparency,
but I don't know how to start with a given color ("lightblue") and 
achieve roughly
similar resuts.
#
Michael Friendly <friendly <at> yorku.ca> writes:
If you really only want to lighten a specified colour (rather
than overlaying multiple colours), then something like this ought
to do the trick:


testfun <- function(clrs=c("#ADD8E633", "#ADD8E666", "#ADD8E699")) {
  plot(1:5, 1:5, type='n', xlim=c(-1,5), ylim=c(-1,5), xlab='', ylab='',
       asp=1, xaxt="n", yaxt="n")
  c1 <- circle(3)
  polygon(    c1, col=clrs[1], border="lightblue")
  polygon(.67*c1, col=clrs[2], border="lightblue")
  polygon(.33*c1, col=clrs[3], border="lightblue")

  arrows(-1,  0, 5, 0, angle=10, length=.2, lwd=2, col="darkgray")
  arrows( 0, -1, 0, 5, angle=10, length=.2, lwd=2, col="darkgray")
}

postscript("testalpha1.ps")
testfun()
dev.off()


lblue <- "#ADD8E6"
alphafy <- function(col,alpha=1) {
  rr <- 1-alpha*(1-c(col2rgb(col)/255))
  rgb(rr[1],rr[2],rr[3])
}
alphafy("#ADD8E6")
alphafy("#ADD8E6",alpha=0)

postscript("testalpha2.ps")
testfun(clrs=c(alphafy(lblue,0.2),alphafy(lblue,0.4),alphafy(lblue,0.6)))
dev.off()
#
On Thu, Apr 14, 2011 at 5:30 AM, Michael Friendly <friendly at yorku.ca> wrote:
You could use the pdf() device and then use pdf2ps to convert to PostScript.
There's now an adjustcolor() function in base R to do this.
It would be useful to have an alpha-blending function for this sort of
purpose, but I don't think we have one.

   -thomas
#
Thomas Lumley <tlumley <at> uw.edu> writes:
Clever.

   [snip]
That makes my solution more or less obsolete.
#
On 04/14/2011 03:30 AM, Michael Friendly wrote:
Hi Michael,
For a "one off" job, I would probably do the transparent overlays in the 
pdf device, open the result in xpdf or Acrobat and then use the GIMP to 
identify the resulting colors from a screen shot. Then redo the plot in 
the postscript device using the opaque colors. This is only an 
approximation, of course, but it gets the job done.

Jim