PostScript / EPS可以使用透明度吗?

时间:2015-03-28 19:41:30

标签: r plot transparency postscript

我正在尝试将R图保存为EPS文件,但我对图的以下组件有问题 - 灰色透明多边形(透明黑色=灰色效果):

polygon(x.polygon, y.polygon.6, col="#00000022", border=NA)

将这段代码保存为PDF而不是EPS时,这行代码可以正常工作。看起来EPS不支持透明度?我还有其他选择吗?

以下是完整情节的代码:

postscript(file="Figure.eps", width=5.5, height=5.5, onefile=F, horizontal=F)

ts(t(data.frame(initial_timepoint, second_timepoint, third_timepoint, final_timepoint)))->obj
obj[,-c(3,7)]->obj1
plot(obj1, plot.type="single", lwd=0.6, xaxs="i",yaxs="i",xlab="",ylab="LV ejection fraction (%)",xaxt='n',yaxt='n',ylim=c(0,70),col="black")
axis(1, at=c(1,2,3,4), labels=c("1","2","3","4"),cex.axis=1)
axis(2, at=seq(0,70,10), labels=c("0%","10%","20%","30%","40%","50%","60%","70%"),cex.axis=1, las=1)
abline(v=c(2,3),lwd=0.6,lty=2)

stderr <- function(x) sqrt(var(x,na.rm=TRUE)/length(na.omit(x)))
avg<-c(mean(initial_timepoint,na.rm=T), mean(second_timepoint,na.rm=T), mean(third_timepoint,na.rm=T), mean(final_timepoint,na.rm=T))
err<-c(stderr(initial_timepoint), stderr(second_timepoint), stderr(third_timepoint), stderr(final_timepoint))

my.count <- c(1,2,3,4)
my.count.rev <- c(4,3,2,1)
y.polygon.6 <- c((avg+err*1.96)[my.count],(avg-err*1.96)[my.count.rev])
x.polygon <- c(my.count, my.count.rev)
polygon(x.polygon, y.polygon.6, col="#00000022", border=NA)
lines(avg,col="black",lwd=0.8,lty=3)
lines((avg+err*1.96),lwd=0.8,lty=3)
lines((avg-err*1.96),lwd=0.8,lty=3)

dev.off()

3 个答案:

答案 0 :(得分:14)

虽然EPS格式本身不支持半透明,但仍然可以使用cairo_ps(),自动光栅化半透明区域,并且可以使用参数控制执行此操作的分辨率fallback_resolution

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)

或者使用新的export软件包将函数导出到eps,这个软件包刚刚出现在CRAN上:

install.packages("export")
library(export)
graph2eps("filename.eps", fallback_resolution = 600)

该软件包还支持许多其他导出格式,包括Powerpoint(graph2ppt),请参阅?graph2vector,这也保留了半透明...

答案 1 :(得分:9)

PostScript图形模型本身根本不支持页面元素的一般透明度。 (因此EPS也不可能。)PostScript颜色全部< EM>不透明

在另一个对象上绘制的对象将覆盖并覆盖具有自己颜色的所有下层对象,从而没有透明效果的空间。 (如果您在PostScript查看器或打印输出中看到看起来的内容(如透明度叠加层),那么只有模拟透明度,通过展平两者(或者更多)将各个对象分成一个光栅化区域,形成透明的幻觉。)

PDF图形模型基于PostScript,但它在各个方面进行了扩展,增加了几个新功能。其中之一是完整对象的真实透明度。

Adob​​e为PDF添加了透明度之后,它还为现有的PostScript语言创建了一个扩展名 [1] ,该语言能够在PS程序中包含可增加透明度的代码 到PDF 通过Distiller从这个PostScript创建。但是,当在屏幕上渲染或在纸上打印包含相同代码的相同原始PostScript时,不会出现额外的透明度,并且在PostScript中直接使用时,顶部(PDF中的透明)对象仍将覆盖底部对象。

  

我还有其他选择吗?

各种:

  1. 仅使用PDF。不要使用EPS。

  2. 如果必须使用EPS,请使用两个步骤:

    • 首先创建PDF。
    • 然后从(启用透明度的)PDF转换为EPS,将'展平'透明元素转换为模拟所需透明效果的栅格化区域。

  3. [1] 此扩展程序的名称称为pdfmark。在pdfmark运算符的帮助下,还可以向PostScript代码添加其他功能,这些功能仅在将此PostScript提取为PDF时实现:注释,交互式表单域和按钮,元数据,超链接等。所有这些元素都不会对屏幕上或纸质打印件上的直接PostScript渲染产生任何影响。

答案 2 :(得分:0)

我建议使用R中的gray.colors()函数来生成所需的灰色阴影,而不是使用透明黑色制作灰色。然后,您可以毫无问题地在.eps文件中获得所需的外观。