-
Notifications
You must be signed in to change notification settings - Fork 0
/
subaxis.m
106 lines (88 loc) · 3.75 KB
/
subaxis.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
function h=subaxis(varargin)
%SUBAXIS Create axes in tiled positions. (just like subplot)
% Usage:
% h=subaxis(rows,cols,cellno[,settings])
% h=subaxis(rows,cols,cellx,celly[,settings])
% h=subaxis(rows,cols,cellx,celly,spanx,spany[,settings])
%
% SETTINGS: Spacing,SpacingHoriz,SpacingVert
% Padding,PaddingRight,PaddingLeft,PaddingTop,PaddingBottom
% Margin,MarginRight,MarginLeft,MarginTop,MarginBottom
% Holdaxis
%
% all units are relative (i.e. from 0 to 1)
%
% Abbreviations of parameters can be used.. (Eg MR instead of MarginRight)
% (holdaxis means that it wont delete any axes below.)
%
%
% Example:
%
% >> subaxis(2,1,1,'SpacingVert',0,'MR',0);
% >> imagesc(magic(3))
% >> subaxis(2,'p',.02);
% >> imagesc(magic(4))
%
% 2001-2014 / Aslak Grinsted (Feel free to modify this code.)
f=gcf;
UserDataArgsOK=0;
Args=get(f,'UserData');
if isstruct(Args)
UserDataArgsOK=isfield(Args,'SpacingHorizontal')&isfield(Args,'Holdaxis')&isfield(Args,'rows')&isfield(Args,'cols');
end
OKToStoreArgs=isempty(Args)|UserDataArgsOK;
if isempty(Args)&&(~UserDataArgsOK)
Args=struct('Holdaxis',0, ...
'SpacingVertical',0.05,'SpacingHorizontal',0.05, ...
'PaddingLeft',0,'PaddingRight',0,'PaddingTop',0,'PaddingBottom',0, ...
'MarginLeft',.1,'MarginRight',.1,'MarginTop',.1,'MarginBottom',.1, ...
'rows',[],'cols',[]);
end
Args=parseArgs(varargin,Args,{'Holdaxis'},{'Spacing' {'sh','sv'}; 'Padding' {'pl','pr','pt','pb'}; 'Margin' {'ml','mr','mt','mb'}});
if (length(Args.NumericArguments)>2)
Args.rows=Args.NumericArguments{1};
Args.cols=Args.NumericArguments{2};
%remove these 2 numerical arguments
Args.NumericArguments={Args.NumericArguments{3:end}};
end
if OKToStoreArgs
set(f,'UserData',Args);
end
switch length(Args.NumericArguments)
case 0
return % no arguments but rows/cols....
case 1
if numel(Args.NumericArguments{1}) > 1 % restore subplot(m,n,[x y]) behaviour
[x1 y1] = ind2sub([Args.cols Args.rows],Args.NumericArguments{1}(1)); % subplot and ind2sub count differently (column instead of row first) --> switch cols/rows
[x2 y2] = ind2sub([Args.cols Args.rows],Args.NumericArguments{1}(end));
else
x1=mod((Args.NumericArguments{1}-1),Args.cols)+1; x2=x1;
y1=floor((Args.NumericArguments{1}-1)/Args.cols)+1; y2=y1;
end
% x1=mod((Args.NumericArguments{1}-1),Args.cols)+1; x2=x1;
% y1=floor((Args.NumericArguments{1}-1)/Args.cols)+1; y2=y1;
case 2
x1=Args.NumericArguments{1};x2=x1;
y1=Args.NumericArguments{2};y2=y1;
case 4
x1=Args.NumericArguments{1};x2=x1+Args.NumericArguments{3}-1;
y1=Args.NumericArguments{2};y2=y1+Args.NumericArguments{4}-1;
otherwise
error('subaxis argument error')
end
cellwidth=((1-Args.MarginLeft-Args.MarginRight)-(Args.cols-1)*Args.SpacingHorizontal)/Args.cols;
cellheight=((1-Args.MarginTop-Args.MarginBottom)-(Args.rows-1)*Args.SpacingVertical)/Args.rows;
xpos1=Args.MarginLeft+Args.PaddingLeft+cellwidth*(x1-1)+Args.SpacingHorizontal*(x1-1);
xpos2=Args.MarginLeft-Args.PaddingRight+cellwidth*x2+Args.SpacingHorizontal*(x2-1);
ypos1=Args.MarginTop+Args.PaddingTop+cellheight*(y1-1)+Args.SpacingVertical*(y1-1);
ypos2=Args.MarginTop-Args.PaddingBottom+cellheight*y2+Args.SpacingVertical*(y2-1);
if Args.Holdaxis
h=axes('position',[xpos1 1-ypos2 xpos2-xpos1 ypos2-ypos1]);
else
h=subplot('position',[xpos1 1-ypos2 xpos2-xpos1 ypos2-ypos1]);
end
set(h,'box','on');
%h=axes('position',[x1 1-y2 x2-x1 y2-y1]);
set(h,'units',get(gcf,'defaultaxesunits'));
set(h,'tag','subaxis');
if (nargout==0), clear h; end;