11

我已经搜索了 SO、谷歌、阅读?pdf,并得出了关于将绘图保存为 pdf 的可能性,这些图层可以在 pdf 查看器边缘打开和关闭。我正在谈论的一个例子是 USGS 四方地形图,它可以下载为具有多个图层的 pdf,例如这个(压缩的 pdf)。

pdf() 帮助文件中的以下句子听起来很不祥,但我还想确认我没有误解它:

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

我曾经能够在 Illustrator 中保存分层的 pdf,但不再有这个程序可供我使用。也许有人可以从 R 中想到一种解决方法?我用来映射的数据很大,但这是一个玩具示例:

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

它看起来像这样(它是一个png,但上面会给出一个pdf) 在此处输入图像描述

我希望能够将红色和蓝色框作为具有可见性的图层,可以从 pdf 查看器中打开和关闭。

非常感谢!

编辑:在 R-help 中找到线程(回复:@mnel),它看起来是不可能的。我仍然会留下这个问题,以防有人想出了一个漂亮的 R-tastic 解决方法。

编辑(2012 年 9 月 5 日):我尝试通过 Sweave 执行此操作,并使用此处发布的解决方法取得了部分成功。此方法生成带有“图层”的单个 pdf,可以使用图像下方的超链接文本打开和关闭。它使用“动画”技巧来做到这一点。虽然它仍然不是我最终想要的结果,但它的优点是不依赖于特定的 pdf 查看器。我仍然会等着看是否有人发布了一种在 Sweave 文档中制作图层的方法,也就是 OCG,然后我可以将其自动化。

编辑(2012 年 9 月 13 日):我使用上面提到的代码发布了我的进度作为答案。我能够让它在更复杂的现实世界情况下工作,而无需更改代码,覆盖美国境内的不同行政和统计边界。在这种情况下,我只是将不同的地图叠加层命名为layer-0.pdflayer-1.pdf等,它可以正常工作。我仍然希望最终会出现更好的东西。

谢谢大家的评论

4

2 回答 2

1

我可以通过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")

在此处输入图像描述

(这只是png用于说明的版本,但是当我pdf在 Illustrator 中打开时,我可以根据需要关闭各个图层)。

在此处输入图像描述

于 2012-09-04T19:29:05.937 回答
1

看起来 ( tex)animation答案是我现在能想到的最好的答案。以下.Rnw文件将创建一个 pdf,中间有一个图形,下面有 2 个文本超链接,它们分别切换红色和蓝色框的可见性。我在这里找到了使这项工作的 Tex 代码。我还没有看过@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 anim@useocg%
          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 anim@useocg
            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 anim@useocg
              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 anim@useocg
              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}
于 2012-09-13T15:46:07.803 回答