【问题标题】:How do I preserve transparency in ggplot2?如何保持 ggplot2 的透明度?
【发布时间】:2018-11-04 07:32:01
【问题描述】:

我喜欢 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

有解决方法吗?

【问题讨论】:

  • 下面还有一个简单的解决方案,可以以可编辑的基于矢量的格式直接导出到 Powerpoint,您可以在其中轻松修复轻微的格式问题,并完全保留透明度。看看是否适合你...
  • 我认为我在下面的回答更准确、更全面地回答了您的问题,因此您可能希望将其作为正确答案进行检查 - 好吧,看看您的想法...
  • 使用新的导出包在下面添加了一个解决方案-我认为实际上应该将其标记为正确答案...

标签: r


【解决方案1】:

这行得通:

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

【讨论】:

  • 这确实有效。为什么没有评论就被否决了?
  • 我同意——这是一个很好的解决方案,我打算经常使用。
  • 正如这里指出的stackoverflow.com/a/31380625/4598520cairo_ps 自动光栅化透明度,但在低分辨率(72 dpi)下这样做
  • 您还可以添加参数 fallback_resolution 来控制半透明区域被光栅化的分辨率(这是在最近的 R 更新中引入的),例如您现在可以使用 ggsave("filename.eps", device=cairo_ps, fallback_resolution = 600)
  • 尝试添加 fallback_resolution 时出现未使用的参数错误? @TomWenseleers
【解决方案2】:

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

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

【讨论】:

  • 您还可以添加参数 fallback_resolution 来控制半透明区域被光栅化的分辨率(这是在最近的 R 更新中引入的)(例如,对于 600 dpi,fallback_resolution=600)
  • 赞成这个解决方案,因为它为这个问题提供了广泛的功能。在我的情况下,我将 grid.arrange 用于多个绘图,而其他解决方案将不起作用
【解决方案3】:

R 的 eps “设备”不支持部分透明,但是,如果我没记错的话,它的 PDF 设备支持。 Illustrator 应该能够以与 EPS 同等便利的方式阅读 PDF,或者如果不能,请尝试在生成后使用 pdftops 转换它们(不是 pdf2ps,它们是完全不同的程序,pdf2ps 的输出是 . ..劣质)。

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

【讨论】:

  • 谢谢!对于那些使用 OSX 的人来说,tex.aanhet.net/epspdf/#install">here</a> 是一个将 pdf 转换为 eps 的简单工具。
  • 呃……这行不通。除非我错过了一个选项,否则如果我尝试pdftops -eps graph.pdf graph.eps,其中图形具有半透明矢量线,那么图形的这些部分将在 EPS 中被光栅化。这几乎没用(我不妨转换为 jpeg)。 tex.stackexchange.com/a/24287/13192 表示 postscript 根本不支持半透明...
  • @naught101 嗯,我以为在某些时候已经将其添加到后记中。我不知道你的情况是什么,但我会尝试完全消除 EPS 文件的使用——例如 pdfTeX 可以很好地使用 PDF 格式的图形(实际上这比 更容易让它吃EPSes)。
  • 扎克:我知道。这个对我有用。不过,我不能帮助我投稿的期刊在技术上落后。
  • @naught101 是的,抱歉,您可能会遇到麻烦。
【解决方案4】:

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

【讨论】:

  • SVG 也可以工作,尽管它在背景中创建了奇怪的、大的、半透明的字母。背景中有一个非常大的O,X,Y。但我能够删除那些。所以这是另一个允许跳过转换的选项。谢谢。
【解决方案5】:

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) 

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

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

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

【讨论】:

    【解决方案6】:

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

    在 R 绘图中使用“缩放”并单击鼠标右键复制图片。你可以得到一个有阴影的情节。

    【讨论】:

      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 2013-04-11
      • 2011-03-02
      • 2011-02-07
      • 1970-01-01
      • 2021-10-08
      • 2012-05-29
      • 2011-05-11
      相关资源
      最近更新 更多