在R中生成适合在Word 2007中打印的矢量图形图像(即图元文件)

dig*_*aps 33 r

首先一个警告:我张贴了这个问题,在这里上的超级用户,但它显然是错误的地方要问R课题.我认识到这不是一个直接的编程问题,但我相信它可以通过改变图的产生方式来解决(即通过适当的编码).所以我希望读者认为这适合论坛.

R图通常完全由矢量图形元素(即点,线,多边形,文本)组成.R允许您以各种格式保存图形(或复制粘贴),包括各种栅格格式,PDF格式或Windows元文件.

我通常将图像保存为PDF并打印出来.这使得图像完全按照我的预期在纸上呈现,质量最高.我避免使用光栅格式(例如JPG,TIFF)进行打印,因为质量不可避免,而且出版商更喜欢矢量格式.

但是,我需要使用Microsoft Word 2007制作一个大型多页桌面发布文档,因此不能使用PDF.当我从元文件导入我的数字,或直接从R复制并粘贴到Word时,图像的屏幕和打印渲染都会略有变化(例如,多边形及其填充会略微错位).

鉴于我想保持高矢量质量(而不是使用光栅格式),我可以做些什么来使R矢量图形与Word一起使用?(当然Sweave和LaTeX会很好,但同样不是一个现实的选择).

考虑这个例子:

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
Run Code Online (Sandbox Code Playgroud)

编辑:继续@John的建议我把它作为EPS postscript文件(见下文)制作,将它作为图片插入Word.因为最终它将从Word创建的PDF打印,我使用默认的Word 2007设置将其转换为PDF,将其打印在我的HP Laserjet P1606dn激光打印机上,然后拍摄照片以说明多边形边框和填充不对齐的问题(图像左侧,下方).我也直接用R从PDF制作它pdf()并使用PDF打印并拍摄照片(右下图).

错位(左)和完美(右)的插图

它可能看起来像小土豆!但是当你为了达到高质量而遇到很多麻烦时,最终被挫败是令人失望的.此外,这里并不是很明显,但数字并不像PDF(右)那样高质量(左),而忽略了对照片的关注差异.

Tom*_*ers 20

对我来说上面的当前最佳答案是不可接受的,因为如果一个人去制作一个漂亮的基于矢量的图形的麻烦,人们想要做的最后一件事就是将它光栅化为位图......除非它是一个可递增的复杂图形需要很长时间才能以矢量格式呈现,或类似的东西,但对于大多数图形而言并非如此.

最好的解决方案是直接以本机Office矢量格式导出到Word.我刚刚制作了一个新的软件包,export允许人们完全允许将图形或统计表导出到Word和Powerpoint,请参阅 https://cran.r-project.org/web/packages/export/index. html和演示请参阅 https://github.com/tomwenseleers/export

例如:

install.packages("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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您还可以使用该功能导出到增强型图元文件

graph2emf(file="ggplot2_plot.emf", width=7, height=5)
Run Code Online (Sandbox Code Playgroud)

但原生Office格式的质量更好.

对于最终制作,如果需要,您也可以从Powerpoint将其打印成PDF格式,然后它将保持良好的矢量格式.


Joh*_*ohn 16

您唯一的选择是使用高分辨率光栅图形.一旦你超过300 dpi,它将与矢量打印完全无法区分; 它只会制作更大的文件..你的复制和粘贴方法是在72 dpi进行,看起来很糟糕.如果从文件导入,您可以在文件中获得分辨率,事情会好得多.幸运的是,Office 2007应该处理png图像,这些图像对典型图形具有最佳压缩效果.假设您希望图像宽4英寸,高6英寸......

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

此外,Office 2007应该能够处理EPS文件,并且当您打印一页时,R postscript文件默认为EPS兼容.

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

但如果你没有运气,请回到高分辨率图像.

  • 另一点是,如果你有'线条艺术'(即只是线条,点和文字)并使用任何合理的格式(例如PNG),当你提高分辨率时,文件大小实际上不会增加​​那么多,因为它只会保存有关形状*边*的额外信息 - 内部都将被压缩 (3认同)
  • @PaulG:关于EPS失真,打印文档以查看失真是否消失是值得的.您在Word中看到的图像可能是低分辨率EPS预览,而不是在打印或转换为PDF时呈现的最终图像. (2认同)
  • @John建议在300 dpi时使用`png()`.这是至少使用Word 2007的唯一可行方法.我花了一些时间玩这个和`png(...,bg ="transparent")`.使用`bg ="white"`,因为这样可以提供更好的打印效果.如果您具有完整的Adobe Acrobat安装(PDFMaker/Distiller),则使用"高质量打印"选项可在PDF中存储300 dpi图像,而无需进行下采样.可以使用压缩(小文件大小)或不使用(巨大文件大小)存储图像.在B&W矢量图形上,它与打印渲染没有明显区别. (2认同)

Tun*_*hua 7

我首选的解决方案是使用windows图元文件设备进行绘图,例如:

win.metafile("mygraph.wmf")
print(gg1)
dev.off()
Run Code Online (Sandbox Code Playgroud)

这会生成一个*.wmf文件,可以将其复制粘贴到word文件中.


Kev*_*ght 6

devEMF软件包似乎生成的图形看起来比粘贴到PowerPoint时默认的wmf更好.


Kon*_*pov 5

由于我尝试在 R 中以高分辨率生成 png 并且它似乎在我的 PC 上不起作用(如果我将分辨率设置为高于 300 dpi,R 会产生诸如“无法启动 png 设备”之类的错误),我发现的方法是使用 postscript() 保存图形,然后使用 GSView 将 ps 文件转换为具有 600 dpi 分辨率的 png。MS Word 愉快地使用 png 并且打印质量似乎是完美的。