diff core/tools/centeraxes.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/centeraxes.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,168 @@
+function out = centeraxes(ax,opt)
+% out = centeraxes(ax,opt)
+%==========================================================================
+% Center the coordinate axes of a plot so that they pass through the 
+% origin.
+%
+% Input: 0, 1 or 2 arguments
+%        0: Moves the coordinate axes of 'gca', i.e. the currently active 
+%           axes.
+%        1: ax, a handle to the axes which should be moved.
+%        2: ax, opt, where opt is a struct with further options
+%                opt.fontsize = 'size of axis tick labels'
+%                opt.fontname = name of axis tick font.
+%
+% If the opt struct is ommitted, the current values for the axes are used.
+%
+% Output: stuct out containing handles to all line objects created by this
+%         function.
+%
+%==========================================================================
+% Version: 1.1
+% Created: October 1, 2008, by Johan E. Carlson
+% Last modified: November 21, 2009, by Johan E. Carlson
+%==========================================================================
+
+if nargin < 2,
+    fontsize = get(ax,'FontSize');
+    fontname = get(ax,'FontName');
+end
+if nargin < 1,
+    ax = gca;
+end
+
+if nargin == 2,
+    if isfield(opt,'fontsize'),
+        fontsize = opt.fontsize;
+    else
+        fontsize = get(ax,'FontSize');
+    end;
+    if isfield(opt,'fontname'),
+        fontname = opt.fontname;
+    else
+        fontname = get(ax,'FontName');
+    end
+end
+
+axes(ax);
+set(gcf,'color',[1 1 1]);
+xtext = get(get(ax,'xlabel'),'string');
+ytext = get(get(ax,'ylabel'),'string');
+
+%--------------------------------------------------------------------------
+% Check if the current coordinate system include the origin. If not, change
+% it so that it does!
+%--------------------------------------------------------------------------
+xlim = 1.1*get(ax,'xlim');
+ylim = 1.1*get(ax,'ylim');
+set(ax,'xlim',xlim);
+set(ax,'ylim',ylim);
+
+if xlim(1)>0,
+    xlim(1) = 0;
+end
+
+if ylim(1)>0,
+    ylim(1) = 0;
+end
+
+if xlim(2) < 0,
+    xlim(2) = 0;
+end
+
+if ylim(2) < 0,
+    ylim(2) = 0;
+end;
+
+set(ax,'xlim',xlim,'ylim',ylim);
+
+
+% -------------------------------------------------------------------------
+% Caculate size of the "axis tick marks"
+% -------------------------------------------------------------------------
+axpos = get(ax,'position');
+figpos = get(gcf,'position');
+aspectratio = axpos(4) / (axpos(3));
+xsize = xlim(2) - xlim(1);
+ysize = ylim(2) - ylim(1);
+xticksize = ysize/figpos(4)*12;
+yticksize = xsize*aspectratio/figpos(3)*12;
+
+% -------------------------------------------------------------------------
+% Store old tick values and tick labels
+% -------------------------------------------------------------------------
+ytick = get(ax,'YTick');
+xtick = get(ax,'XTick');
+xticklab = get(ax,'XTickLabel');
+yticklab = get(ax,'YTickLabel');
+
+% -------------------------------------------------------------------------
+% Draw new coordinate system
+% -------------------------------------------------------------------------
+
+yax = line([0; 0],[ylim(1)-1; ylim(2)]);
+xax = line([xlim(1); xlim(2)],[0; 0]);
+set(xax,'color',[0 0 0])
+set(yax,'color',[0 0 0])
+
+% Draw x-axis ticks
+for k = 1:length(xtick),
+    newxtick(k) = line([xtick(k); xtick(k)],[-xticksize/2; xticksize/2]);
+    if (xtick(k)~=0),
+        newxticklab(k) = text(xtick(k),-1.5*xticksize, strtrim(xticklab(k,:)));
+        set(newxticklab(k),'HorizontalAlignment','center',...
+            'Fontsize',fontsize,'FontName',fontname);
+    end
+end
+set(newxtick,'color',[0 0 0]);
+
+% Draw y-axis ticks
+for k = 1:length(ytick),
+    newytick(k) = line([-yticksize/2; yticksize/2],[ytick(k); ytick(k)]);
+    if (ytick(k)~=0),
+        newyticklab(k) = text(-.8*yticksize,ytick(k), yticklab(k,:));
+        set(newyticklab(k),'HorizontalAlignment','right',...
+            'FontSize',fontsize,'FontName',fontname);
+    end
+end
+set(newytick,'color',[0 0 0]);
+
+%--------------------------------------------------------------------------
+% Move xlabels
+%--------------------------------------------------------------------------
+newxlabel = text(xlim(2),-1.5*xticksize,xtext);
+set(newxlabel,'HorizontalAlignment','center',...
+    'FontWeight','demi','FontSize',fontsize+2,'FontName',fontname);
+
+newylabel = text(-yticksize,ylim(2)*1.02,ytext);
+set(newylabel,'HorizontalAlignment','right','VerticalAlignment','top',...
+    'FontWeight','demi','FontSize',fontsize+2,'FontName',fontname);
+
+%--------------------------------------------------------------------------
+% Create arrowheads
+%--------------------------------------------------------------------------
+x = [0; -yticksize/4; yticksize/4];
+y = [ylim(2); ylim(2)-xticksize; ylim(2)-xticksize];
+patch(x,y,[0 0 0])
+
+x = [xlim(2); xlim(2)-yticksize; xlim(2)-yticksize];
+y = [0; xticksize/4; -xticksize/4];
+patch(x,y,[0 0 0])
+
+axis off;
+box off;
+
+%--------------------------------------------------------------------------
+% Create output struct
+%--------------------------------------------------------------------------
+
+if nargout > 0,
+    out.xaxis = xax;
+    out.yaxis = yax;
+    out.xtick = newxtick;
+    out.ytick = newytick;
+    out.xticklabel = newxticklab;
+    out.yticklabel = newyticklab;
+    out.newxlabel = newxlabel;
+    out.newylabel = newylabel;
+end;
\ No newline at end of file