Code covered by the BSD License  

Highlights from
subfigure

4.25

4.2 | 4 ratings Rate this file 31 Downloads (last 30 days) File Size: 2.47 KB File ID: #23426
image thumbnail

subfigure

by

 

Create a figure within a grid-based layout. Like subplot, but for figures.

| Watch this File

File Information
Description

subfigure(m,n,p), or subfigure(mnp), divides the screen into an m-by-n grid of tiles and creates a figure within the pth tile. Tiles are counted along the top row of the screen, then the second row, etc.

If p is a vector, the figure is sized to cover all the subfigure positions listed in p.

subfigure(m,n) creates a figure showing a m-by-n grid layout with tiles labeled in the order that they are numbered by subfigure. This is useful for planning screen layouts, especially when one or more subfigures will span multiple tiles (when p is a vector).

h = subfigure(...) returns a handle to the figure.

Every call to subfigure creates a new figure even if a figure exists at the location specified by m, n, and p. The existing figure is not made current or reused. Existing figures that are overlapped by new subfigures are not deleted. This behavior is dissimilar to subplot.

Example 1: Four non-overlapping figures.

    subfigure(2,2,1)
    subfigure(2,2,2)
    subfigure(2,2,3)
    subfigure(2,2,4)

Example 2: Three non-overlapping figures of various sizes.

    subfigure(4,4,[1 13])
    subfigure(4,4,[2 4])
    subfigure(4,4,[6 16])

Example 3: Show the grid for a 3 x 5 layout.

    subfigure(3,5)

Acknowledgements

Subfigure inspired this file.

This file inspired The Krouchev Journal Figure Advanced Matlab Toolkit.

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 (4)
27 Jan 2012 Reza Farrahi Moghaddam

Very good function!

Here is a small modification to enable the user to choose the screen in case he has multiple screens (like dual screens). The fourth parameter, screen_number, is the number of the screen to be used. If it is 0, both screens will be used. The default value of 1 (the main screen).

-----------------------------------
function varargout = subfigure(varargin)
% Create a figure within a grid-based layout. It's subplot for figures.
%
% subfigure(m,n,p), or subfigure(mnp), divides the screen into an m-by-n grid of
% tiles and creates a figure within the pth tile. Tiles are counted along the
% top row of the screen, then the second row, etc.
%
% If p is a vector, the figure is sized to cover all the subfigure positions
% listed in p.
%
% subfigure(m,n) creates a figure showing a m-by-n grid layout with tiles
% labeled in the order that they are numbered by subfigure. This is useful for
% planning screen layouts, especially when one or more subfigures will span
% multiple tiles (when p is a vector).
%
% h = subfigure(...) returns a handle to the figure.
%
% Every call to subfigure creates a new figure even if a figure exists at the
% location specified by m, n, and p. The existing figure is not made current or
% reused. Existing figures that are overlapped by new subfigures are not
% deleted. This behavior is dissimilar to subplot.
%
% Example 1: Four non-overlapping figures.
%
% subfigure(2,2,1)
% subfigure(2,2,2)
% subfigure(2,2,3)
% subfigure(2,2,4)
%
% Example 2: Three non-overlapping figures of various sizes.
%
% subfigure(4,4,[1 13])
% subfigure(4,4,[2 4])
% subfigure(4,4,[6 16])
%
% Example 3: Show the grid for a 3 x 5 layout.
%
% subfigure(3,5)

% by Steve Hoelzer
% 2009-03-25
% Screen_number added by Reza Farrahi Moghaddam
% 2012-01-27

% Padding to allow room for figure borders and menus
hpad = 20;
vpad = 90;

% Process input arguments
switch nargin
case 0
error('Not enough input arguments.')
case 1
m = floor(varargin{1}/100);
n = rem(floor(varargin{1}/10),10);
p = rem(varargin{1},10);
screen_number = 1;
case 2
m = varargin{1};
n = varargin{2};
p = [];
screen_number = 1;
case 3
m = varargin{1};
n = varargin{2};
p = varargin{3};
screen_number = 1;
case 4
m = varargin{1};
n = varargin{2};
p = varargin{3};
screen_number = varargin{4};
otherwise
error('Too many input arguments.')
end

% Error checking
if ~isscalar(m) || ~isscalar(n)
error('Gird dimensions must be scalar values.')
end
if m < 0 || n < 0
error('Grid dimensions must be greator than zero.')
end
if any(p > m*n)
error('Position value exceeds grid size.')
end

if isempty(p)
% Draw example grid using subplots
p = m*n;
f = figure('NumberTitle','Off',...
'Name',sprintf('Subfigure tile numbering for a %i by %i grid',m,n));
for i = 1:p
h = subplot(m,n,i);
set(h,'Box','On',...
'XTick',[],...
'YTick',[],...
'XTickLabel',[],...
'YTickLabel',[])
text(0.5,0.5,int2str(i),...
'FontSize',16,...
'HorizontalAlignment','Center')
end
% Return handle if needed
if nargout
varargout{1} = f;
end
return
end

% Calculate tile size and spacing
scrsz = get(0, 'monitorpositions'); % 'ScreenSize');
switch screen_number
case 0
scrsz = [scrsz(1, 1:2), scrsz(end, 3:4)];
case 1
scrsz = scrsz(1, :);
case 2
scrsz = scrsz(2, :);
otherwise
scrsz = scrsz(1, :);
end
hstep = floor( (scrsz(3) - scrsz(1) + 1 - hpad) / n );
vstep = floor( (scrsz(4) - scrsz(2) + 1 - vpad) / m );
vsz = vstep - vpad;
hsz = hstep - hpad;

% Row and column positions of each subfigure in p
r = ceil(p/n);
c = rem(p,n);
c(c==0) = n; % Special case

% Position of each subfigure in p in pixels (left, right, bottom, top)
le = scrsz(1) - 1 + hpad + (c-1)*hstep;
ri = le + hsz;
bo = scrsz(2) - 1 + vpad + (m-r)*vstep;
to = bo + vsz;

% Position of a subfigure that covers all subfigures in p
le = min(le); % Leftmost left
ri = max(ri); % Rightmost right
bo = min(bo); % Lowest bottom
to = max(to); % Highest top

% Calculate figure position
pos = [le, bo, ri-le, to-bo]; % [left, bottom, width, height]

% Display figure
h = figure('Position',pos);

% Return handle if needed
if nargout
varargout{1} = h;
end
-------------------------------

30 Jul 2010 Ian Boardman

This does not create an array of figures, but merely an array of axes. Just run get(get(subfigure(m,n),'Children'),'Type')
What I was hoping was to get a set of figure handles. Is that not possible in Matlab? Is there an easy way to position and scale all the children of a given figure to a new figure, with all their relative positions preserved?

01 Jan 2010 Petr Kotas

Thank you for your great piece of code. I was actually going to write one myself, but fortunately I found yours. It works perfectly.

07 Apr 2009 Alan Brooks

Very useful tool for grouping plots. I've used it often.

Contact us