diff core/tools/addTopXAxis.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tools/addTopXAxis.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,140 @@
+function [nAxis] = addTopXAxis (varargin)
+
+% [nAxis] = addTopXAxis (axisH, properties ...)
+% Add an X-axis on top (additional to the one on bottom) of the figure,
+% with its own ticks labels and axis label (allow double scale).
+% Ticks, minor ticks positions and x limits are set to be identical for top and bottom
+% axis. Moreover, they are linked, i.e. a modification of one of them, even after execution
+% of this function, will result in modification of the other one.
+%
+% Parameters:
+% 	axisH = handle for axes (dafault = current axes, given by |gca|)
+%	properties: syntax is two-folded arguments for each property,
+%       	    on the form: 'name of property' (case insensitive), value of property
+%		    and properties can be 
+%		xLabStr : the label for the top X-axis (string)
+%			default = ''
+%		expression or exp : expression for transforming bottom X-tick labels to
+%			      top X-tick labels. In the expression, |argu| will refer
+%				to the value of the bottom X-tick labels.
+%				eg. going from |log10(x)| to linear |x| values will be done with
+%				the string '10.^argu' for expression.
+%			default = ''
+%		Note : if expression needs to use some variables, that are not accessible to this function, they need to be evaluated
+%			before being passed to this function (see exemples below).
+%		xTickLabelFormat : display format, used for converting numerical values for tick labels in strings. (string)
+%				The computation of top axis tick labels using |expression| can lead to numbers taking a lot of space
+%				because of the precision of the display. Reducing the precision will reduce the size of the labels.
+%			default = '%4.1f'
+%
+%  Exemples:
+%
+%	axisH = axes % create new axes, and save the handle in axisH
+%       addTopXAxis(axisH, 'expression', '-argu') % change the label of the ticks by their opposite
+%	
+%
+%  addTopXAxis('xticklabel', '(k0.*10.^argu)', 'xlabel', '$\lambda_{up}$ (cm)')
+%	will use the current axis (handle is not passed to the function), and will compute the new X-tick values according to
+%		x' = k0.*10.^argu;
+%	where |k0| is a variable whose value has to be set in the 'base' workspace.
+
+%
+%	V2 - 11/27/2005
+%	Modifs for V2:
+%		* - now evaluates expression in 'base' workspace.
+%		Therefore, variables (like 'k0' in the second example) do not need to be evaluated anymore before being passed, 
+%		as long as they already exist in 'base' workspace. It should allow more complex expressions to be passed than previously.
+%		Example 2 then becomes
+%			addTopXAxis('expression', '(k0.*10.^argu)', 'xLabStr', '$\lambda_{up}$ (cm)')
+%		instead of
+%			addTopXAxis('expression', ['(', num2str(k0),'.*10.^argu)'], 'xLabStr', '$\lambda_{up}$ (cm)'
+%		Drawback: the function create/assign a variable called 'axisH' in base workspace. Potential conflicts here ...
+%		* - properties are not case sensitive anymore
+%		* - 'exp' can be used instead of 'expression' for property name (following John D'Errico comment, if I understood it well ....)
+%		
+%
+%	Author : Emmanuel P. Dinnat
+%	Date : 09/2005
+%	Contact: emmanueldinnat@yahoo.fr
+
+global hlink % make the properties link global
+
+%% Default values for properties
+axisH = gca;
+xTickLabelFormat = '%4.1f';
+xLabStr = '';
+expression = '';
+
+%% Process input parameters (if they exist)
+% if input parameters
+if length(varargin) > 0
+	if isstr(varargin{1}) % if no axes handle is passed ...
+		axisH = gca;
+		if (length(varargin) > 1)
+			properties = varargin(1:end);
+		end
+	else % else deal with passed axes handle
+		if ishandle(varargin{1})
+			axisH = varargin{1};
+		else
+			error('addTopXAxis : handle for axes invalid.')
+		end
+		properties = varargin(2:end);
+	end
+	if ~mod(length(properties),2)
+		for iArg = 1:length(properties)/2
+			% switch properties{2*iArg-1}
+			switch lower(properties{2*iArg-1}) % modif V2 - suppress case sensitivity
+				case {'xticklabel','expression' , 'exp'} 
+					expression = properties{2*iArg};
+				% case 'xLabStr'
+				case {'xlabel','xlabstr'} % V2
+					xLabStr = properties{2*iArg};
+				% case 'xTickLabelFormat'
+				case 'xticklabelformat' % V2
+					xTickLabelFormat = properties{2*iArg};
+				otherwise
+					error(['addTopXAxis : property ''', properties{2*iArg-1},''' does not exist.'])
+			end
+		end
+	else
+		error('addTopXAxis : arguments number for proporties should be even.')
+	end
+end % if input parameters
+%% replace |argu| by x-tick labels in the computation expression for new x-tick labels	
+% 	newXtickLabel_command = regexprep(expression, 'argu', 'get(axisH, ''xTick'')''');
+
+%% Get paramters of figures to be modified (other parameters to be copied on the new axis are not extracted)
+	set(axisH, 'units', 'normalized');
+	cAxis_pos = get(axisH, 'position');
+%% shift downward original axis a little bit
+ 	cAxis_pos(2) = cAxis_pos(2)*0.8;
+	set(axisH, 'position', cAxis_pos);
+%% Make new axis
+	nAxis = subplot('position', [cAxis_pos(1), (cAxis_pos(2)+cAxis_pos(4))*1.007, cAxis_pos(3), 0.0001]);
+%% put new Xaxis on top
+	set(nAxis, 'xaxisLocation', 'top');
+%% Improve readability
+	%% delete Y label on new axis
+	set(nAxis, 'yTickLabel', []);
+	% remove box for original axis
+% 	set(axisH, 'box', 'off');
+	% remove grids
+	set(nAxis, 'yGrid', 'off');
+	set(nAxis, 'xGrid', 'off');
+%% Set new Xaxis limits, ticks and subticks the same as original ones (by link) ...
+	set(nAxis, 'xlim', get(axisH, 'xlim'));
+	set(nAxis, 'XTick', get(axisH, 'XTick'));
+	set(nAxis, 'XMinorTick', get(axisH, 'XMinorTick'));
+	hlink = linkprop([nAxis, axisH], {'xLim','XTick','XMinorTick'});
+%% ... but replace ticks labels by new ones !!!
+	assignin('base', 'axisH', axisH)
+	% set(nAxis, 'xtickLabel',  num2str(evalin('base', newXtickLabel_command), xTickLabelFormat));
+    set(nAxis, 'xtickLabel', expression);
+    %% but label for new axis
+	if exist('xLabStr')
+        xlabel(xLabStr)
+	end
+%% return current axis to original one (for further modification affecting original axes)
+	axes(axisH);
+%	hlink = linkprop([nAxis, gca], {'xLim','XTick','XMinorTick'})
\ No newline at end of file