R: 在我的Mac上,半透明效果只显示了一部分

3

我可以生成并保存一个包含半透明效果(alpha)的ggplot图形为.pdf格式:

library(ggplot2)
library(cowplot)
p <- qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = 0.5)
save_plot("plot.pdf",p)

这张图片在我的Mac电脑上(作为pdf中的单独图像或嵌入Word文档)完美地显示出来。然而,多年来我痛苦地发现,我的图像中的半透明通常在他人的电脑上无法正确显示,尤其是当它们被嵌入到微软Office文档中时。当我不得不在会议室的电脑上做演示时,突然间我的PowerPoint演示文稿中的图像什么也没有显示,只有一个空白的图表,这让我非常痛苦。如果我提交一篇论文给一份期刊,并收到编辑发来的电子邮件说我的图像在Word文档中无法正常显示,那也是个问题。由于我的Mac上的图像看起来很好,我找不到任何方法验证这些图像是否正确,除非明确要求别人查看所包含的图像文件。 我已经尝试了一些在线解决方案,例如:
save_plot("plot.pdf",p, useDingbats=F)

或者

save_plot("plot.pdf",p, device = cairo_pdf, fallback_resolution = 1200

但是我仍然收到合作者的电子邮件,说他们无法看到图表,在演示中也会遇到尴尬的时刻,因为图表显示不出任何东西。在地球上,我怎么才能保存我的图表为pdf而不丢失信息呢?此时,我不知道这个问题是否与R中构建图表的方式有关,还是与Microsoft Office处理带有半透明度的pdf图表有关。事实是,我没有看到我的研究网络中其他人遇到这些问题。FYI
> capabilities()
       jpeg         png        tiff       tcltk         X11        aqua    http/ftp 
       TRUE        TRUE        TRUE        TRUE        TRUE        TRUE        TRUE 
    sockets      libxml        fifo      cledit       iconv         NLS     profmem 
       TRUE        TRUE        TRUE        TRUE        TRUE        TRUE        TRUE 
      cairo         ICU long.double     libcurl 
       TRUE        TRUE        TRUE        TRUE  

也许可以尝试使用 ggplot2::ggsave()?但是,save_plot() 在幕后调用它,所以可能没有太大的区别。或者尝试使用 cairo_ps() 通过光栅化透明度来生成 EPS。ggsave("plot.eps", p, device=cairo_ps, fallback_resolution = 1200)不可否认,这并不是一个理想的解决方案。 - Jav
在 Mac 上快速测试 Word 文档并在 Android 上打开,结果只有 EPS 版本可以正常工作。 - Jav
你不能使用 svg 并导出为 svg 而不是 pdf 吗?编辑:这个答案建议使用 postscript 以便与 Word 兼容:https://dev59.com/FGkw5IYBdhLWcg3w8O6o - moodymudskipper
请参见使用 graph2doc 的答案。 - moodymudskipper
2个回答

8

这个问题与 R 或 RStudio 无关。

问题说明:

该问题与在 Mac OS X 上创建和转换 Microsoft Word 文档中嵌入图片的过程有关,以及文档在 Windows 上由 Microsoft Word 渲染的方式。

为什么?实际上,PDF 是苹果绘图系统 Quartz 的本地组件。Mac OS X Quartz 的内部图像模型与 PDF 对象图很好地相互关联,使得显示和操作 pdf 嵌入图片变得容易。

然而,Windows 操作系统则不是这样。【这不是一种批评,只是一种观察。】pdf 引擎未包含在 Windows 中,而是作为一个插件添加的。因此,在 Microsoft Word for Windows 中,Mac OS X Word 文档将无法正确地呈现。此外,似乎没有可用的选项将 PDF 链接为 OLE 链接。

例如:

在 Mac OS X 中,可以将 pdf 图像简单地拖放到 word 文档中。显示的图片将显示为:

enter image description here

现在,如果我们打开文档并在 Windows 10 PC 上查看,将会看到:

enter image description here

解决方法:

推荐的解决方法是将图片保存为 .png 或 .jpg 格式,然后将其插入到 Word 文档中。

library(ggplot2)
library(cowplot)
p <- qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = 0.5)
save_plot("plot.pdf",p)
save_plot("plot.png",p)
save_plot("plot.jpg",p)

结果:

Windows 10 上的 Microsoft Word

enter image description here

附录请求 - EPS

考虑的另一种选项是使用

ggsave("plot.eps", p, device=cairo_ps, fallback_resolution = 1200)

这确实有效,但在Windows 10上渲染的图像中出现了条纹。
EPS隐式转换为EMF是由于安全攻击向量导致的:
这些条纹似乎与隐式转换有关,即Word将EPS图像转换为EMF格式,以满足安全限制。

https://support.office.com/en-us/article/support-for-eps-images-has-been-turned-off-in-office-a069d664-4bcf-415e-a1b5-cbb0c334a840

因此,您可以插入EPS图像,但它似乎被转换为EMF以阻止EPS嵌入脚本攻击向量。
示例:

enter image description here


这正是我在一些测试后怀疑的。谢谢!如果我将图形保存为.eps并将其嵌入Word文档中,是否会遇到相同的问题?ggsave("plot.eps", p, device=cairo_ps, fallback_resolution = 1200) - fede_luppi
@fede_luppi 看起来微软 Word 将 EPS 隐式转换为 EMF 格式,以处理一个嵌入脚本攻击向量的 EPS。请查看更新的答案。注意安全。 - Technophobe01

0

输出文件必须是PDF格式吗?您是否可以直接将图形另存为其他支持透明度的文件类型(例如.png),并将其插入演示文稿或Word文件中?

我之前在Word中插入PDF图像时遇到过格式问题,无论是否使用透明度。


1
  1. 我喜欢矢量图的外观。
  2. 期刊明确要求矢量格式的图形。我可以在文档中嵌入.png格式的图像提交手稿,最终阶段单独包含pdf版本。但是,质量足够的.png图像会使文档过重,因此更难处理。不过,我也可以接受其他工作流程的建议。
- fede_luppi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接