Update: The font situation on Macs with cairo and Cairo is a little worse
that I initially thought. I re-generated the images on a different Mac. The
previous Mac had OS 10.4 and this one has 10.5. The fonts from cairo and
Cairo have changed. Now there are italics and bold italics where there
should be normal and bold text.
http://stdout.org/~winston/X/r-antialias/pch.html<http://stdout.org/%7Ewinston/X/r-antialias/pch.html>
On Thu, Jun 4, 2009 at 7:30 PM, Winston Chang <
winstonchang2008@u.northwestern.edu> wrote:
> I have a question about antialiasing when R generates bitmaps. (This
> follows a thread on the ggplot2 mailing list.)
>
> I mostly use R on Linux, although I sometimes use it in Mac and Windows as
> well. On Linux, I've found that plotting shapes 15-18 via cairo results
in
> bad-looking output. The points are not antialiased, and they are jagged and
> misshapen. Plots generated in Windows also aren't antialiased, but at
least
> the vector shapes seem to be aligned to pixel boundaries so that the raster
> images look consistent.
>
> You can see this in the scatterplots I've posted here:
>
http://stdout.org/~winston/X/r-antialias/pch.html<http://stdout.org/%7Ewinston/X/r-antialias/pch.html>
>
> Also on that page are pch symbol charts from a modified version of
> pchShow() from the pch help page. I rendered PNG's of the chart on Mac,
> Linux, and Windows, using png() and setting "type" to Xlib,
cairo, quartz,
> if available on the given platform. In Windows, I did it without the type
> argument (in Windows, the flag wasn't available). Finally, I also
installed
> the Cairo package and used CairoPNG. Please note the distinction between
> "cairo", which is built-in, and "Cairo", which is an
installed package.
>
> (Side note: there's no Mac-Xlib image, but only because I had some X
server
> issues on that computer.)
>
> Here are some observations and questions that hopefully someone can answer:
> - With cairo, all shapes are antialiased except 15-18. Why do cairo and
> Cairo give different results for shapes 15-18?
> - With CairoPNG, all shapes are antialiased. Title text looks different
> between the platforms, though. On Mac, it's normal text; on Linux,
it's
> bold; and on Windows, it's italic. I believe that font.main was set to
2, so
> it should be bold. Why does Cairo render text so differently on different
> platforms?
>
>
> It would be nice not to have to tailor scripts to fit the quirks of
> whatever platform I happen to be at. For example, to have the title render
> properly in bold and have all shapes be anti-aliased, here's what I
would
> need to do:
> - Mac: png(type="quartz")
> - Linux: CairoPNG()
> - Windows: not possible
>
> Ideally, I would like to use the same command on all platforms to generate
> good antialiased graphs with similar-looking fonts. Is such a thing
> possible?
>
> -Winston
>
>
>
> This is the code that I used to generate all the images for each platform:
>
> pchShow <-
> function(extras = c("*",".",
"o","O","0","+","-","|","%","#"),
> cex = 3, ## good for both .Device=="postscript" and
"x11"
> col = "red3", bg = "gold", coltext =
"brown", cextext = 1.2,
> main = paste("plot symbols : points (... pch = *, cex
=",
> cex,")"))
> {
> nex <- length(extras)
> np <- 26 + nex
> ipch <- 0:(np-1)
> k <- floor(sqrt(np))
> dd <- c(-1,1)/2
> rx <- dd + range(ix <- ipch %/% k)
> ry <- dd + range(iy <- 3 + (k-1)- ipch %% k)
> pch <- as.list(ipch) # list with integers & strings
> if(nex > 0) pch[26+ 1:nex] <- as.list(extras)
> plot(rx, ry, type="n", axes = FALSE,
> xlab = "x-axis label", ylab = "y-axis label",
> main = main)
> abline(v = ix, h = iy, col = "lightgray", lty =
"dotted")
> for(i in 1:np) {
> pc <- pch[[i]]
> ## 'col' symbols with a 'bg'-colored interior (where
available) :
> points(ix[i], iy[i], pch = pc, col = col, bg = bg, cex = cex)
> if(cextext > 0)
> text(ix[i] - 0.3, iy[i], pc, col = coltext, cex = cextext)
> }
> }
>
>
> sysname <- paste(version$platform, "_", version$major,
".", version$minor,
> sep="")
>
> # Make the scatterplot
> set.seed(123)
> png(paste(sysname, "-default_png_scatterplot.png",
sep=""), width=300,
> height=300)
> plot(rnorm(20),rnorm(20), pch=16, main=paste(sysname,"pch=16"))
> dev.off()
>
>
> # Get the possible types on this computer (cairo, Xlib, etc)
> types <- NULL
> if (capabilities()["cairo"]) types <- c(types,
"cairo")
> if (capabilities()["X11"]) types <- c(types,
"Xlib")
> if (capabilities()["aqua"]) types <- c(types,
"quartz")
>
>
> # Generate the images
> if (is.null(types)) {
> # If no types available
> png(paste(sysname, "-default_png.png", sep=""),
width=300,
> height=300)
> pchShow(cex=.9, cextext=.8, main=paste(sysname, "default PNG
> output"))
> dev.off()
>
> } else {
> for (i in 1:length(types)) {
> # If types are available, use them
> png(paste(sysname, "-", types[i], ".png",
sep=""), width=300,
> height=300,
> type=types[i])
> pchShow(cex=.9, cextext=.8, main=paste(sysname,types[i]))
> dev.off()
> }
> }
>
> # Make the CairoPNG version
> library(Cairo)
> CairoPNG(paste(sysname, "-", "CairoPNG",
".png", sep=""), width=300,
> height=300)
> pchShow(cex=.8, cextext=.8, main=paste(sysname, "CairoPNG"))
> dev.off()
>
>
>
[[alternative HTML version deleted]]