-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplotboxpos.m
More file actions
139 lines (118 loc) · 3.94 KB
/
plotboxpos.m
File metadata and controls
139 lines (118 loc) · 3.94 KB
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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
xlim = get(h, 'XLim');
ylim = get(h, 'YLim');
% Deal with axis limits auto-set via Inf/-Inf use
if any(isinf([xlim ylim]))
hc = get(h, 'Children');
hc(~arrayfun( @(h) isprop(h, 'XData' ) & isprop(h, 'YData' ), hc)) = [];
xdata = get(hc, 'XData');
if iscell(xdata)
xdata = cellfun(@(x) x(:), xdata, 'uni', 0);
xdata = cat(1, xdata{:});
end
ydata = get(hc, 'YData');
if iscell(ydata)
ydata = cellfun(@(x) x(:), ydata, 'uni', 0);
ydata = cat(1, ydata{:});
end
isplotted = ~isinf(xdata) & ~isnan(xdata) & ...
~isinf(ydata) & ~isnan(ydata);
xdata = xdata(isplotted);
ydata = ydata(isplotted);
if isempty(xdata)
xdata = [0 1];
end
if isempty(ydata)
ydata = [0 1];
end
if isinf(xlim(1))
xlim(1) = min(xdata);
end
if isinf(xlim(2))
xlim(2) = max(xdata);
end
if isinf(ylim(1))
ylim(1) = min(ydata);
end
if isinf(ylim(2))
ylim(2) = max(ydata);
end
end
dx = diff(xlim);
dy = diff(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
hparent = get(h, 'parent');
hfig = ancestor(hparent, 'figure'); % in case in panel or similar
currax = get(hfig, 'currentaxes');
temp = axes('Units', 'Pixels', 'Position', pos, 'Visible', 'off', 'parent', hparent);
set(temp, 'Units', currunit);
pos = get(temp, 'position');
delete(temp);
set(hfig, 'currentaxes', currax);