MATLAB figures

From Fluids Wiki
Revision as of 17:14, 14 October 2011 by Mdunphy (talk | contribs)
Jump to navigation Jump to search

This page describes the best practices for making figures in MATLAB for inclusion in a LATEX document

Setting figure size

Most of the time you will want to choose vector graphics, that is, use MATLAB's "painters" renderer. Code to select this is:

set(gcf,'renderer','painters');

Now you need to decide what the size of the figure should be. For a standard LaTeX report, we might want the plot to span the width of the page (ex: 6 inches wide) and half as tall (3 inches). To set 6x3 inch we use

set(gcf, 'PaperUnits', 'inches', 'PaperSize', [6 3],'PaperPosition',[0 0 6 3]);

Here is where you plot something.

plot(0:0.1:3, exp(-[0:0.1:3]));

Now you print to a PDF file.

print('-dpdf','filename.pdf');

Here are the above commands in one easy to copy-paste block,

set(gcf,'renderer','painters');
set(gcf, 'PaperUnits', 'inches', 'PaperSize', [6 3],'PaperPosition',[0 0 6 3]);
plot(0:0.1:3, exp(-[0:0.1:3]));
print('-dpdf','filename.pdf');

Inclusion in LaTeX

Use the following code to include the PDF figure in your LaTeX document.

\begin{figure}
  \centering
  \includegraphics{filename.pdf}
  \caption{Description goes here.}
  \label{label:here}
\end{figure}


Pcolor vs. contourf

Pcolor is often not the best way to produce a heatmap if you plan to use vector graphics. The reason is that each data point becomes two triangular elements in the PDF file, and when you have a large number of elements it produces a large file which can be very slow to display/print. For most purposes, contourf is a superior replacement for pcolor. The code below demonstrates pcolor in figure 1 and contourf in figure 2.

x=linspace(0,100,1000); [X,Y]=meshgrid(x,x); data=X.*Y;
figure(1); pcolor(X,Y,data); shading flat
figure(2); [ch,ch]=contourf(X,Y,data,100); set(ch,'edgecolor','none');

Subplot magic

MATLAB's subplot command is useful but it's not always the best at making multi-panel figures. Here is a script that creates four subplots, sets their size and location, and adds a single colourbar along the bottom.

clear; clf;

% create four subplots, store handles in A, B, C and D and colorbar in E
A=subplot(2,2,1); imagesc(magic(6)); caxis([0 75]); xlabel('x (m)'); ylabel('y (m)');
B=subplot(2,2,2); imagesc(magic(7)); caxis([0 75]); xlabel('x (m)'); ylabel('y (m)');
C=subplot(2,2,3); imagesc(magic(8)); caxis([0 75]); xlabel('x (m)'); ylabel('y (m)');
D=subplot(2,2,4); imagesc(magic(9)); caxis([0 75]); xlabel('x (m)'); ylabel('y (m)');
E=colorbar('Location','Southoutside');

% Specify some parameters for the plot
x0   = 0.5;  % spacing between and around figures (inches)
y0   = 1;    % offset from the bottom (inches)
w    = 2.25; % size of each subfigure (w x w inches)
y0cb = 0.25; % offset of colourbar from botom (inches)

% Now specify each figure's location and dimensions
% as [x  y  width  height]:
% 'x' and 'y' are position of the lower-left corner of each panel
% 'length' and 'height' are the dimensions of each panel
set(A,'Units','inches','Position',[x0     y0+w+x0  w w]);
set(B,'Units','inches','Position',[w+2*x0 y0+w+x0  w w]);
set(C,'Units','inches','Position',[x0     y0       w w]);
set(D,'Units','inches','Position',[w+2*x0 y0       w w]);

set(E,'Units','inches','Position',[x0+0.25*w   y0cb   1.5*w+x0   0.25]);

% total width, height
W=3*x0 + 2*w;      % three spacing and two panels wide
H=2*w + 2*x0 + y0; % two spacing, two panels and one y0 in height
fprintf('Figure is %.2fin wide, %.2fin tall\n',W,H);
set(gcf, 'PaperUnits', 'inches', 'PaperSize', [W H],'PaperPosition',[0 0 W H]);
set(gcf, 'Renderer', 'Painters');

print -dpdf output.pdf


This example produces a figure that is 6 inches wide and 6.5 inches tall. It will fit into a standard LaTeX document without any scaling. The text size on the figure will be the same in your LaTeX.