当将绘图保存为封装的postscript(.eps)时,R会丢失信息

inv*_*tus 5 r lyx rstudio

Lyx和Latex使用.eps图像精彩地工作.但是当我从Rstudio导出带有平滑曲线的散点图时,这些点会丢失,并且只会使用曲线传递绘图.

我尝试过的两种保存方法是:

  1. 在Rstudio中,从图像字段的下拉菜单中选择"导出",然后另存为.eps.有趣的是,情节在Rstudio预览中应该显示.

  2. 前言积代码与setEPS()随后postscript(),将具有所需尺寸等,随后使用积呼叫library(ggplot2),例如ggplot().

起初我认为问题可能在其他地方.但后来我在Mathematica中保存了一个.eps并没有问题.

我在互联网上偷窥,发现在R中保存.eps的其他问题,但没有一个处理丢失的信息.

到底发生了什么?

我应该提一下.在Lyx中的.eps成像器渲染比任何其他格式都要好,所以我坚持使用.eps.

非常感谢你的投入,我还不能投票给他们.

编辑

据我所知,由于EPS无法保持透明度,因此这个问题是死路一条.(见评论.)根据要求,我发布了突出问题的代码.

说你有数据data <- data.frame(replicate(2,rnorm(1000))).你想绘制它们,但有很多点,所以你添加一个透明度参数.此外,还可以添加具有置信区间的拟合线.你的代码是:

ggplot(data = data, aes(x=X1, y=X2)) +
    geom_point(alpha=0.4) +
    stat_smooth(se=T, method="lm")
Run Code Online (Sandbox Code Playgroud)

看起来不错.但是,如果您尝试将绘图保存为EPS,则稍后打开保存文件时所看到的只是一个空的绘图对象,除了蓝色拟合线.

教训是,如果你坚持使用EPS,你必须关闭透明带.在这种情况下,设置alpha=1(或只是不包括它)和se=FALSE.

Tom*_*ers 11

问题是R中的EPS不支持透明度.

一种选择是导出为PDF,完全支持透明度:

ggplot(data = data, aes(x=X1, y=X2)) +
  geom_point(alpha=0.4) +
  stat_smooth(se=T, method="lm")
dev.copy2pdf(file="plot.pdf",out.type="cairo", width=10, height=7.5)
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用pdftopsInkscape或Adobe Illustrator 将PDF转换为EPS .

保存为高分辨率PNG也适用于透明度,但当然它不再是矢量格式...

或者您可以使用包导出到Powerpoint export,它为您提供完全可编辑的矢量格式,同时完全支持透明度:

library(export)
library(ggplot2)
data=data.frame(replicate(2,rnorm(1000)))
ggplot(data = data, aes(x=X1, y=X2)) +
  geom_point(alpha=0.4) +
  stat_smooth(se=T, method="lm")
graph2ppt(file="plot.pptx", width=8, height=6)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:如果你绑定到EPS格式,它不能真正支持半透明,你可以使用ReporteRs,一个光栅化半透明区域,但保持其余为矢量格式.在最近的更新中cairo_ps(),现在还有一个参数cairo_ps()来控制dpi中的分辨率,其中半透明区域被光栅化(其余区域保持为矢量格式).因此,您可以使用:

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

甚至更短:

graph2eps(file="plot.pptx", width=8, height=6, cairo=TRUE, fallback_resolution=600)
Run Code Online (Sandbox Code Playgroud)