Last week, I wrote an article about the hidden/undocumented LineSmoothing plot property. This week, I want to introduce another useful hidden/undocumented property – the plot axes’ LooseInset property. This follows on the wake of an email I received from a reader about this property, which had some new information for me (thanks Ben!).
Apparently, LooseInset, which is automatically set to a factory value of [0.13, 0.11, 0.095, 0.075], is used by Matlab axes to reserve a small empty margin around the axes, presumably to enable space for tick marks. These empty margins can be very annoying at times, especially when we have directly control on the axes contents.
figure; t=0:0.01:7; plot(t,2*sin(t));

Axes with default LooseInset values
(note the excessive margins)
If you set Position to [0 0 1 1], the labels are cut-off; if you set Position to something like [0.05 0.05 0.9 0.9], you can get the labels to show up, but if you now resize the image the labels may be cut off… Similarly, setting TightInset also does not work.
Theoretically, the solution should be to set OuterPosition to [0 0 1 1]. This is supposed to make the axes (including labels) take up the entire figure. However, it usually over-estimates the required margins, causing wasted space. Using OuterPosition also causes unexpected behaviors with sub-plots.
Solution: simply set LooseInset to [0 0 0 0]:
set(gca, 'LooseInset', [0,0,0,0]);

Axes with empty LooseInset values
To modify all future axes in the same way (i.e., have an empty LooseInset):
set(0,'DefaultAxesLooseInset',[0,0,0,0])
Clearing the LooseInset margins has a drawback: if the axes is zoomed or modified in such a way that the labels change, then the active axes plot region needs to shrink accordingly. For example:

Axes with empty LooseInset values, wide tick labels
(note the changed plot region size)
When determining the size of the axes, it seems that Matlab takes into account larger of the documented TightInset and the undocumented LooseInset. So, perhaps a better generic solution would be the one suggested by another blog reader:
set(gca,'LooseInset',get(gca,'TightInset'))
Note that the LooseInset property was first reported on CSSM back in 2007 (also here). The LooseInset property has remained hidden and undocumented to this day (Matlab 7.10, R2010a), although it has even featured in an official MathWorks Technical Solution to a reported problem about unexpected axes sizes last year.
p.s. – another undocumented property of Matlab axes, ContentsVisible, was described by Matt Whittaker in a comment on my original article that introduced undocumented properties.
Related posts:
- Plot LineSmoothing property LineSmoothing is a hidden and undocumented plot line property that creates anti-aliased (smooth unpixelized) lines in Matlab plots...
- Determining axes zoom state The information of whether or not an axes is zoomed or panned can easily be inferred from an internal undocumented object....
- JIDE Property Grids The JIDE components pre-bundled in Matlab enable creating user-customized property grid tables...
- Advanced JIDE Property Grids JIDE property grids can use complex cell renderer and editor components and can signal property change events asynchronously to Matlab callbacks...
- Setting axes tick labels format Matlab plot axes ticks can be customized in a way that will automatically update whenever the tick values change. ...
- Plot LimInclude properties The plot objects' XLimInclude, YLimInclude, ZLimInclude, ALimInclude and CLimInclude properties are an important feature, that has both functional and performance implications....


Nice to see that there is a simple solution for this problem and I do not have to write a Figure Resize Callback function for this purpose. However, in the case of “axis equal” the described procedure does not work since the figure position has to be set to produce a cropped window. Does anybody knows whether there is a simple method to compute cropped figure dimensions for equal axis with labels?
Is there any similar defalut property like ‘DefaultAxesLooseInset’ for subplots?
@Maurizio – there is only one DefaultAxesLooseInset property in the root (0) handle – there is no distinction between main axes and sub-plots, since sub-plots are simply a set of axes that are distributed (laid-out) nicely within the figure. So, setting the DefaultAxesLooseInset property affects all the subplot axes.