2012-09-04 6 views
10

나는 SO, Googled를 읽고 ?pdf을 읽고, swtiched 할 수있는 레이어가있는 PDF로 플롯을 저장할 수 있는지 pdf 뷰어 여백에서. 내가 말하고자하는 것은 예를 들어 this (압축 된 pdf)과 같이 여러 레이어가있는 pdfs로 다운로드 할 수있는 USGS 쿼드 토포지도입니다.R에 계층화 된 PDF를 저장하는 방법 (Sweave를 통해)

PDF로() 도움말 파일에 다음과 같은 문장이 불길한 소리, 그러나 나는 또한 내가 그것을 잘못 해석 아니에요 있는지 확인하고 싶었 :

내가 일러스트 레이터에서 레이어의 PDF의를 저장할 수하는 데 사용
The R graphics model does not distinguish graphics objects at the level 
of the driver interface. 

, 그러나 더 이상 내 처분에이 프로그램을 가지고 있지 않습니다. 아마도 누군가 R에서 해결 방법을 생각할 수 있을까요? 내가 매핑하는 데 사용하고 데이터는 큰하지만, 여기에 장난감의 예는 다음과 같습니다

그것은이 (그것이 PNG,하지만 위의 PDF를 줄 것이다) enter image description here

내가 좋겠처럼 보이는

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() 

pdf 뷰어 내에서 켜고 끌 수있는 가시성을 가진 레이어로 빨간색과 파란색 상자를 가질 수 있기를 바랍니다.

감사합니다.

편집 : 찾았습니다 : thread in R-help (re : @mnel), 가능하지 않습니다. 나는 누군가가 멋진 R-tastic 해결 방법을 생각해 내었을 때를 대비하여이 질문을 공개적으로 남겨 둘 것입니다.

편집 (2012 년 9 월 5 일) : Sweave를 통해이 작업을 시도하고 here이라는 임시 해결책을 사용하여 부분적으로 성공했습니다. 이 방법은 이미지 아래에 하이퍼 링크로 연결된 텍스트를 사용하여 켜고 끌 수있는 '레이어'가 포함 된 단일 pdf를 만듭니다. 그렇게하기 위해 '애니메이션'속임수를 사용합니다. 아직 궁극적으로 바람직한 결과는 아니지만 특정 PDF 뷰어에 의존하지 않는 이점이 있습니다. 나는 누군가 Sweave 문서에서 OCG를 레이어화할 수있는 방법을 게시했는지를보기 위해 기다려야한다.

편집 (2012 년 9 월 13 일) : 나는 위에서 언급 한 코드를 사용하여 답변을 지금까지 게시했습니다. 미국 내 다른 행정 및 통계 경계의 오버레이로 코드를 변경하지 않고도보다 복잡한 실제 상황에서 작업 할 수있었습니다. 이 경우 다른지도 오버레이 이름을 layer-0.pdf, layer-1.pdf 등으로 지정했는데 오류없이 작동했습니다. 나는 여전히 더 나은 무언가가 더 나은 곳으로 오기를 희망합니다. 당신이

+1

당신은 ['tikzDevice'] (http://cran.r-project.org/src/contrib/Archive/tikzDevice/)를 사용하는 경우 작업이를 얻을 수있을 것와'tikz를 구성 할 수 있습니다 '또는'pgf'를 사용하면 레이어가있는 PDF를 얻을 수 있습니다. 불행히도 패키지는 보관되어 있지만 아름다운 그래픽을 생성합니다. (또는 적어도 2 년 전에 사용했을 때) – mnel

+0

감사합니다. @mnel, 지금 Sweave를 통해이 기능을 테스트 해왔고, . –

+0

ImageMagick이 두 개의 개별 PDF 파일에서 레이어드 된 PDF를 만들 수 있을지 궁금합니다. – Aaron

답변

1

논평 모든

덕분에 나는이 ggplot을 통해 달성 할 수 있어요.

enter image description here

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") 

(이 그림에 딱 png 버전입니다하지만 난 일러스트 레이터에서 pdf을 열 때 필요에 따라, 나는 각 층을 해제 할 수 있습니다). 제 ( tex) animation 대답은 내가 지금 가지고 올 수있는 최고의처럼

enter image description here

+0

일러스트 레이터의 기능? pdf를 가져 오는 과정에서 Illustrator는 모든 벡터 요소를 개별 객체로 분리합니다. Illustrator를 우회하면서 한 상자의 레이어를 만들고 다른 레이어의 레이어를 만들 수있는 솔루션을 기대했습니다. 그래도 고마워! –

+0

일러스트 레이터 문제인지 확실하지 않습니다. 그러나 한 두 가지 요소를 해제하는 것이 필요한 경우이 방법이 정상적으로 작동합니다. 상자를 드래그하여 그룹을 드래그하여 요소 (예 : 축)를 빠르게 그룹화 할 수도 있습니다. 그러면 항목 수가 줄어 듭니다. – Maiasaura

+0

파일을'.svg' 확장자로 저장하는 것은 어떻습니까? 그렇게하면 레이어가 보존되지만 Illustrator를 완전히 피할 수 있습니다 (다른 무료 프로그램을 여는 경우). – Maiasaura

1

보인다. 다음 .Rnw 파일은 가운데에 그림이있는 pdf와 그 아래에 2 개의 텍스트 하이퍼 링크를 만들어 빨간색과 파란색 상자의 가시성을 독립적으로 토글합니다.이 작품을 만드는 Tex 코드를 찾았습니다 here. 나는 아직 @ Aaron의 ocgtools 제안을 보지 않았지만 거기에 도달 할 것이다. 귀하의 제안에 감사드립니다!

\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}