Можно ли использовать прозрачность с 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()

3 ответов


хотя формат 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)

сама графическая модель PostScript не поддерживает общую прозрачность элементов страницы. (следовательно, это также невозможно для EPS.) PostScript цвета все полностью непрозрачного.

объект, нарисованный поверх другого объекта, перезаписывает и покрывает все нижние объекты своим цветом, не оставляя места для прозрачных эффектов. (Если вы посмотреть то, что выглядит как оверлеи прозрачности в PostScript viewer или распечатка, тогда это было только эмулируется прозрачности путем выравнивания двух (или более) соответствующих объектов в одном районе растрирования, создавая иллюзию прозрачности.)

графическая модель PDF основана на PostScript, но она расширяет ее в различных аспектах, добавляя несколько новых функций. Одним из них является реальная прозрачность для полных объектов.

после того, как Adobe добавила прозрачность в PDF, она также создала расширение [1] к существующему языку PostScript, который смог включить код в программы PS, которые добавили бы прозрачность в PDF создано С этот Постскриптум через дистиллятор. Однако при рендеринге на экране или печати на бумаге этот же исходный Постскриптум, включая этот же код, эта дополнительная прозрачность не появится, а верхний (прозрачный в PDF) объект все равно перезапишет нижние, когда непосредственно используется в постскриптуме.

какой другой выбор у меня был бы?

различные:

  1. используйте только PDF. Не используйте EPS.

  2. Если вы должны используйте EPS, используйте двухэтапный процесс:

    • сначала создайте PDF.
    • затем преобразовать из (прозрачность с поддержкой) PDF в EPS,'уплощения' прозрачные элементы в растеризованные области которые имитируют желаемый эффект прозрачности.

[1] имя этого расширения называется pdfmark. С помощью pdfmark оператор можно также добавить другие функции в код PostScript, которые материализуются только при дистилляции этого PostScript в PDF: аннотации, поля интерактивной формы и кнопки, метаданные, гиперссылки и многое другое. Все эти элементы не будут иметь никакого эффекта в прямом PostScript отрисовка на экране или на бумаге.


вместо того, чтобы делать серый из прозрачного черного, я рекомендую использовать gray.colors() функция в R для генерации оттенков серого вам нужно. Тогда ты получишь желаемый взгляд .EPS файл без проблем.