Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Producing a vector graphics image (i.e. metafile) in R suitable for printing in Word 2007

Tags:

r

First a caveat: I posted this question here on SuperUser, but it is clearly the wrong place to ask R questions. I recognize that it is not directly a programming question, but I believe it can be solved by changing how plots are produced (i.e. by coding appropriately). So I hope readers find this appropriate for the forum.

R plots usually consist entirely of vector graphics elements (i.e. points, lines, polygons, text). R permits you to save your figure (or copy-paste) in various formats including various raster formats, as a PDF, or as a Windows meta-file.

I usually save my images as PDFs and print them. This renders the images exactly as I intended them on paper, in the highest quality. I avoid raster formats (e.g. JPG, TIFF) for printing as inevitably the quality is poorer and publishers prefer vector formats.

However, I need to make a large multi-page desktop published document using Microsoft Word 2007, and therefore using PDFs is not an option. When I import my figures from meta-files, or copy and paste directly from R into Word both the screen and print rendering of the image changes slightly (e.g. polygons and their fills become slightly misaligned).

Given that I want to retain high vector quality (and not use raster formats), what can I do to make R vector graphics work with Word? (Of course Sweave and LaTeX would be nice, but again, not a realistic option).

Consider this example:

plot(c(1:100), c(1:100), pch=20) ## Copy and paste to Word 2007 as Windows metafile ## Print ## Quality is poorer (e.g. dot fills misaligned with borders)  pdf("printsPerfectly.pdf") plot(c(1:100), c(1:100), pch=20) dev.off() ## Now print PDF ## Quality is as expected 

EDIT: Further to suggestions by @John I produced it as an EPS postscript file (see below), inserted it as a picture into Word. Because ultimately it will be printed from a PDF created from Word, I converted it to a PDF using default Word 2007 settings, printed it on my HP Laserjet P1606dn laser printer, and then took aphotograph to illustrate the issue of polygons borders and fills misaligning (image on left, below). I also produced it directly as PDF from R using pdf() and printed the PDF and took a photograph (image on right, below).

Illustration of misalignment (left) and perfection (right)

It may seem like small potatoes! But when you have gone to a lot of trouble to achieve high quality, it is disappointing to be thwarted at the end. In addition, it is not really obvious here, but the numerals are not as high-quality (left) as in the PDF (right), disregarding differences in focus on the photograph.

like image 755
digitalmaps Avatar asked Mar 04 '12 14:03

digitalmaps


2 Answers

The accepted answer to me is not acceptable, since if one goes to the trouble of making a nice vector based figure, the last thing one would like to do is just rasterize it to a bitmap... Unless it's an increadibly complex graph that takes ages to render in vector format, or something like that, but for most graphs that's not the case.

The best solution is to export to Word directly in native Office vector format. I just made a new package, export, that allows one to do exactly that an allows export of either graphs or statistical tables to Word and Powerpoint, see https://cran.r-project.org/web/packages/export/index.html and for demo see https://github.com/tomwenseleers/export

For example:

library(devtools) devtools::install_github("tomwenseleers/export") library(export)     ?graph2ppt ?graph2doc ?table2ppt ?table2doc  ## export of ggplot2 plot library(ggplot2) qplot(Sepal.Length, Petal.Length, data = iris, color = Species,        size = Petal.Width, alpha = I(0.7)) # export to Word graph2doc(file="ggplot2_plot.docx", width=7, height=5)  # export to Powerpoint       graph2ppt(file="ggplot2_plot.pptx", width=7, height=5) 

enter image description here

You can also export to enhanced metafile using the function

graph2emf(file="ggplot2_plot.emf", width=7, height=5) 

but the quality of the native Office format is better.

For final production you can also readily print it to PDF from Powerpoint if need be, and it will stay nicely in vector format then.

like image 146
Tom Wenseleers Avatar answered Oct 23 '22 13:10

Tom Wenseleers


Your only option is to use high resolution raster graphics. Once you're over 300 dpi it will be completely indistinguishable from vector printed; it will just make larger files.. Your copy and paste method is coming in at 72 dpi and will look terrible. If you import from a file you can get the resolution in the file and things will be much better. Fortunately Office 2007 is supposed to handle png images, which have the best compression for typical graphs. Let's say you wanted the image 4" wide and 6" high...

png('printsGreat.png', width = 4, height = 6, units = 'in', res = 300) plot(c(1:100), c(1:100), pch=20) dev.off() 

Also, Office 2007 is supposed to be able to handle EPS files and R postscript files are by default EPS compatible when you print one page.

postscript("printsPerfectly.eps", width = 4, height = 6, horizontal = FALSE, onefile = FALSE) plot(c(1:100), c(1:100), pch=20) dev.off() 

But if you don't have luck with them go back to the high resolution image.

like image 32
John Avatar answered Oct 23 '22 12:10

John