transparente - ¿Se puede usar la transparencia con PostScript/EPS?
guardar imagen con fondo transparente paint (3)
Intento guardar un diagrama R como un archivo EPS, pero tengo un problema con el siguiente componente de la gráfica: el polígono gris transparente (negro transparente = efecto gris):
polygon(x.polygon, y.polygon.6, col="#00000022", border=NA)
Esta línea de código funciona bien al guardar el diagrama como PDF pero no como EPS. Parece que EPS no es compatible con la transparencia? ¿Qué otra opción tendría?
Aquí está el código para la trama completa:
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()
En lugar de hacer gris en negro transparente, recomiendo usar la función gray.colors()
en R para generar los tonos de gris que necesita. Luego obtienes el aspecto que deseas en tu archivo .eps sin ningún problema.
El modelo de gráficos PostScript en sí no admite la transparencia general de los elementos de página. (Por lo tanto, tampoco es posible para EPS.) Los colores PostScript son todos completamente opacos .
Un objeto dibujado sobre otro objeto sobrescribirá y cubrirá todos los objetos inferiores con su propio color, sin dejar espacio para efectos transparentes. (Si ve algo que se ve como superposiciones de transparencia en un visor o impresión de PostScript, entonces eso solo fue una transparencia emulada , aplanando los dos (o más) objetos respectivos en un solo área rasterizada creando la ilusión de transparencia).
El modelo de gráficos PDF se basa en PostScript, pero lo amplía en varios aspectos, agregando varias características nuevas. Uno de estos es la transparencia real para objetos completos.
Después de que Adobe agregó transparencia a PDF, también creó una extensión [1] para el lenguaje PostScript existente que podía incluir código en programas de PS que agregaría transparencia a los PDF creados a partir de este PostScript a través de Distiller. Sin embargo, cuando se renderiza en la pantalla o se imprime en papel este mismo PostScript original que incluye este mismo código, esa transparencia adicional no aparecerá, y el objeto superior (transparente en PDF) aún sobrescribirá los de abajo cuando se use directamente en PostScript.
¿Qué otra opción tendría?
Varios:
Use solo PDF. No use EPS.
Si debe usar EPS, use un proceso de dos pasos:
- Crea el PDF primero.
- A continuación, convierta del PDF (con transparencia habilitada) a EPS, "aplanar" los elementos transparentes en áreas rasterizadas que emulen el efecto de transparencia deseado.
[1] El nombre de esta extensión se llama pdfmark
. Con la ayuda del operador pdfmark
también se pueden agregar otras características al código PostScript que solo se materializan al destilar este PostScript a PDF: anotaciones, campos y botones de formularios interactivos, metadatos, hipervínculos y más. Todos estos elementos no tendrían ningún efecto en la representación directa de PostScript en la pantalla o en impresiones en papel.
Aunque el formato EPS no admite semi-transparencia de forma nativa, aún es posible usar cairo_ps()
, que rasteriza automáticamente áreas semitransparentes, y la resolución en la que lo hace se puede controlar con el argumento 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()
Todas las áreas no semitransparentes se conservan como gráficos vectoriales.
O incluso más corto también puedes usar:
ggsave("filename.eps", device=cairo_ps, fallback_resolution = 600)