Pretty plots: Automatically create TikZ source code for plots in LaTeX with Matlab

sin(x) -- blue, cos(x) -- orange, dashed

Example TikZ plot from Matlab code

LaTeX …
I have just finished the first chapter draft for my thesis. As you’d expect from a mathematician, I write my thesis in LaTeX (or $latex LaTeX$). In the evenings, when I couldn’t concentrate enough for creating text that would make sense to anyone, I instead played around with the plots I wanted to include.

… and Matlab don’t work too well together
I used to create all my plots in Matlab (MathWorks), save them as eps (for latex) and png (for pdflatex) and include those in the LaTeX file via includegraphics. This causes a few annoyances. The size of the included pictures is decided in LaTeX, but rescaling has an effect on everything, including the text in the labels and legend. This meant that for every type of plot (and every decision to use a different scaling) I need to fiddle with the font size in the Matlab figures, until it fits and create all those files again. In addition, although Matlab understands some LaTeX, there were some symbols it has problems with. Finally, the font in the labels is never the same as in the text.

Enter TikZ
I recently heard about this on TeX StackExchange. It’s a way to code your pictures like you code everything else in LaTeX. Unlike pstricks, which I had used in the past and can hardly remember, it works natively with pdflatex. In this way, you hand over the responsibility for any text in your plot to LaTeX. Great! To get started with TikZ, there are an extensive manual, a minimal introduction, loads of answered questions on TeX StackExchange and more.

To plot a function in TikZ, you interpolate it linearly through many points. That’s a lot of source code per function. There will be loads of plots in my thesis, each showing several functions. Oh, and want axes, too. Naturally, this calls for automation. I wrote two functions in Matlab that would automatically create the tikz code for the axes and a function plot. The plot at the beginning of this post was created with the following code (and cut to size).

Matlab code
x=(0:0.1:7); sinx=sin(x); cosx=cos(x);
tikzaxes(fid,[0 1 7],[-1 0.5 1],'$x$','$y$','2em');
tikzfunctionplot(fid,x,sinx,'blue,ultra thick','sin(x)');
tikzfunctionplot(fid,x,cosx,'orange,dashed,ultra thick','cos(x)');

LaTeX source
begin{tikzpicture}[yscale=1.5] input{tikzcodefrommatlab}

Related Links

How do you make sure that your plots and figures fit with the rest of your document? And does anyone have a good idea what to do with 3D plots?

Let me know in the comments below.

Update: I’ve added further links to packages that were pointed out to me: matlab2tikz and PGFplots. I haven’t properly tried them out yet, but especially pgfplots seems awesome.