如何将 matlab 图形导出为 (pdf) LaTeX?

如何将 matlab 图形导出为 (pdf) LaTeX?

我正在用 LaTeX 写一篇学生论文,需要导入在 Matlab 中创建的几个图形。我找到了一些程序来完成这项任务:

  • matfig2pgf
  • matlab2tikz
  • fig2texPS

问题是,使用前两个程序之一时,我遇到了超出 tex 容量的问题。这些图有很多数据点,这可能是 tex 放弃的原因。使用后一个程序,我无法导出子图;我必须为每个子图创建一个图像。另外,我不确定我是否能以漂亮的方式将单个图像排列在 latex 中(尚未尝试)。我还必须对每个文件分别使用 dvi/ps/pdf 进行此操作。

我的问题是:将 matlab 中的图像纳入 latex 中的好方法是什么?

我之所以问这个问题,是因为我不想因为达到任何程序的限制而必须两次甚至多次创建所有文件。

答案1

对于基于 TeX 的处理器来说,具有大量点的图形始终是一个挑战。

然而,我相信记忆和时间的限制都可以得到“合理”的解决(即减轻痛苦)。

有两种解决方案值得考虑:

  1. 增加 TeX 的内存(或绕过 pdflatex 的限制)。

  2. 减少 TeX 处理图形的次数(一次编译,经常使用)。

虽然对你的问题的评论已经指出了有关 (2.) 的一些解决方案,但你可能需要更多有关 (1.) 的意见。事实上,我认为 (1.) 是更紧迫的问题,不能轻易通过 (2.) 解决。

关于 (1.),我知道有一种解决方案非常有效:提高限额。pgf图手册包含有关如何扩大内存限制的 Windows 和 Linux 的详细说明。我认为这是您必须执行的步骤 - 并邀请您点击上面的链接并阅读手册中的第 6 章“内存和速度注意事项” pgfplots。本章包含可轻松部署的配置示例。切换到 lualatex 而不是传统工具(pdflatex 或 latex/dvips)可能也能解决内存问题(我不知道)。

关于 (2.),您可以使用standalone包(此站点包含大量示例)。这应该适用于您的任何包。但是,如果您使用matlab2tikz,我发现 TikZ 库external在这里非常有用 - 我对其进行了定制,以将每个图形转换为单独的 pdf,而无需更改原始文档。请注意使用matlab2tikzpgfplots因此上面提到的链接可能非常有用(它还包含此自动图像外部化的简要说明)。

我相信上述步骤应该会有所帮助。

但总有一些情况人们可能还想了解其他选择。

以下是其中的一些。我没有直接发布它们,因为我觉得你可能已经有了现有的工作流程,它们可能不适合 - 但也许你对我的经历感兴趣:

a) 您可以尝试直接在 TeX 中实现(选定的)图形。我这样做了,pgfplots它非常强大。我喜欢这样一个事实:我可以定义文档范围内的一致样式,而且单个文档通常比自动生成的代码更容易阅读。事实上,一旦我开始使用 pgfplots 而不是 matlab,我发现两者都更易于维护(.tex 文件而不是 .m 文件)并且更漂亮。我最终放弃了所有 matlab 脚本,最后只使用了 pgfplots。

b) 如果您的矢量图形太大,您可能需要考虑使用位图图形并使用 TeX 在位图上叠加轴描述。pgfplots附带\addplot graphics\addplot3 graphics命令以简化流程。 您还可以向 Nico Schloemer(matlab2tikz 的作者)发布功能请求 - 也许他愿意添加带有叠加轴的自动位图转换。 这种方法的详细信息可以在上述手册pgfplots(包括应用示例)中找到。 位图图形的优势在于它们在所有查看器中的渲染速度都更快 - 对于表面图,这无论如何都无关紧要。

答案2

在 MATLAB 命令行中我通常使用

print -dpsc myfigure.eps

\includegraphics然后,您可以使用包中的图形将其包含在您的 TeX 文件中graphicx(如下所示)。

我通常不会直接在 MATLAB 中使用子图,而是单独导出每张图片,然后使用包subfigure中的环境 -subcaption下面是一个完整的 MWE 示例。

截屏

\documentclass{article}
\usepackage{graphicx}   % for including graphics
\usepackage{caption}    % for captions
\usepackage{subcaption} % for sub-captions

\begin{document}

\begin{figure}
 \centering
\includegraphics[scale=0.5]{myfigure}
\end{figure}

\begin{figure}
 \centering
 \begin{subfigure}{0.49\textwidth}
    \includegraphics[width=\textwidth]{myfigure}
    \caption{Sub caption}
 \end{subfigure}
 \begin{subfigure}{0.49\textwidth}
    \includegraphics[width=\textwidth]{myfigure}
    \caption{Sub caption}
 \end{subfigure}
 \caption{Main caption}
\end{figure}

\end{document}

编辑

评论之后,请参阅为什么 pdflatex 不能打印 EPS 图形?有关如何运行图像的详细信息 -pdflatex.eps在我的 TeXlive 2011 发行版上默认运行,无需进行任何调整。

答案3

可以使用 pgfplots 包装图像以获得 LaTeX 文本的优点,但无需处理图像本身。以下是使用 Matlab 生成的 png 的 CWE,该 png 已关闭轴,然后使用 Imagemagick 进行修剪。

\documentclass[10pt]{article}
\usepackage{graphicx}
\usepackage[hang,small,bf,width=.90\textwidth]{caption}
\usepackage{textcomp}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.3}
\pgfplotsset{colormap={jet}{rgb255(0)=(0,0,143);rgb255(8)=(0,0,255);rgb255(24)=(0,255,255);rgb255(40)=(255,255,0);rgb255(56)=(255,0,0);rgb255(64)=(128,0,0)}}

\begin{document}
\thispagestyle{empty}
\begin{figure}[ht]
\centering
\begin{tikzpicture}
    \begin{axis} [
        enlargelimits=false,
        axis on top,
        xlabel=$A/\Omega$,
        ylabel=$\epsilon_0/\Omega$,
        colorbar,
    ]
        \addplot graphics [
            xmin=0,
            xmax=0.5,
            ymin=-3,
            ymax=3,
        ] {example};
    \end{axis}
\end{tikzpicture}
\caption{$\Omega=1.2$\,GHz, $A/B=1.5\%$, $\Delta=350$\,MHz, $\Gamma=0.02$\,MHz, $t=1$\,\textmu s}
\end{figure}
\end{document}

这使用了以下文件(example.png): 删除并修剪了轴的 Matlab 图形。

生成:

pgfplots 使用单独的画布来绘图。

我建议对非常繁重的图执行类似的操作。在这种情况下,这样做是有意义的,因为伪彩色图是由色块组成的,用位图表示更有效。如果你在 3D 中做某事,这也可能是一个更好的主意。

答案4

一个更简单的方法是:

  1. 访问图形“文件”菜单中的“打印预览”,
  2. 选择“风景”,
  3. 调整:(边距、宽度、高度、纸张尺寸等),
  4. 使用“PDF Creator”或其他 pdf 打印机软件打印。

相关内容