将 Matlab 图形嵌入 LaTeX 文档

背景介绍

优雅漂亮的图形是唯美文档的重要组成部分,在 LaTeX 排版中需要使用图形时,通常采用其他绘图工具绘制好图形,再通过graphics等宏包插入到文档中。此外,还可以使用tikz, pgf等绘图引擎,将图形代码直接写入文档,编译生成图形。tikz 与 pgf 都能绘制高质量的矢量图,但语法都较为复杂,学习较为困难。在科学研究中 matlab 可能是科研人员使用更为熟悉的工具。今天翻译的这篇博文Beautiful MATLAB figures in LaTeX就是为大家提供一种将 matlab 的绘图代码转换为 tikz 代码的方法。

开篇

在论文写作中,通常会有“一图胜千言”的体会,图形可能是论文中最为重要的一部分。在本博客中,有许多关于 LaTeX 文档中图形插入的博文, 特别是此篇名为Beautiful MATLAB figures in LaTeX的博文。本人通常使用 Matlab 在数值计算的环境下工作,Matlab 绘制的图形相当漂亮(当然,这是与Excel相比^_^)。但让我难以忍受的是,在文档中图形中的字体与文档中的字体不一致。最近我发现了一个叫:matlab2tikz的Matlab脚本,能够将Matlab生成的图形转换为 Tikz脚本。
PS: 当然,如果你不使用 Matlab工作的话,本文对你可能就没有吸引力了。

Tikz

TikZ 是用于图形编程的TeX宏包,关于该宏包的更多信息与使用示例你可以在这里找到。首先我不会用 TikZ 的专业术语来吓你,因为我过去一直懒的去了解 TikZ 是怎么工作的,即使现在也一样。

Matlab

好吧,让我们通过实例来了解吧!通过下面的代码我们可以绘制标准的 Matlab 图形,然后再将其导出为 TikZ代码。打开 Matlab 脚本编辑器,通过以下代码来绘制一个球体。

1
2
3
4
sphere(30);
title('a sphere: x^2+y^2+z^2');
xlabel('x'); ylabel('y'); zlabel('z');
axis equal

运行以上 Matlab脚本,生成并保存图形到自定义的文件夹里。生成图像如下:
Sphere
现在,下载 matlab2tikz脚本。解压后可知,脚本里面包含了一些m 文件将这些 m 文件都保存到生成图片的文件夹中。运行以下命令:

1
matlab2tikz('mysphere.tikz', 'height', '\figureheight', 'width', '\figurewidth');

可以看到现在文件夹里多了一共名为mysphere.tikz的文件,将该文件复制到下面测试用 tex文件的文件夹下。

LaTeX

到现在为止,已经通过 matlab2tikz 脚本生成了 tikz 文件了,下面可以在 TeX中使用了,新建 Tex文档,注意需要使用 pgfplots 宏包代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{figure}
\centering
\newlength\figureheight
\newlength\figurewidth
\setlength\figureheight{6cm}
\setlength\figurewidth{6cm}
\input{mysphere.tikz}
\caption{A plot of a sphere}
\label{fig:sphere}
\end{figure}
\end{document}

文档中插入代码比较简单,代码的基本意思是在文档中插入 mysphere 图形,设置长宽都为 6cm.
生成的文档截图如下:

DocSphere

PS: 在代码中我们自定义了两个长度,如果你多次插入 tikz图形时,只能定义一次,重复定义会导致错误,当然你可以定义新的名字,不重名即可。

编辑图形

如果你对生成的结果不是太满意,还可以通过编辑 tikz 代码来对进行微调。当然,前提是你要懂 TikZ。例如:打开 tikz 文件,可以看到下面的一行代码:

1
view={-37.5}{30},

相同的代码在matlab中是:

1
view={0}{90},

该代码是指设置视角为X,Y 平面。非常简单。 有时你可能觉得生成图形的名字不太贴切,你可以在 tikz中找到下面一行代码进行修改:
OK,到这里,我们就完成了 Matlab图形到 LaTeX文档的插入了。

更多信息

更多的关于 matlab2tikz的信息可以在作者的网站github,以及 matlab2tikz 论坛上找到。

译后记

这是本人第一次翻译技术文章,在第一眼看到这个题目时觉得这个技术应该挺实用,但在翻译实验过程中发现这个脚本问题还挺多,生成的tikz代码混乱冗余,文档中的图形出来也不漂亮。但是毕竟是从 Matlab 代码像 tikz代码转换的尝试,不是那么容易尽善尽美,但是值得赞赏。当然,如果不是动手能力极差,还是推荐去学一学 TikZ, 或者就忍受忍受字体不一致的现象,当然,也许还可以在 matlab代码中设置图形中的字体。
本文翻译字博客Beautiful MATLAB figures in LaTeX, 转载请注明原文与译文链接。

捐赠

分享是一种美德,如果读完我的文章能提升您的思维品质,提高您的生活质量,不妨对我进行小额捐赠。您的鼓励是我最大的动力。让我写出更多的好文章分享给大家。
Donate