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 Email: friendly AT yorku DOT ca Professor, Psychology Dept. York University Voice: 416 736-5115 x66249 Fax: 416 736-5814 4700 Keele Street Web: http://www.datavis.ca Toronto, ONT M3J 1P3 CANADA
Michael Friendly <friendly <at> yorku.ca> writes:> > 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. >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:> I have a diagram to be included in latex, where all my figures are .eps > graphics (so pdflatex is not an > option)You could use the pdf() device and then use pdf2ps to convert to PostScript.>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 heplotsThere's now an adjustcolor() function in base R to do this.> 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.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 Professor of Biostatistics University of Auckland
On 04/14/2011 03:30 AM, Michael Friendly wrote:> 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. >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