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

Can transparency be used with PostScript/EPS?

我正在尝试将 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()

PostScript 图形模型本身根本不支持页面元素的一般透明度。(因此对于 E PS.) PostScript 颜色全部 不透明.

绘制在另一个对象之上的对象会用自己的颜色覆盖并覆盖所有下方的对象,从而没有透明效果的余地。 (如果您看到某些东西看起来像 PostScript 查看器或打印输出中的透明覆盖,那么那只是模拟 透明度,通过将两个(或更多)各自的对象展平到一个单独的光栅化区域中,从而产生透明的错觉。)

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

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

What other choice would I have?

各种:

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

  2. 如果您必须使用 EPS,请使用两步过程:

    • 先创建 PDF。
    • 然后将(启用透明的)PDF 转换为 EPS、'flattening' 将透明元素转换为模拟所需透明效果的栅格化区域.

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

虽然 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,它还保留半透明...

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