透明度是否可用于PostScript/EPS?

vhmi4jdf  于 2023-01-22  发布在  其他
关注(0)|答案(4)|浏览(152)

我试图将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()
omqzjyyz

omqzjyyz1#

虽然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包(CRAN上刚刚发布),使用函数导出到eps:

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

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

uqdfh47h

uqdfh47h2#

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

绘制在另一个对象之上的对象会用自己的颜色覆盖所有较低的对象,没有为透明效果留下任何空间。(如果你在PostScript查看器或打印输出中 * 看到 * 某个 * 看起来 * 像透明覆盖的东西,那么这只是通过将两个(或更多)相应的对象展平到一个单独的光栅化区域中创建透明错觉而 * 模拟 * 的透明。)
PDF图形模型是基于PostScript的,但它在许多方面进行了扩展,增加了一些新特性,其中之一是完整对象的真实的透明性。
Adobe在PDF中添加透明度后,还为现有的PostScript语言创建了一个扩展***[1]***,该扩展能够包含PS程序中的代码,该代码将通过Distiller为***创建自 * 该PostScript的PDF***添加透明度。然而,当在屏幕上呈现或在纸张上打印包含相同代码的相同原始PostScript时,附加的透明度不会出现。并且当直接在PostScript中使用时,顶部(在PDF中透明)对象仍然会覆盖底部对象。

  • 我还有别的选择吗 *

各种:
1.只使用PDF,不要使用EPS。

  • 如果您 * 必须 * 使用EPS,请使用两步流程:
  • 首先创建PDF。
  • 然后从(启用透明度的)PDF转换为EPS,“展平” 透明元素为模拟所需透明度效果的光栅化区域。
    ***[1]***此扩展名为pdfmark。在pdfmark运算符的帮助下,您还可以向PostScript代码添加其他功能,这些功能仅在将PostScript提取为PDF时才会实现:注解、交互式表单字段和按钮、元数据、超链接等等。所有这些元素在屏幕或纸张打印上的直接PostScript渲染中都不会有任何影响。
ohfgkhjo

ohfgkhjo3#

我建议使用R中的gray.colors()函数来生成你需要的灰度,而不是用透明的黑色来生成灰色,这样你就可以在你的.eps文件中毫无问题地得到你想要的外观。

0lvr5msh

0lvr5msh4#

这对我很有效

legend = plt.legend(loc="upper left", edgecolor="black")
legend.get_frame().set_alpha(None)
legend.get_frame().set_facecolor((0, 0, 0, 0))

相关问题