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

person Oposum    schedule 28.03.2015    source источник
comment
EPS действительно не поддерживает прозрачность. Нам нужно немного больше контекста, чтобы предложить разумные альтернативы. Если вы просто хотите имитировать цвет, связанный с прозрачным черным цветом на белом фоне, это будет не так сложно, но если у вас есть разные объекты за ним, это будет сложно.   -  person Ben Bolker    schedule 28.03.2015
comment
Язык PostScript не поддерживает прозрачность, за исключением второстепенных вещей, таких как маски изображений (и маскированные изображения) и наложение. Если вам это нужно в формате PostScript (или EPS), вам придется преобразовать его в изображение.   -  person KenS    schedule 28.03.2015
comment
По сути, у меня есть временной ряд трендов, 8 кривых, а затем наложенная область доверительного интервала, представленная многоугольником.   -  person Oposum    schedule 29.03.2015
comment
Полный код находится в отредактированной версии моего вопроса выше.   -  person Oposum    schedule 29.03.2015
comment
это все еще не воспроизводимо. Вероятно, вы можете получить то, что хотите, нарисовав доверительную полосу серым цветом (не прозрачным, но выглядящим так, как будто бы), а затем повторно нанеся все, что было скрыто ею...   -  person Ben Bolker    schedule 29.03.2015
comment
Возможно использование нестандартного расширения. В Ghostscript есть нестандартный оператор для установки rasterop, который позволит вам смешивать краски в ограниченном количестве. Конечно, будучи нестандартным, он будет доступен не во всех интерпретаторах и, таким образом, ограничивает вашу переносимость. И для вашего рабочего процесса, кажется, это также потребует от вас модификации генератора постскриптума или какой-либо постобработки вывода; не невозможно, но усложняется при дальнейшем размышлении.   -  person luser droog    schedule 29.03.2015
comment
Я подумал, можно ли изменить код графика так, чтобы сначала рисовался многоугольник, а затем линии временного ряда накладывались поверх многоугольника?   -  person Oposum    schedule 29.03.2015
comment
Ниже добавлено решение — угадайте, что один из них должен быть помечен как правильный ответ, так как он наиболее точно соответствует тому, о чем вы просили!   -  person Tom Wenseleers    schedule 04.04.2017


Ответы (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)

Или используйте функции для экспорта в eps с помощью нового пакета export, который только что вышел на CRAN:

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

Этот пакет также поддерживает ряд других форматов экспорта, включая Powerpoint (graph2ppt), см. ?graph2vector, который также сохраняет полупрозрачность...

person Tom Wenseleers    schedule 13.07.2015

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

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

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

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

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

Различный:

  1. Используйте только PDF. Не используйте ЭПС.

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

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

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

person Kurt Pfeifle    schedule 29.03.2015
comment
Для научных журналов требуется графика в формате EPS, а не в формате PDF. Отсюда и необходимость в прозрачной ЭПС. Теперь, если EPS является преобразованием из PDF с использованием pdfmark, сохранится ли прозрачность при создании окончательной версии статьи PDF? - person Oposum; 29.03.2015
comment
@Oposum: ... следовательно, нужна прозрачная EPS. Это не следует, это не логично. Также нет ни одного научного журнала в мире, который мог бы потребовать прозрачную ЭПС, поскольку прозрачность в ЭПС просто невозможна. Никогда не была! Единственный вариант — эмулировать прозрачность, созданную путем выравнивания (= растеризации) PDF-файла с прозрачностью. - person Kurt Pfeifle; 29.03.2015
comment
@Oposum: Поскольку вы заявили, что ваш исходный график, сохраненный в формате PDF, действительно действительно содержит прозрачность, как вы хотите, просто сделайте то, что я сказал в последней части моего ответа, - используйте этот двухэтапный процесс: (1) создать PDF с прозрачностью; (2) преобразовать этот PDF в EPS (прозрачные части будут почти выглядеть как PDF, эмулируя эффект просвечивания через статическую растровую область ). - person Kurt Pfeifle; 29.03.2015
comment
@Oposum: ...если EPS является преобразованием из PDF с использованием pdfmark. -- Вы не поняли. Оператор pdfmark должен использоваться в коде EPS, чтобы позволить Distiller создавать прозрачные разделы в PDF-файле, который использует этот код EPS в качестве входных данных. Вы не гарантируете, что оператор pdfmark вернется обратно, когда вы снова конвертируете PDF с включенной прозрачностью обратно в EPS... - person Kurt Pfeifle; 29.03.2015
comment
Я не имел в виду, что научные журналы просят прозрачную ЭПС, они просто просят ЭПС, а мне нужна прозрачность. - person Oposum; 31.03.2015
comment
@Oposum: вам это может понадобиться, но это невозможно с EPS. Вам нужно подделать его, сведя PDF с включенной прозрачностью в EPS. - person Kurt Pfeifle; 31.03.2015
comment
В R вы также можете использовать cairo_ps(), который автоматически растрирует полупрозрачные области — см. мой ответ ниже! Однако качество не идеальное - лучше экспортировать в PDF, а оттуда сохранять в формате EPS в полной версии Adobe Acrobat... - person Tom Wenseleers; 13.07.2015

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

person safelyanonymous    schedule 08.08.2017