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