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

时间:2015-02-10 19:32:05

标签: r rstudio lyx

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

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

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

  2. 使用setEPS()后跟postscript(),使用所需的尺寸依此类推,然后使用library(ggplot2)进行情节调用,例如, ggplot()

  3. 起初我认为问题可能在其他地方。但后来我在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")
    

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

    教训是,如果您坚持使用EPS,则必须关闭透明带。在这种情况下,请设置alpha=1(或者不要包含它)和se=FALSE

2 个答案:

答案 0 :(得分:10)

问题是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)

您可以使用pdftops,Inkscape或Adobe Illustrator将PDF转换为EPS。

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

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

library( ReporteRs )
require( ggplot2 )
data=data.frame(replicate(2,rnorm(1000)))
mydoc = pptx(  )
mydoc = addSlide( mydoc, slide.layout = "Title and Content" )
myplot = ggplot(data = data, aes(x=X1, y=X2)) +
  geom_point(alpha=0.4) +
  stat_smooth(se=T, method="lm")
mydoc = addPlot( mydoc, function( ) print( myplot ), vector.graphic=T, offx=1,offy=0,width=10, height=7.5, fontname="Arial", pointsize=20)  
writeDoc( mydoc, file = "plot.pptx" )

enter image description here

编辑:如果您与EPS格式相关联,而EPS格式不能真正支持半透明度,则可以使用cairo_ps(),一个光栅化半透明区域,但将其余区域保留为矢量格式。在cairo_ps()的最新更新中,现在还有一个参数fallback_resolution来控制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()

甚至更短:

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

答案 1 :(得分:2)

不是解决方案,但我发现的最短工作是将alpha设置为1并更改另一个程序中的透明度,例如在插画中使用选择,然后全部相同,然后改变所有的透明度/不透明度。如果R会添加一个允许eps透明度的功能,那将是非常好的。