2012-09-04 34 views
10

Tôi đã tìm kiếm SO, Googled, đọc ?pdf và trở nên khô khan như khả năng lưu một âm mưu dưới dạng pdf với các lớp có thể được thu nhỏ và trong biên độ người xem pdf. Một ví dụ về những gì tôi đang nói đến là USGS quad-topo-maps, có thể được tải xuống dưới dạng pdf với nhiều lớp, chẳng hạn như this (pdf nén).Làm thế nào để lưu một lớp pdf trong R (thông qua Sweave?)

Câu sau đây trong pdf() tập tin trợ giúp âm thanh đáng ngại, nhưng tôi cũng muốn kiểm tra rằng tôi không hiểu sai nó:

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

tôi đã sử dụng để có thể tiết kiệm nhiều lớp của pdf trong Illustrator, nhưng không còn có chương trình này theo ý của tôi nữa. Có lẽ ai đó có thể nghĩ ra một cách giải quyết từ bên trong R? Các dữ liệu tôi đang sử dụng để lập bản đồ lớn, nhưng đây là một ví dụ đồ chơi:

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

Nó trông giống như thế này (đó là một png, nhưng ở trên sẽ cung cấp cho một pdf) enter image description here

Tôi muốn thích có thể có các hộp màu đỏ và màu xanh làm các lớp có khả năng hiển thị có thể bật và tắt từ bên trong trình xem pdf.

Rất cám ơn!

Chỉnh sửa: tìm thấy thread in R-help (re: @mnel) và có vẻ như không thể thực hiện được. Tôi sẽ vẫn để câu hỏi này mở ra, trong trường hợp ai đó đã đưa ra giải pháp R-tastic tiện lợi.

Chỉnh sửa (ngày 5 tháng 9 năm 2012): Tôi đã thử thực hiện điều này qua Sweave và đạt được một phần thành công khi sử dụng giải pháp được đăng here. Phương pháp này tạo ra một pdf đơn với 'lớp' có thể được bật và tắt bằng cách sử dụng văn bản siêu liên kết bên dưới hình ảnh. Nó sử dụng thủ thuật 'hoạt hình' để làm như vậy. Trong khi nó vẫn không phải là kết quả mong muốn cuối cùng của tôi, nó có lợi thế là không phụ thuộc vào người xem pdf cụ thể. Tôi vẫn sẽ chờ đợi để xem có ai đó đăng một cách để làm các lớp, hay còn gọi là OCG trong một tài liệu Sweave, mà sau đó tôi có thể tự động hóa.

Chỉnh sửa (ngày 13 tháng 9 năm 2012): Tôi đã đăng sự tiến bộ của mình cho đến nay làm câu trả lời, sử dụng mã được đề cập ở trên. Tôi đã có thể làm cho nó hoạt động trong một tình huống thế giới thực phức tạp hơn mà không có sự thay đổi mã với các lớp phủ của các ranh giới hành chính và thống kê khác nhau ở Hoa Kỳ. Trong trường hợp này, tôi chỉ đặt tên các lớp phủ bản đồ khác nhau layer-0.pdf, layer-1.pdf, v.v. và nó hoạt động không có lỗi. Tôi vẫn hy vọng một cái gì đó tốt hơn bật lên ở đây cuối cùng.

Cảm ơn tất cả cho bạn bình luận

+1

Bạn có thể có thể có được điều này để làm việc nếu bạn sử dụng [ 'tikzDevice'] (http://cran.r-project.org/src/contrib/Archive/tikzDevice/) và có thể cấu hình 'tikz 'hoặc' pgf' để cung cấp cho bạn một pdf với các lớp. Thật không may là gói được lưu trữ, nhưng nó tạo ra đồ họa đẹp (hoặc ít nhất là, khi tôi sử dụng nó 2 năm trước) – mnel

+0

cảm ơn @mnel, tôi đã cố gắng này bây giờ thông qua Sweave và sẽ đăng nếu tôi đến với bất cứ điều gì . –

+0

Tôi tự hỏi liệu ImageMagick có thể tạo một lớp pdf ra khỏi hai phần riêng biệt không? – Aaron

Trả lời

1

tôi có thể đạt được điều này thông qua 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

(Đây chỉ là phiên bản png để minh hoạ nhưng khi tôi mở pdf trong Illustrator, tôi có thể tắt các lớp cá nhân khi cần thiết).

enter image description here

+0

Đây có phải là một tính năng của Illustrator? có vẻ như khi nhập một tệp pdf, Illustrator sẽ chia nhỏ tất cả các phần tử vectơ thành các đối tượng riêng lẻ. Tôi đã hy vọng cho một giải pháp mà có thể làm cho một lớp cho một hộp và một lớp cho khác trong khi phá vỡ Illustrator. Cảm ơn mặc dù! –

+0

Không chắc đó có phải là vấn đề minh họa hay không. Nhưng nếu tất cả những gì bạn cần làm là tắt một hoặc hai phần tử, điều này hoạt động tốt. Bạn cũng có thể nhanh chóng nhóm các phần tử (như trục) bằng cách kéo một hộp xung quanh nó và nhấn nhóm. Điều đó sẽ giúp giảm số lượng mặt hàng. – Maiasaura

+0

Còn lưu tệp bằng phần mở rộng '.svg' thì sao? Điều đó sẽ bảo tồn các lớp (tương tự) nhưng cũng phá vỡ Illustrator hoàn toàn (nếu bạn có một chương trình miễn phí để mở với). – Maiasaura

1

Hình như (tex) animation Câu trả lời là tốt nhất mà tôi có thể đưa ra ngay bây giờ. Các tập tin .Rnw sau sẽ tạo ra một pdf với một con số ở giữa, và 2 siêu liên kết văn bản bên dưới nó, mà chuyển đổi khả năng hiển thị của các hộp màu đỏ và màu xanh một cách độc lập.Tôi tìm thấy mã Tex mà làm cho công việc này here. Tôi chưa xem xét đề xuất của 01 Aaroncủa Aaron, nhưng sẽ đến đó. Cảm ơn tất cả các góp ý của bạn!

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