Index: ../trunk-jpl/src/m/plot/plotboxpos.m =================================================================== --- ../trunk-jpl/src/m/plot/plotboxpos.m (revision 0) +++ ../trunk-jpl/src/m/plot/plotboxpos.m (revision 14243) @@ -0,0 +1,91 @@ +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); \ No newline at end of file