|
@@ -0,0 +1,119 @@
|
|
|
+function varargout = ds2nfu(varargin)
|
|
|
+% DS2NFU Convert data space units into normalized figure units.
|
|
|
+%
|
|
|
+% [Xf, Yf] = DS2NFU(X, Y) converts X,Y coordinates from
|
|
|
+% data space to normalized figure units, using the current axes. This is
|
|
|
+% useful as input for ANNOTATION.
|
|
|
+%
|
|
|
+% POSf = DS2NFU(POS) converts 4-element position vector, POS from
|
|
|
+% data space to normalized figure units, using the current axes. The
|
|
|
+% position vector has the form [Xo Yo Width Height], as defined here:
|
|
|
+%
|
|
|
+% web(['jar:file:D:/Applications/MATLAB/R2006a/help/techdoc/' ...
|
|
|
+% 'help.jar!/creating_plots/axes_pr4.html'], '-helpbrowser')
|
|
|
+%
|
|
|
+% [Xf, Yf] = DS2NFU(HAX, X, Y) converts X,Y coordinates from
|
|
|
+% data space to normalized figure units, on specified axes HAX.
|
|
|
+%
|
|
|
+% POSf = DS2NFU(HAX, POS) converts 4-element position vector, POS from
|
|
|
+% data space to normalized figure units, using the current axes.
|
|
|
+%
|
|
|
+% Ex.
|
|
|
+% % Create some data
|
|
|
+% t = 0:.1:4*pi;
|
|
|
+% s = sin(t);
|
|
|
+%
|
|
|
+% % Add an annotation requiring (x,y) coordinate vectors
|
|
|
+% plot(t,s);ylim([-1.2 1.2])
|
|
|
+% xa = [1.6 2]*pi;
|
|
|
+% ya = [0 0];
|
|
|
+% [xaf,yaf] = ds2nfu(xa,ya);
|
|
|
+% annotation('arrow',xaf,yaf)
|
|
|
+%
|
|
|
+% % Add an annotation requiring a position vector
|
|
|
+% pose = [4*pi/2 .9 pi .2];
|
|
|
+% posef = ds2nfu(pose);
|
|
|
+% annotation('ellipse',posef)
|
|
|
+%
|
|
|
+% % Add annotations on a figure with multiple axes
|
|
|
+% figure;
|
|
|
+% hAx1 = subplot(211);
|
|
|
+% plot(t,s);ylim([-1.2 1.2])
|
|
|
+% hAx2 = subplot(212);
|
|
|
+% plot(t,-s);ylim([-1.2 1.2])
|
|
|
+% [xaf,yaf] = ds2nfu(hAx1,xa,ya);
|
|
|
+% annotation('arrow',xaf,yaf)
|
|
|
+% pose = [4*pi/2 -1.1 pi .2];
|
|
|
+% posef = ds2nfu(hAx2,pose);
|
|
|
+% annotation('ellipse',posef)
|
|
|
+
|
|
|
+% Michelle Hirsch
|
|
|
+% mhirsch@mathworks.com
|
|
|
+% Copyright 2006-2014 The MathWorks, Inc
|
|
|
+
|
|
|
+%% Process inputs
|
|
|
+narginchk(1,3)
|
|
|
+
|
|
|
+% Determine if axes handle is specified
|
|
|
+if length(varargin{1})== 1 && ishandle(varargin{1}) && strcmp(get(varargin{1},'type'),'axes')
|
|
|
+ hAx = varargin{1};
|
|
|
+ varargin = varargin(2:end);
|
|
|
+else
|
|
|
+ hAx = gca;
|
|
|
+end;
|
|
|
+
|
|
|
+errmsg = ['Invalid input. Coordinates must be specified as 1 four-element \n' ...
|
|
|
+ 'position vector or 2 equal length (x,y) vectors.'];
|
|
|
+
|
|
|
+% Proceed with remaining inputs
|
|
|
+if length(varargin)==1 % Must be 4 elt POS vector
|
|
|
+ pos = varargin{1};
|
|
|
+ if length(pos) ~=4
|
|
|
+ error(errmsg);
|
|
|
+ end
|
|
|
+else
|
|
|
+ [x,y] = deal(varargin{:});
|
|
|
+ if length(x) ~= length(y)
|
|
|
+ error(errmsg)
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+%% Get limits
|
|
|
+axun = get(hAx,'Units');
|
|
|
+set(hAx,'Units','normalized');
|
|
|
+axpos = get(hAx,'Position');
|
|
|
+% When DataAspectRatioMode and PlotBoxAspectRatioMode are both manual,
|
|
|
+% Position likely won't accurately reflect actual position of visible axis
|
|
|
+
|
|
|
+axlim = axis(hAx);
|
|
|
+
|
|
|
+if strcmp(hAx.XScale,"log")
|
|
|
+ axlim(1:2) = log10(axlim(1:2));
|
|
|
+ x = log10(x);
|
|
|
+end
|
|
|
+if strcmp(hAx.YScale,"log")
|
|
|
+ axlim(3:4) = log10(axlim(3:4));
|
|
|
+ y = log10(y);
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+axwidth = diff(axlim(1:2));
|
|
|
+axheight = diff(axlim(3:4));
|
|
|
+
|
|
|
+%% Transform data
|
|
|
+if exist('x','var')
|
|
|
+ varargout{1} = (x-axlim(1))*axpos(3)/axwidth + axpos(1);
|
|
|
+ varargout{2} = (y-axlim(3))*axpos(4)/axheight + axpos(2);
|
|
|
+else
|
|
|
+ pos(1) = (pos(1)-axlim(1))/axwidth*axpos(3) + axpos(1);
|
|
|
+ pos(2) = (pos(2)-axlim(3))/axheight*axpos(4) + axpos(2);
|
|
|
+ pos(3) = pos(3)*axpos(3)/axwidth;
|
|
|
+ pos(4) = pos(4)*axpos(4)/axheight;
|
|
|
+ varargout{1} = pos;
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+%% Restore axes units
|
|
|
+set(hAx,'Units',axun)
|
|
|
+
|