如何将R绘图插入LaTeX文档?

71

我对R和LaTeX都是新手,在最近学会了如何使用R绘制标准时间序列图并将其保存为PNG图像。 我担心的是,将其保存为图像,然后将其嵌入到LaTeX中会缩放它并使其看起来很丑陋。

有没有办法使R的plot()函数输出矢量图形,并将其嵌入到LaTeX中? 我在这两个方面都是一个完全的新手,请温柔一点 :) 非常感谢提供代码片段!

4个回答

64

建议使用tikzDevice包在LaTeX文档中生成输出:

http://cran.r-project.org/web/packages/tikzDevice/index.html

tikzDevice将在R中生成的图形转换为可以被LaTeX包tikz解释的代码。TikZ为LaTeX提供了一个非常好的矢量绘图系统。一些良好的TikZ输出示例位于:

http://www.texample.net/

tikzDevice可以像其他R图形设备一样使用:

require( tikzDevice )

tikz( 'myPlot.tex' )

plot( 1, 1, main = '\\LaTex\\ is $\\int e^{xy}$' )

dev.off()

请注意,在LaTeX宏中反斜杠必须加倍,因为R会将单个反斜杠视为转义字符。要在LaTeX文档中使用图表,只需包含它:

\include{path/to/myPlot.tex}

pgfSweave包含可处理上述步骤的Sweave功能。请确保您的文档中在LaTeX导言部分的某处包含\usepackage{tikz}

http://cran.r-project.org/

tikz()函数相比于pdf()的优点有:

  • 图形标签和标题的字体始终与LaTeX文档中使用的字体相匹配。这为您的文档提供了统一的外观。

  • 您可以使用任意的LaTeX代码来创建数学注释,并使用LaTeX排版器的所有功能在您的图形文本中使用它。

tikz()函数的缺点是:

  • 它不适合处理具有许多组件的图,例如大矩阵的persp()图。大量的图形元素可能会导致LaTeX变得非常缓慢或耗尽内存。

  • 该软件包目前被标记为beta版。这意味着如果作者找到充分的理由更改界面或软件包功能,则接口或功能可能会发生变化。

我应该在这篇文章中声明,我是tikzDevicepgfSweave软件包的作者,因此我的意见可能存在偏见。然而,我在过去一年中使用了这两个软件包来制作多篇学术报告,并对结果非常满意。


3
非常好的帖子和非常酷的项目!我将保持 PDF 答案为“已接受”,因为对新手更容易,但我会尝试使用你的解决方案。除了“include”之外, LaTeX 方面是否需要指定其他内容?我得到了这个错误:“环境 tikzpicture 未定义”。 - agentofuser
2
似乎 tikzDevice 已经从官方 CRAN 库中删除。我按照这个指南安装了它。 (http://lightonphiri.org/blog/r-graphical-representation-installing-tikzdevice-package) - saffsd
我最初遇到了很多麻烦和困惑,因为tikzDevice出现了错误。解决方案:在R中生成图形时,你需要安装tikz TeX包,而不仅仅是最终的LaTex处理过程。 - cbix
提示:如果您想将tikzpicture放入figure环境中的\resizebox中,请使用\input{path/to/myPlot},因为\include{}会在前后执行\clearpage - Richard
这个例子无法工作,因为\LaTex是未定义的cs(对于外行人来说应该是\LaTeX)。虽然我无法修复它,因为这只是一个微小的编辑。 - Arch Stanton
显示剩余8条评论

61

Shane说得好,你确实需要Sweave。但是对于新手来说,你可能更适合分离任务。因此,请按照以下步骤操作:

  1. 打开设备:pdf("figures/myfile.pdf", height=6, width=6)
  2. 绘制你的R对象:plot(1:10, type='l', main='boring')-- 请记住,lattice和ggplot需要在plot周围显式使用print
  3. 重要提示:关闭设备:dev.off()以完成文件。
  4. 可选项:检查pdf文件。
  5. 在LaTeX中,在文档头中使用usepackage{graphicx} ,使用
    \includegraphics[width=0.98\textwidth]{figures/myfile}将之前创建的图形包含进来,注意文件扩展名是可选的。
  6. 运行经pdflatex处理后的文档,享受您的成果吧。

7
我需要提醒一下,像Dirk所做的那样将任务分开处理在处理非常大的文档时会有好处:每次都需要从头开始重建整个文档可能很痛苦,更不用说调试一个大的Sweave文档的煎熬了。 - Shane
1
有一些缓存技巧和包可以解决这个问题。但是,确实需要承认的是,Sweave 的强大功能在复杂性和不透明性方面付出了一定的代价。委婉地说 :) - Dirk Eddelbuettel
1
谢谢!您可以更新您的答案,加入一些我遇到的问题,这样其他像我这样的新手就会更容易理解:您必须将\usepackage{graphicx}放在文档头中才能运行(在这里找到:http://tuxmann.blogspot.com/2006/06/latex-snippets-add-image-wrap-long.html);并且`with=0.98`缺少一个“d”。 - agentofuser
是否有Hmisc包中latex()函数的替代品,用于绘图?也就是说,有没有类似的函数可以自动准备好\includegraphics和"capture"等环境,以避免手动编写这些代码。 - Anton Tarasenko
混合PDF对我没有用,因为我需要后期处理(PDF给了我一个边界框错误)。 这可能也是其他人的问题。 解决方案很简单 - 让R创建.ps而不是.pdf:postscript(file=myfile.ps,horizontal=FALSE) - Willem
@DirkEddelbuettel - 你提到这是新手的方法... 有趣的是,专业人士会有什么不同的做法? - n1k31t4

23

你也许会考虑使用Sweave。在Sweave网站(以及其他地方)有很多出色的文档可用。它具有非常简单的语法:只需将你的 R 代码放在<<>>=@之间。

下面是一个简单的示例,最终效果看起来像是这样

\documentclass[a4paper]{article}

\title{Sweave Example 1}
\author{Friedrich Leisch}

\begin{document}

\maketitle

In this example we embed parts of the examples from the
\texttt{kruskal.test} help page into a \LaTeX{} document:

<<>>=
data(airquality)
library(ctest)
kruskal.test(Ozone ~ Month, data = airquality)
@
which shows that the location parameter of the Ozone 
distribution varies significantly from month to month. Finally we
include a boxplot of the data:

\begin{center}
<<fig=TRUE,echo=FALSE>>=
boxplot(Ozone ~ Month, data = airquality)
@
\end{center}

\end{document}

要生成文档,您只需调用R CMD Sweave file.Rnw或在R内运行Sweave(file)即可。


2
我也推荐使用Sweave。我只想补充一点,RStudio与Sweave的集成非常好,这对于初学者来说可能特别重要(安装LaTeX发行版并在RStudio中点击一个按钮即可)。 - Chris Beeley
@ChrisBeeley,你能否提供一些关于RStudio和LaTeX集成的链接解释吗?谢谢。 - Wakan Tanka
http://rstudio-pubs-static.s3.amazonaws.com/639_b3a59601ba94400aabbe29025de83c10.html - Chris Beeley
我没有绘制出像这里的图,为什么?相关问题请参见 此处,其中 MWE 有误。 - hhh

3

3
这个问题与那个问题相反:这里的提问者正在询问如何将R绘图添加到LaTeX文档中。而那个问题是关于如何将LaTeX公式添加到R绘图中的。 - Shane
1
标题是有意的转述 :) - agentofuser
足够正确,但答案不是一样的吗 ;) - Mica
并不完全是这样,这取决于您试图创建的最终产品。LaTex转换为R可以制作带有LaTex元素的图形,而R转换为LaTex则可以创建包括R图形在内的LaTex文档。 - Francis Smart

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