[Rd] thin grid lines, again (FAQ 7.36), a proposal

Ken Knoblauch ken.knoblauch at inserm.fr
Sat Mar 6 16:28:24 CET 2010


Hi,

I'm raising the issue, again, of those pesky thin lines that show up
with a pdf graphics device, otherwise known as FAQ 7.36. I have read
the FAQ and understand that I can eliminate them by adjusting the  
anti-aliasing
option for viewing them on the screen, but this doesn't necessarily
eliminate them for a print device or for transferring them into a powerpoint
or similar type of presentation format.  I have noticed that pdf's  generated
by some other software do not have the problem that the R generated ones
do.  For example, I can generate a pdf figure in R and with Asymptote
(http://asymptote.sourceforge.net/) and put them in the same LaTeX document
and the Asymptote generated pdf shows no thin lines independently of
the anti-alias setting while the R generated one does.  So it is not  
just the viewer
that is at issue as some pdf generators can make an image that is resistant
to this problem.

After some experimentation, I found that I could fix the problem in a pdf file
generated in R using the pdf graphics device by running the file  
through a filter.

Here is a short R example that produces the lines if your  
anti-aliasing setting
is set (in)appropriately:

pdf("TestBand.pdf")
n <- 16
x <- y <- seq(1, n)
z <- matrix(1, n, n)
z[, 7:10] <- 0.5
z[, c(5, 12)] <- 0
cc <- seq(0, 1, len = 256)
image(z, col = grey(cc), axes = FALSE)
dev.off()

and afterwards I corrected the file with the following awk filter

#FixLines.awk
{
if ($NF == "rg") {
         print $0
         for (i = 1; i < NF; i++) printf "%6.3f ", $i
         print " RG"
         }
else {if ($NF == "f") {
         for (i = 1; i < (NF - 1); i++) printf "%6.3f ", $i
         print "re  b"
         } else print $0
}
}

and then this from a terminal command line:

awk -f FixLines.awk < TestBand.pdf > FT.pdf

alternatively, the following Python script works just as well:

import sys

InFile = open(sys.argv[1], mode = "r")
for line in InFile:
   if(line.rfind("rg") != -1):
     print line,
     print line.replace("rg", "RG"),
   elif(line.rfind("re f") != -1):
     print line.replace("re f", "re b"),
   else:
     print line,
InFile.close()

What I found was that the pdf's generated from R contain commands that
are filling but not stroking rectangles that would correspond to the elements
of the matrix visualized with the image function. So with the filter,  
I located the
lines that set the fill color and added another line that set the stroke color
to be the same, then changed the rectangle fill commands, "re f", to
fill and stroke commands, "re b".

I think that this could be patched in devPS.c (untested) by something like

devPS.c6945
if(R_VIS(gc->fill)) {
         PDF_SetFill(gc->fill, dd);
         PDF_SetLineColor(gc->fill, dd);
         fprintf(pd->pdffp, "0 0 %.2f %.2f re b\n",
                 72.0 * pd->width, 72.0 * pd->height);
     }

or if the current behavior is desired under certain circumstances, perhaps an
argument, StrokeandFill, could be added to the pdf device (postscript, too, I
suppose) so that this behavior could be selected?

Perhaps, there are some more fundamental issues here that I'm not aware of.
i'd like to hear about them, if so.  Thank you.

Ken



-- 
Ken Knoblauch
Inserm U846
Stem-cell and Brain Research Institute
Department of Integrative Neurosciences
18 avenue du Doyen Lépine
69500 Bron
France
tel: +33 (0)4 72 91 34 77
fax: +33 (0)4 72 91 34 61
portable: +33 (0)6 84 10 64 10
http://www.sbri.fr/members/kenneth-knoblauch.html





-- 
Ken Knoblauch
Inserm U846
Stem-cell and Brain Research Institute
Department of Integrative Neurosciences
18 avenue du Doyen Lépine
69500 Bron
France
tel: +33 (0)4 72 91 34 77
fax: +33 (0)4 72 91 34 61
portable: +33 (0)6 84 10 64 10
http://www.sbri.fr/members/kenneth-knoblauch.html



More information about the R-devel mailing list