View License

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from

4.8 | 31 ratings Rate this file 265 Downloads (last 30 days) File Size: 2.41 KB File ID: #34055 Version: 1.5
image thumbnail




02 Dec 2011 (Updated )

Remove excess margins from figures.

Editor's Notes:

This file was selected as MATLAB Central Pick of the Week

| Watch this File

File Information

Alters a figure so that it has the minimum size necessary to
enclose all axes in the figure without excess space around them.

Works for figures containing multiple axes as subplots.

Note that tightfig will expand the figure to completely encompass all
axes if necessary.

Returns an error if the figure contains any 3D axes which have been zoomed.


Get Rid Of The White Margin In Saveas Output inspired this file.

This file inspired Backer Upper Truck Simulator With Fuzzy Control, Subtightplot, Spreadfigures, and Export Png Inkscape(Filename,Dpi,Handle).

Required Products MATLAB
MATLAB release MATLAB 7.6 (R2008a)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (48)
10 Feb 2017 Alexander Bratch

28 Jan 2017 Falk Lieder

07 Jan 2017 Jay St. Pierre

Great tool.

Any idea why it has trouble with figures that contain annotation text boxes? My workaround is to run 'tightfig' before I invoke the 'annotation' command.

Comment only
25 Nov 2016 Isaac Li

Awesome function for all cartesian plots.
However, it doesn't work with polarplot function. when polarplot is presented they get squeezed as if they don't exist.

13 Oct 2016 Ray Lee

It would be nice to also reduce the margins among subplots.

23 Jul 2016 Bela Bacsi

Update posted by Jacob D is unfortunately insufficient for colorbars with labels and tick labels, as resizing doesn't consider their size and can crop them.

Colorbars don't have an OuterPosition property (Matlab 2016a). Their Label is a Text object, so its Extent property can be used to calculate its Position, so that can be adjusted for. However, I don't know any way to get the tick labels' extent (and that of the multiplier, shown above them, such as x10^-4), so those might end up being cropped. Any ideas how to get to them?

07 Jul 2016 Casey Ta

28 Jun 2016 K E

K E (view profile)

In R2015b, I had to change Jacob D's edit as follows:

ti = [get(hax_ti,'TightInset'); ...
zeros(size(pos)-[sum([hax_ti_ind{:}]) 0])];

But otherwise it works now with legends so thanks!

Comment only
15 Jun 2016 Roman Gabl

30 May 2016 Jacob D

In the code I posted previously, the following line can be commented or left out:
% hax = sort(hax,'descend');

Axes should already be first after the concatenation.

Comment only
30 May 2016 Jacob D

To fix the issue where tightfig doesn't adjust for legends and colorbars in HG2 just use the following three sections of code in replacement of the current tightfig code:

%% Section 1 replacement
% get all the axes handles note this will also fetch legends and
% colorbars as well
hax = findall(hfig, 'type', 'axes');
% Concatenate HG2 objects into hax as graphics array and sort
hax = [hax; findall(hfig, 'type', 'legend')];
hax = [hax; findall(hfig, 'type', 'colorbar')];
hax = sort(hax,'descend'); % Make sure Axes are first in the list

%% Section 2 replacement
% get various position parameters of the axes
hax_ti_ind = arrayfun(@(x) (isa(x,'')),...
hax_ti=hax([hax_ti_ind{:}]); % Returns only Axes handles
if numel(hax) > 1
% fsize = cell2mat(get(hax, 'FontSize'));
pos = cell2mat(get(hax, 'Position'));
ti = [cell2mat(get(hax_ti,'TightInset')); ...
zeros(size(pos)-[sum([hax_ti_ind{:}]) 0])];
% fsize = get(hax, 'FontSize');
pos = get(hax, 'Position');
ti = get(hax_ti,'TightInset');

%% Section 3 replacement
for i = 1:numel(hax_ti)
set(hax(i), 'LooseInset', ti(i,:));

Comment only
19 May 2016 Neetha Das

26 Mar 2016 Luchen Li

01 Mar 2016 Bhavesh Dharmani

Doesn't work for 'boxplot'.

17 Feb 2016 Jørgen Grythe

I was looking for the easiest way to remove extra margins on my figure, can't really get any easier than writing tightfig(fig)

04 Nov 2015 Shaun

Shaun (view profile)

Unfortunately it cuts out colorbars when using 2015b. I'm guessing this is due to the new plotting system, where colorbars are no longer axes objects, but I don't have the expertise to fix it.

Comment only
09 Oct 2015 Haixuan

16 Sep 2015 Vivas

Vivas (view profile)

16 Sep 2015 Vivas

Vivas (view profile)

Doesn't work very well for bode plots. Axis label overlaps with ticks on x axis

02 Jul 2015 Sophia Bethany Coban

@ADITHYAN, for imshow, you can use iptsetpref('ImshowBorder','tight');


Comment only
20 May 2015 ADITHYAN

Useful function!
When I use this function with imshow, there is still a white space on the left of the image.
It would be nice if you can fix this. Thanks.

14 May 2015 Paul Quelet

Works wonderfully.

23 Apr 2015 compterbs

Thank you, no problem now for trimming Latex figs

Comment only
22 Apr 2015 Angelo Tafuni

Now I don't have to worry about trimming in LaTeX. Great job!

08 Mar 2015 reza vahid

I solved PDE with numerical method and I have 3 component (U,x,y) that (x,y)=[-1,1]*[-1,1]
and U is answer PDE< How can I use this function ?
Please any tip or example send to me through email:

18 Dec 2014 Shuqin

Shuqin (view profile)

very helpful! Thanks for sharing.

04 Dec 2014 pietro

pietro (view profile)

It works fine but not when the figures are docked because it modifies the figure properties and not the axis ones. Anyway it is a great function. Hopefully it will work also when the figure are docked.

05 Nov 2014 Thomas Edwards

I had a colorbar addded to my figure of multiple subplots. The annoying thing was that the exponent of the colorbar was cut-off on the edge of the figure. Using tightfig fixed this for me so that the exponent would fit in the figure. Very useful!

01 Oct 2014 João

João (view profile)

Great. Although it sometimes clips the edges off fonts that are really close to the limits (I was not able to understand in which conditions it does this, but it happened unfrequently)

25 Sep 2014 Daniel

Daniel (view profile)

04 Sep 2014 arnold

arnold (view profile)

it doesn't take into account an xlabel of a boxplot. Just cuts it away. Ylabel seems fine though.

Comment only
28 Aug 2014 Chad Greene

Chad Greene (view profile)

I use this frequently; thanks for sharing. I recommend adding this to the end of the function to suppress unwanted outputs:

if nargout==0; clear hfig; end

Comment only
19 Aug 2014 arnold

arnold (view profile)

I'll see when I find the time to look into it.
Something else I just noticed: Using plotyy and setting both y-labels, title, xlabel etc and tightfig. to wrap things up. Tightfig seems to fast somehow. It messes up the figure window. It works if I include a pause(0.2) before tightfig. Strange..... but the workaround is no problem of course.

Comment only
15 Aug 2014 Richard Crozier

@arnold, I'll implement this if you suggest how to identify them. Unfortunately I don't have time to do a lot of research on this right now.

Comment only
11 Aug 2014 arnold

arnold (view profile)

too bad it doesn't recognize my x-labels when using hierarchicalboxplot. It would be most useful if it were looking for all elements in a figure, not just axes.

09 Jul 2014 Pablo Deossa

very useful!

08 Jul 2014 Suntaree


27 Mar 2014 Gergely Takács

24 Jan 2014 grega

grega (view profile)

02 Oct 2013 Mike Shen

07 Jan 2013 K E

K E (view profile)

Perfect. Very useful if you are using the Windows clipboard to copy figures into Word and need to trim off the excess whitespace beforehand.

22 Dec 2012 Richard Crozier

Hi Jurgan, from the description for crop.m I gather it crops whitespace from a bitmap (i.e. non vector type) image file which is already saved to disk, e.g. a jpeg, bitmap, png etc. It does not appear to act on figures.

I suppose you could get similar functionality to tightfig by first saving your figure to disk in one of these formats, then running crop.m on it. I prefer the tightfig workflow personally.

Comment only
20 Dec 2012 Jurgen

Jurgen (view profile)

I see, I have export_fig. Based on what you said then maybe CROP ( is worth comparing :)

Comment only
19 Dec 2012 Richard Crozier

Jurgen, most of the functions you mention adjust the space between and around individual axes in subplots, and at least some have to be called on creation of a subplot. tightfig crops the white space around the outside of all the axes (and legends) in any figure without adjusting the rest of the plots at all. tightfig also identifies if you have a 3D zoomed axes in your figure and ignores it, since such figures cannot be cropped. tightfig is also well commented so you can understand it's workings.

Actually you failed to identify the one other function on the file exchange I know which does also have this functionality, export_fig.m.

Comment only
18 Dec 2012 Jurgen

Jurgen (view profile)

How does this compare to: spaceplots, subplot1, tight_subplot, subplot_tight and subplotplus?

Comment only
26 Nov 2012 Ben

Ben (view profile)

Hi, I found this very useful. However, I have one suggestion: in the line
ti(ti < 0) = 0.1

You should consider
ti(ti < 0.1) = 0.1

I had a graph where the top line of the outer box was being cutoff by saveas after I used tightfig, presumably because it had some ti in (0,0.1).

Comment only
19 Jan 2012 Richard Crozier

Thanks Thomas, I've submitted a new version with the fix.

Comment only
16 Jan 2012 Thomas

Thomas (view profile)

Great work... i was just going to implement it myself... but here it is ;) Thank you.

Just a minor issue:
Restoring the original axes units fails when there is only a single axes object in the figure:

set(hax(i), 'Units', origaxunits{i});

... since origaxunits is no cell array then. A simple if else does the trick.

19 Jan 2012 1.3

Corrected bug noted by commenter Thomas, also tidied up some other parts of code and comments.

17 Dec 2012 1.5

Added suggested improvement for minimum bound by Ben

Contact us