11

私はSOを検索し、Googleで検索し、読ん?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 ヘルプ(re: @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イラスト用のバージョンですが、Illustrator で開くと、pdf必要に応じて個々のレイヤーをオフにできます)。

ここに画像の説明を入力

于 2012-09-04T19:29:05.937 に答える
1

( tex)animationの答えは、私が今思いつくことができる最高のもののようです。次の.Rnwファイルは、中央に図があり、その下に 2 つのテキスト ハイパーリンクがあり、赤と青のボックスの表示を個別に切り替える PDF を作成します。ここでこれを機能させる 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 に答える