如何保持ggplot2的透明度?

时间:2010-10-22 22:05:50

标签: r

我喜欢ggplot产生的情节。然而,直接获得出版质量图仍然有些麻烦。我通常不得不在Illustrator中进行一些后期处理(即更改字体,编号等)。虽然我可以保存为tiff或png,但eps最适合在Illustrator中操作数字(我可以取消组合对象,移动图例/文本等)。

当我保存一个具有透明度的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

有解决方法吗?

6 个答案:

答案 0 :(得分:27)

这有效:

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

答案 1 :(得分:19)

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

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

答案 2 :(得分:16)

R的eps“设备”不支持部分透明度,但是,如果我没记错的话,它的PDF设备会支持。插图画家应该能够阅读具有相同功能的PDF文件,如果没有,请尝试使用pdftops pdf2ps生成后转换它们,它们是完全不同的程序和pdf2ps的输出是...劣等)。

请注意,R并不会尝试在所有中优化其PDF输出,因此即使您确实获得了不需要后期制作的绘图,您也需要通过像{这样的压缩实用程序来运行它。 {1}}至少。

答案 3 :(得分:6)

您也可以尝试通过svg设备导出为SVG。不确定Illustrator是否可以读取SVG,但是Inkscape可以,并且它是开源的:)我在Inkscape中用R输出到SVG做了一些好事,并且分组与EPS保持一致。不能100%确定它处理不透明度,但我确定它符合SVG标准。

答案 4 :(得分: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,并在那里进行任何布局编辑。这可以使用我的新export包轻松完成, 看到 https://cran.r-project.org/web/packages/export/index.html和演示 https://github.com/tomwenseleers/export

典型的语法非常简单,例如:

install.packages("export")
library(export)
library(ggplot2)
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, 
      size = Petal.Width, alpha = I(0.7))     
graph2ppt(file="ggplot2_plot.pptx", width=6, height=5) 

这样可以生成基于Office矢量的原始DrawingML格式的完全可编辑的高质量Powerpoint图,并完全支持透明度。在那里,您可以轻松修复较小的格式问题,并通过打印到PDF导出为高质量的PDF。

您还可以使用它导出到Word,Excel,Latex或HTML,还可以使用它导出各种R stats对象的统计输出。

它还具有graph2eps(file="plot.eps", width=6, height=5, fallback_resolution=600)功能,可以通过光栅化半透明区域导出到eps ...

答案 5 :(得分:0)

我找到了一种简单的方法。

在R图中使用“缩放”,然后单击鼠标右键复制图片。您可以获得带有阴影的图。