【问题标题】:Can transparency be used with PostScript/EPS?PostScript/EPS 可以使用透明度吗?
【发布时间】:2021-04-23 11:47:50
【问题描述】:

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

【问题讨论】:

  • EPS 确实不支持透明度。我们需要更多背景信息来提出合理的替代方案。如果你只是想在白色背景上模仿与透明黑色相关的颜色,这不会那么难,但如果你背后有不同的物体,那就很难了。
  • PostScript 语言不支持透明度,除了像图像蒙版(和蒙版图像)和叠印这样的小事。如果您需要将其作为 PostScript(或 EPS),则必须将其渲染为图像。
  • 基本上我所拥有的是一个时间序列的趋势,8条曲线,然后是由多边形表示的叠加置信带“区域”。
  • 完整代码在我上面的问题的编辑版本中
  • 可能使用非标准扩展。 Ghostscript 有一个非标准的操作符来设置光栅,它可以让你做一些有限数量的混合颜料。当然,由于它是非标准的,它不会在所有解释器上都可用,因此它限制了您的可移植性。对于您的工作流程,这似乎还需要您修改 postscript 生成器或以某种方式对输出进行后处理;并非不可能,但经过进一步思考会变得更加复杂。

标签: r plot transparency postscript


【解决方案1】:

虽然 EPS 格式本身不支持半透明,但仍然可以使用 cairo_ps(),它会自动光栅化半透明区域,并且可以使用参数 @987654322 控制其分辨率@:

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

【讨论】:

    【解决方案2】:

    PostScript 图形模型本身根本不支持页面元素的一般透明度。(因此对于 EPS 也是不可能的。)PostScript 颜色都是完全不透明。

    在另一个对象之上绘制的对象会用自己的颜色覆盖并覆盖所有较低的对象,从而没有任何透明效果的空间。 (如果您看到在 PostScript 查看器或打印输出中看起来像透明度叠加,那么这只是模拟透明度,通过将两者展平(或更多)将各个对象放入一个栅格化区域,从而产生透明的错觉。)

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

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

    我还有什么选择?

    各种:

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

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

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

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

    【讨论】:

    • 科学期刊需要 EPS 格式的图形,而不是 PDF。因此需要透明的EPS。现在,如果 EPS 是使用 pdfmark 从 PDF 转换而来的,那么在创建文章 PDF 的最终版本时是否会保留透明度?
    • @Oposum:既然您声明保存为 PDF 的原始图 确实 确实包含您想要的透明度,请按照我在回答的最后一部分中所说的去做 - 使用这两个步骤的过程:(1) 创建具有透明度的 PDF; (2) 将该 PDF 转换为 EPS(透明部分几乎 看起来 PDF 外观,通过静态光栅​​区域模拟透光效果)。
    • @Oposum: "...如果 EPS 是使用 pdfmark 从 PDF 转换而来的"。 ——你没明白。 pdfmark 运算符必须在 EPS 代码中使用,以便让 Distiller 在使用 EPS 代码作为输入的 PDF 中创建透明部分。当您再次将启用透明度的 PDF 转换回 EPS 时,不能保证您能恢复 pdfmark 运算符...
    • 我不是说科学期刊要求透明 EPS,他们只是要求 EPS,我需要透明。
    • @Oposum:您可能需要它,但它不是 possible 与 EPS。您必须通过将启用透明度的 PDF 拼合为 EPS 来伪造它。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      相关资源
      最近更新 更多