2010-10-22 153 views
20

我喜欢ggplot生成的地块。然而,直接获得出版质量图仍然有点麻烦。我通常必须在Illustrator中进行一些后期处理(即更改字体,编号图等)。虽然我可以保存为tiff或PNG,但eps最适合在Illustrator中操作数字(我可以取消组合对象,移动图例/文本等)。如何在ggplot2中保留透明度?

当我保存一些透明度(或者在点或平滑的)一个对象ggplot我得到这个错误:

Warning message: 
In grid.Call.graphics("L_points", x$x, x$y, x$pch, x$size) : 
    semi-transparency is not supported on this device: reported only once per page 

有没有解决办法?

+0

下面还有一个简单的解决方案,可以将基于矢量的可编辑格式直接导出到Powerpoint,在这里您可以轻松修复次要格式问题,并且完全保留透明度。看看是否适合你... – 2015-06-26 16:57:45

+0

我觉得我的答案更准确和完整地回答你的问题,所以你可能想检查一个正确的答案 - 好吧,看看你的想法... – 2017-11-28 16:10:43

回答

16

的r EPS“设备”不支持部分透明,但是,如果我没有记错,它的PDF设备支持。 Illustrator中应该能够读取同样便利PDF文件到EPSes,如果还是不行,请尝试将它们转换生成后pdftopspdf2ps,他们是完全不同的程序和pdf2ps的输出...逊色)。

需要注意的是R不尝试在所有来优化PDF输出,所以即使你得到的是不需要后期制作的阴谋,你会希望通过压缩实用程序像qpdf起码运行。

+0

谢谢!对于OSX上的那些用户,here是将PDF转换为eps的简单工具。 – Maiasaura 2010-10-22 22:30:40

+0

呃...这不起作用。除非我错过了一个选项,如果我尝试使用'pdftops -eps graph.pdf graph.eps',其中图形具有半透明矢量线条,那么图形的这些部分将在EPS中被栅格化。这是非常没用(我可以转换为JPEG格式)。 http://tex.stackexchange.com/a/24287/13192表明postscript根本不支持半透明... – naught101 2014-01-22 00:40:16

+0

@ naught101呵呵,我认为这已经被添加到postscript中了。我不知道你的情况是什么,但是我会尝试完全消除EPS文件的使用 - 例如,pdfTeX可以篡改PDF格式的图形就好了(事实上,这比*更容易* )。 – zwol 2014-01-22 00:49:43

6

您也可以尝试通过SVG设备出口为SVG。不确定Illustrator是否可以读取SVG,但Inkscape可以,而且它是开源的:)我已经在Inkscape中用R输出到SVG做了一些很好的事情,并且保存的分组与EPS一样。不能100%确定它处理不透明,但我相信它在SVG标准中。

+0

尽管SVG在后台创建了怪异,大型,半透明的字母,但SVG的工作原理也是如此。背景中有一个非常大的O,X,Y.但我能够删除这些。所以这是另一个允许跳过转换的选项。谢谢。 – Maiasaura 2010-10-22 22:36:01

19

我有同样的问题与使用postscript功能。我发现grDevices包中的cairo_ps确实支持透明性(至少在Ubuntu 10.04中使用R版本2.10.1)。用法是:

cairo_ps(filename='filename.eps', width=7, height=7) 
plot(x,y) 
dev.off() 
+1

这个作品很棒!谢谢。 – Janvb 2011-08-25 13:35:33

+1

我同意:太棒了! – 2012-07-20 12:57:41

+0

您也可以添加参数fallback_resolution来控制半透明区域被光栅化的分辨率(这是在最近一次R更新中引入的)(例如,对于600 dpi,fallback_resolution = 600) – 2017-04-05 08:18:07

23

这工作:

ggsave("filename.eps", device=cairo_ps) 
+3

这是行不通的。为什么它没有评论就低估了? – 2014-01-16 18:43:08

+0

我同意 - 这是我计划经常使用的一个很好的解决方案。 – 2015-07-14 14:35:45

+3

正如这里指出http://stackoverflow.com/a/31380625/4598520 cairo_ps自动栅格化透明度,但在低分辨率下(72 dpi) – jaimedash 2016-03-24 22:35:42

4

原则的EPS格式不支持半透明度 - 如果你想要半透明度,并能在Illustrator或Inkscape中,你会编辑更好地导出为SVG或PDF。如果您真的与EPS格式绑定,您可以使用cairo设备,并指定需要栅格化半透明对象的分辨率(只有非半透明元素保持为矢量格式,然而,半透明区域被栅格化到位图)。要做到这一点的语法是:

cairo_ps(file = "test.eps", onefile = FALSE, fallback_resolution = 600) 
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7)) 
dev.off() 

ggsave("filename.eps", device=cairo_ps, fallback_resolution = 600) 

另一种选择是出口到MS Office PowerPoint中矢量格式,以及做任何布局编辑那里。这可以通过使用ReporteRs或者是建立在我自己的export包来完成:

library(ReporteRs) 
require(ggplot2) 
mydoc = pptx() 
mydoc = addSlide(mydoc, slide.layout = "Title and Content") 
mydoc = addTitle(mydoc, "Plot examples") 
myplot = qplot(Sepal.Length, Petal.Length 
       , data = iris, color = Species 
       , size = Petal.Width, alpha = I(0.7) 
) 
# Add titles and then 'myplot' 
mydoc = addPlot(mydoc, function() print(myplot), vector.graphic=TRUE) 
writeDoc(mydoc, file = "test plot.pptx") 

enter image description here

或使用我的export包(https://github.com/tomwenseleers/export):

library(export) 
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7)) 
graph2ppt(file="plot.pptx", width=8, aspectr=sqrt(2)) 

这将导致一个完全可编辑,基于本地Office矢量DrawingML格式的高质量Powerpoint图形,全面支持透明度。在那里,您可以轻松修复较小的格式问题,并通过打印为PDF格式导出为高质量的PDF。

相关问题