我搜索过SO,谷歌搜索,阅读?pdf
,然后干嘛可以将图表保存为pdf图层,这些图层可以在pdf查看器边距中打开和关闭。我正在讨论的一个例子是USGS quad topo-maps,它可以作为pdf下载,有多个层,例如this(zipped 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查看器中打开和关闭。
非常感谢!
编辑:找到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
等,它的工作没有错误。我仍然希望最终会有更好的东西弹出来。
感谢大家的评论
答案 0 :(得分: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
时,我可以根据需要关闭各个图层。
答案 1 :(得分:1)
看起来(tex
)animation
答案是我现在能想到的最好的答案。以下.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 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}