2012-09-04 5 views
10

He buscado SO, Google, lea ?pdf, y me pregunto si existe la posibilidad de guardar una parcela como un pdf con capas que se pueden aplicar sobre y apagado en los márgenes del visor de PDF. Un ejemplo de lo que estoy hablando son los mapas topográficos cuádruples del USGS, que se pueden descargar como archivos PDF con varias capas, como this (zip comprimido).Cómo guardar un pdf en capas en R (¿a través de Sweave?)

la siguiente frase en el archivo PDF de ayuda() suene generalizado, pero también quería comprobar que no estoy mal interpretando que:

The R graphics model does not distinguish graphics objects at the level 
of the driver interface. 

solía ser capaz de ahorrar en capas de PDF en Illustrator, pero ya no tengo este programa a mi disposición. Tal vez alguien pueda pensar en una solución dentro de R? Los datos que estoy usando para mapear son grandes, pero aquí hay un ejemplo de juguete:

pdf("2objects.pdf") 
plot(NULL, type = "n",xlim = c(0,1),ylim = c(0,1)) 
rect(0,.7,.7,0,border = "blue",lwd=2) 
rect(.3,1,1,.3,border = "red",lty=2,lwd=2) 
dev.off() 

Parece que este (que es un png, pero lo anterior dará un pdf) enter image description here

que había Me gusta poder tener los cuadros rojo y azul como capas con visibilidad que se puede activar y desactivar desde el visor de PDF.

¡Muchas gracias!

Editar: encontrado thread in R-help (re: @mnel), y parece que no es posible. Debo dejar esta pregunta abierta, en caso de que alguien haya encontrado una ingeniosa solución R-tastic.

Editar (5 de septiembre de 2012): Intenté hacer esto a través de Sweave, y logré un éxito parcial usando la solución publicada here. Este método produce un solo pdf con 'capas' que se puede activar y desactivar usando texto hipervinculado debajo de las imágenes. Utiliza el truco de la "animación" para hacerlo. Aunque todavía no es mi resultado final deseado, tiene la ventaja de no depender de los lectores de pdf en particular. Todavía esperaré para ver si alguien publica una forma de hacer capas, también conocido como OCG en un documento Sweave, que luego podría automatizar.

Editar (13 de septiembre de 2012): Publiqué mi progreso hasta el momento como respuesta, utilizando el código mencionado anteriormente. Pude hacerlo funcionar en una situación más compleja del mundo real sin alteraciones en el código con superposiciones de diferentes límites administrativos y estadísticos dentro de los EE. UU. En este caso, acabo de nombrar las diferentes superposiciones de mapa layer-0.pdf, layer-1.pdf, etc., y funcionó sin error. Todavía espero que algo mejor aparezca aquí eventualmente.

Gracias a todos por los comentarios que

+1

Usted puede ser capaz de conseguir que esto funcione si se utiliza [ 'tikzDevice'] (http://cran.r-project.org/src/contrib/Archive/tikzDevice/) y puede configurar' TikZ 'o' pgf' para darle un pdf con capas. Desafortunadamente el paquete está archivado, pero produce hermosos gráficos (o al menos lo hizo, cuando lo usé hace 2 años) – mnel

+0

gracias @mnel, lo he estado probando ahora a través de Sweave y publicaré si encuentro algo . –

+0

Me pregunto si ImageMagick podría hacer un pdf en capas de dos separadas. – Aaron

Respuesta

1

soy capaz de lograr esto a través de ggplot.

library(ggplot2) 
df <- data.frame(x = c(1,10), y = c(20,40), class = 1:2) 
layered_plot <- ggplot(df, aes(xmin = x, xmax = x + 1, ymin = y, ymax = y + 2, fill = class)) + 
geom_rect() + 
opts(legend.position = "none") 
# Now save this as pdf 
ggsave(layered_plot, file="p1.pdf") 

enter image description here

(Esto es sólo la versión png para la ilustración, pero al abrir el pdf en Illustrator, I puede apagar las capas individuales según sea necesario).

enter image description here

+0

¿Podría ser esto? una característica de Illustrator? parece que al importar un pdf, Illustrator divide todos los elementos vectoriales en objetos individuales. Esperaba una solución que pudiera hacer una capa para una caja y una capa para la otra mientras eludía a Illustrator. ¡Gracias! –

+0

No estoy seguro de si es un problema de ilustrador. Pero si todo lo que necesita hacer es apagar un elemento o dos, esto funciona bien. También puede agrupar rápidamente elementos (como los ejes) arrastrando un cuadro alrededor de él y golpeando el grupo. Eso ayudará a reducir la cantidad de artículos. – Maiasaura

+0

¿Qué tal si guardamos el archivo con la extensión '.svg'? Esto preservará las capas (de manera similar) pero también sorteará a Illustrator por completo (si tiene otro programa gratuito para abrir). – Maiasaura

1

Parece que el (tex) animation respuesta es lo mejor que puedo llegar a este momento. El siguiente archivo .Rnw creará un pdf con una figura en el centro, y 2 hipervínculos de texto debajo de él, que alternarán la visibilidad de los cuadros rojo y azul de forma independiente.Encontré el código de Tex que hace que esto funcione here. No he consultado todavía la sugerencia de @ Aaron ocgtools, pero llegaré allí. Gracias a todos por sus sugerencias!

\documentclass{article} 
%----------------------------------------------------------------%\ 
\usepackage[OT1]{fontenc} 
\usepackage{Sweave} 
\usepackage{animate} 
\usepackage{hyperref} 
\usepackage[margin=0.4in]{geometry} 
%----------------------------------------------------------------% 

\makeatletter 
% command to create a toggle link 
\newcommand{\ShowHideLayer}[3]{% 
    % #1: anim No. (zero-based), 
    % #2: layer No. (zero-based), 
    % #3: link text 
    \leavevmode% 
    \pdfstartlink user { 
    /Subtype /Link 
    /Border [\@pdfborder]% 
    /A << 
     /S/JavaScript 
     /JS (
     \if at [email protected]% 
      if(a#1.fr[#2].state==true){ 
      a#1.fr[#2].state=false; 
      }else{ 
      a#1.fr[#2].state=true; 
      } 
     \else 
      if (a#1.fr[#2].display==display.visible){ 
      a#1.fr[#2].display=display.hidden; 
      }else{ 
      a#1.fr[#2].display=display.visible; 
      } 
      this.dirty=false; 
     \fi 
    ) 
    >> 
    }#3% 
    \pdfendlink% 
} 

% command to create a link to show/hide all layers 
\newcommand{\ShowHideAll}[2]{% 
    % #1: anim No. (zero-based), 
    % #2: link text 
    \leavevmode% 
    \pdfstartlink user { 
    /Subtype /Link 
    /Border [\@pdfborder]% 
    /A << 
     /S/JavaScript 
     /JS (
     var countvisible=0; 
     for(var i in a#1.fr){ 
      \if at [email protected] 
      if(a#1.fr[i].state==true){countvisible++;} 
      \else 
      if (a#1.fr[i].display==display.visible){countvisible++;} 
      \fi 
     } 
     if(countvisible){ 
      for(var i in a#1.fr){ 
      \if at [email protected] 
       a#1.fr[i].state=false; 
      \else 
       a#1.fr[i].display=display.hidden; 
       this.dirty=false; 
      \fi 
      } 
     } 
     else{ 
      for(var i in a#1.fr){ 
      \if at [email protected] 
       a#1.fr[i].state=true; 
      \else 
       a#1.fr[i].display=display.visible; 
       this.dirty=false; 
      \fi 
      } 
     } 
    ) 
    >> 
    }#2% 
    \pdfendlink% 
} 
\makeatother 

\begin{document} 

% heres the R-making of the plots, saved to working directory, 
% which should be the folder containing this .Rnw file 
% 3 versions of the same plot, one for each layer 
<<echo = FALSE, hide = TRUE>>= 
pdf("layer-0.pdf") 
plot(NULL, type = "n", xlim = c(0, 1), ylim = c(0, 1), xlab = "", ylab = "") 
dev.off() 

pdf("layer-1.pdf") 
plot(NULL, type = "n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, xlab = "", ylab = "") 
rect(0, .7, .7, 0, border = "blue", lwd = 2) 
dev.off() 

pdf("layer-2.pdf") 
plot(NULL, type = "n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE, xlab = "", ylab = "") 
rect(.3, 1, 1, .3, border = "red", lty = 2, lwd = 2) 
dev.off() 
@ 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
\begin{center} 
    %animated layer-set No. 0 
    %           v-- frame rate ignored 
    \animategraphics[width=1\linewidth,step]{1}{layer-}{0}{2} 

    \ShowHideLayer{0}{1}{toggle red box}\\ 
    \ShowHideLayer{0}{2}{toggle blue box}\\ 
\end{center} 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
\end{document} 
Cuestiones relacionadas