-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathplotboxpos.m
85 lines (75 loc) · 2.43 KB
/
plotboxpos.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
function pos = plotboxpos(h)
%PLOTBOXPOS Returns the position of the plotted axis region
%
% pos = plotboxpos(h)
%
% This function returns the position of the plotted region of an axis,
% which may differ from the actual axis position, depending on the axis
% limits, data aspect ratio, and plot box aspect ratio. The position is
% returned in the same units as the those used to define the axis itself.
% This function can only be used for a 2D plot.
%
% Input variables:
%
% h: axis handle of a 2D axis (if ommitted, current axis is used).
%
% Output variables:
%
% pos: four-element position vector, in same units as h
% Copyright 2010 Kelly Kearney
% Check input
if nargin < 1
h = gca;
end
if ~ishandle(h) || ~strcmp(get(h,'type'), 'axes')
error('Input must be an axis handle');
end
% Get position of axis in pixels
currunit = get(h, 'units');
set(h, 'units', 'pixels');
axisPos = get(h, 'Position');
set(h, 'Units', currunit);
% Calculate box position based axis limits and aspect ratios
darismanual = strcmpi(get(h, 'DataAspectRatioMode'), 'manual');
pbarismanual = strcmpi(get(h, 'PlotBoxAspectRatioMode'), 'manual');
if ~darismanual && ~pbarismanual
pos = axisPos;
else
dx = diff(get(h, 'XLim'));
dy = diff(get(h, 'YLim'));
dar = get(h, 'DataAspectRatio');
pbar = get(h, 'PlotBoxAspectRatio');
limDarRatio = (dx/dar(1))/(dy/dar(2));
pbarRatio = pbar(1)/pbar(2);
axisRatio = axisPos(3)/axisPos(4);
if darismanual
if limDarRatio > axisRatio
pos(1) = axisPos(1);
pos(3) = axisPos(3);
pos(4) = axisPos(3)/limDarRatio;
pos(2) = (axisPos(4) - pos(4))/2 + axisPos(2);
else
pos(2) = axisPos(2);
pos(4) = axisPos(4);
pos(3) = axisPos(4) * limDarRatio;
pos(1) = (axisPos(3) - pos(3))/2 + axisPos(1);
end
elseif pbarismanual
if pbarRatio > axisRatio
pos(1) = axisPos(1);
pos(3) = axisPos(3);
pos(4) = axisPos(3)/pbarRatio;
pos(2) = (axisPos(4) - pos(4))/2 + axisPos(2);
else
pos(2) = axisPos(2);
pos(4) = axisPos(4);
pos(3) = axisPos(4) * pbarRatio;
pos(1) = (axisPos(3) - pos(3))/2 + axisPos(1);
end
end
end
% Convert plot box position to the units used by the axis
temp = axes('Units', 'Pixels', 'Position', pos, 'Visible', 'off', 'parent', get(h, 'parent'));
set(temp, 'Units', currunit);
pos = get(temp, 'position');
delete(temp);