如何在LaTeX文档中插入复杂的R图表?

12

我遇到了以下代码片段的问题:

\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{myscatterplot.pdf}
\end{document}

以下是在R中生成"myscatterplot.pdf"的代码:

library(scatterplot3d)
pdf("myscatterplot.pdf")
scatterplot3d(rnorm(100), rnorm(100), 1:100, highlight.3d = TRUE)
dev.off()
问题是,用texworks编译生成的LaTeX文档(pdfLatex+makeindex+bibtex)具有图形轴线,但没有绘图的任何点或轴标签(在这种情况下,只有3D坐标轴本身)。R或LaTeX没有输出错误或警告消息。我使用的软件版本是: R 2.12.1 on Windows 7,MiKTeX 2.8,TeXworks和Adobe Reader 9(不确定是否相关...)。我已经使用\includegraphics命令成功将png版本的图像包含到文档中,并且用adobe打开"myscatterplot.pdf"可以看到想要的图像。我尝试使用tikz包作为解决方法,但由于scatterplot3d产生的信息太多,所以由于内存大小的原因无法将结果图形包含在LaTeX文档中(实际情况下我的图形将有10000+点!)。我怀疑问题是由".pdf"文件中的字体引起的,但我已经尝试使用...更改pdf字体。
pdf("changefont.pdf")
par(family = "Helvetica")
scatterplot3d(rnorm(100), rnorm(100), 1:100, highlight.3d = TRUE)
dev.off()

使用\includegraphics(changefont.pdf)时,会得到完全相同的结果。

我考虑的另一个可能的问题是,scatterplot3d输出实际上是多个图像,而\includegraphics只从pdf文件中获取第一个图形(轴)。在这种情况下,我仍然不确定如何解决。

我真的需要一个解决方法,因为最终我想用Sweave完成所有这些工作,这使我对该程序包的美丽输出感到非常沮丧!

提前感谢您的回复。

编辑1:

所以,第一个建议是使用EPS格式而不是pdf。这产生了一些结果,但不是我想要的。我运行了以下内容:

\documentclass{article}
\usepackage{graphicx,epstopdf}
\begin{document}
\begin{figure}
\includegraphics[angle = 270, width= 6in, keepaspectratio=true]{change.eps}
\end{figure}
\end{document}

我使用以下代码生成了 "change.eps" 文件:

postscript("change.eps")
scatterplot3d(rnorm(100), rnorm(100), 1:100, highlight.3d = TRUE)
dev.off()

尽管这种方法(令人惊讶的是,它在latex输出中将图形逆时针旋转了90度!)确实使结果有所改善,我现在已经在latex输出中拥有了散点图中的坐标轴和数据点!然而,即使我使用ghostview打开“change.eps”并且坐标轴已经在图形中,轴标签仍然没有出现在图形上!看来scatterplot3d输出图形的方式与\includegraphics搜索图形的方式不一致...

因此,我仍然在寻找一个解决方案,可以在图形上包含坐标轴标签。


2
我知道这不是你问题的答案,但如果我是你,我不会在向量格式中包含一个有10,000多个点的图形,因为生成的PDF文件确实会非常大。像你所做的那样,将你的图形以PNG格式保存,并使用适当的分辨率将该图像包含在文档中。 - daroczig
1
只是让您知道:您的原始示例代码在Ubuntu 10.10(R 2.12.1 Texlive 2009)上运行完美无缺。您可以尝试更新到Miktex 2.9,看看是否有所帮助。 - Matti Pastell
6个回答

5

通过你列出的命令生成的myscatterplot.pdf文件,坐标轴和标签已经存在。然而,这个pdf文件相当大(7英寸x 7英寸)。

如果您调整pdf()函数的宽度/高度参数,是否有所帮助?

pdf("myscatterplot.pdf", height=3.5, width=3.5)

3
@Rguy -- 我认为Karsten的提示可以解决你的问题。我使用的是Win7和MikTex2.9。TexWorks的pdf阅读器无法显示点。Acrobat Reader可以显示点,但默认的图表大小太大,右轴标签被切掉了。改变比例可以让它在Acrobat Reader中正确显示。我不认为它会在TexWorks的pdf阅读器中正确显示。 - Richard Herron
1
@Rguy -- 如果你长期使用 R 和 LaTeX(最终使用 Sweave),我建议你尝试一下 Emacs 和 ESS。我认为这个设置很多人都在用,而且可以在各种平台上使用(Win、Mac、Linux)。一旦你克服了困难,我相信你会非常满意的。顺便说一下,我正在使用 gVim 7.3(我很难适应 Emacs 的快捷键),配合 LaTeX 套件和 Vim R 插件以及 SumatraPDF 作为我的查看器。SumatraPDF 很轻量级,支持 synctex,这可能会很方便。 - Richard Herron
1
Karsten提出的修复方法没有起作用,但感谢他的建议。我采纳了@richardh的建议,即MikTex的pdf查看器无法正确显示pdf。我之前没有考虑到这可能是问题所在。结果发现,使用Adobe打开时一切正常!我想知道这是否是MikTex查看器中的一个错误,这是一个相当奇怪的问题,MikTex可以生成正确的图形,但无法显示它。 - Rguy

4

这是关于LaTeX超出可用内存的侧记。

我刚刚使用了您的tikzDevice示例进行一些压力测试,看起来结果非常依赖于使用的TeX引擎。特别值得注意的是luatex,它是pdftex的继承者,能够处理具有许多图形元素的绘图。

  • pdflatex

    通过了1000个点的绘图,在10000个点处超过内存并停止。

  • xelatex

    在10000个点处也超过了内存并停止。

  • lualatex

    在约45秒内处理了10000个点,并生成了1 MB的PDF文件。在约7.5分钟内处理了100,000个点(10 MB的输入文件),生成了8.5 MB的PDF文件,并达到了约750 MB的内存使用峰值。没有尝试100万基准。

看起来pdftexxetex在程序启动时分配其所有内存,这就是它们将永远获得的所有内存。另一方面,luatex似乎可以动态分配内存,因此只受可用RAM的限制。

因此,如果pdflatex给出“内存不足”错误,请尝试使用lualatex


这些测试是使用TeX Live 2010分发中包含的TeX编译器进行的。我也是tikzDevice的作者之一。


3

这里还有一个关于Sweave的不错介绍:http://www.r-bloggers.com/the-joy-of-sweave-%E2%80%93-a-beginner%E2%80%99s-guide-to-reproducible-research-with-sweave/ - Sacha Epskamp
你也可以使用tikzDevice软件包将图像存储为tex文件,然后在LaTeX文档中导入。 - Sacha Epskamp

1

我记得曾经遇到过类似的问题。不过我不确定当时是否能够在图中看到标签。回顾代码,我在 R 级别修改了两个参数:

par(xpd=NA)
par(oma=c(3, 3, 0, 0))

此外,为了避免图形旋转90度,也适用于PostScript:

postscript(file="xx.eps", horizontal=FALSE)

HTH


1

我实际上也遇到了同样的问题(TexWorks,pdfLatex,Windows 7)。我发现了一些有趣的东西:当我第一次启动Latex时,图形出现了带有坐标轴等内容,但是当我重新运行pdfLatex时,坐标轴又消失了。这给了我一个直觉,我找到了解决方法:即使latex预览不显示坐标轴,PDF格式也会显示。而且你甚至不需要告诉\includegraphics命令图形是以PDF格式存在的。

pdf("C:/Users/Orr/Documents/Leiden University/Master thesis/Chapters/Images/bioRes/Boxplots mouse raw data.pdf")
boxplot(mouse_data_raw,main="Mouse raw data")
dev.off()

\begin{figure}[t]
\includegraphics[scale=0.5]{mouse-box-raw}
\includegraphics[scale=0.5]{human-box-raw}
\end{figure}

1
如果您想将PDF图像插入到文件中,我认为您必须使用pdflatex而不是标准的latex。如果没有安装它,我建议您尝试从R中生成eps格式的图像,而不是pdf。

他说他正在使用pdflatex,问题是标签缺失。 - Alex
是的,我在使用pdflatex。我已经更新了帖子,附上了您建议的结果(有一些成功,但还不是我想要的...)。 - Rguy
抱歉,时间有点晚了,我忽略了那个相当重要的点。 - Tyler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接