本帖最后由 牛小贱 于 2014-3-29 22:45 编辑
多谢楼上的提示,我编了一个新的函数,用来实现上述功能。
原则上讲,此函数可以把所有这样的图形图像的坐标轴画在原点,只要已知图像的句柄。
函数如下:
- function new_fig_handle = shift_axis_to_origin( fig_handle )
- % 本函数目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
- % 2008.10.08 in pku
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- figure('Name','shift_axis_to_origin','NumberTitle','off') % Create a new figure
- % 拷贝图形到一个新的窗口
- new_fig_handle = copyobj( fig_handle , gcf );
- xL=xlim ;
- yL=ylim ;
-
- xt=get(gca,'xtick') ;
- yt=get(gca,'ytick') ;
- set(gca,'XTick',[],'XColor','w') ;
- set(gca,'YTick',[],'YColor','w') ;
-
- % 把 x 和 y 坐标轴的两个方向各延长 10% (为了视觉上好看)
- extend_x = ( xL(2)-xL(1) ) * 0.1 ;
- extend_y = ( yL(2)-yL(1) ) * 0.1 ;
- set(gca,'xlim', xL + [ -extend_x extend_x]) ;
- set(gca,'ylim', yL + [ -extend_y extend_y]) ;
-
- pos = get(gca,'Position') ;
- box off;
-
- x_shift = abs( yL(1)/(yL(2)-yL(1)) ) ;
- y_shift = abs( xL(1)/(xL(2)-xL(1)) ) ;
- temp_1 = axes( 'Position', pos + [ 0 , pos(4) * x_shift , 0 , - pos(4)* x_shift ] ) ;
- xlim(xL) ;
- box off ;
- set(temp_1,'XTick',xt,'Color','None','YTick',[]) ;
- set(temp_1,'YColor','w') ;
-
-
- temp_2 = axes( 'Position', pos + [ pos(3) * y_shift , 0 , - pos(3)* y_shift , 0 ] ) ;
- ylim(yL) ;
- box off ;
- set(temp_2,'YTick',yt,'Color','None','XTick',[]) ;
- set(temp_2,'XColor','w') ;
-
- Base_pos = get(new_fig_handle,'Position') ;
- arrow_pos_in_x_dircetion = Base_pos(2) - Base_pos(4) * yL(1)/(yL(2)-yL(1)) ;
- arrow_pos_in_y_dircetion = Base_pos(1) - Base_pos(3) *xL(1)/(xL(2)-xL(1)) ;
-
- annotation('arrow',[Base_pos(1) , Base_pos(1)+Base_pos(3)] , [arrow_pos_in_x_dircetion , arrow_pos_in_x_dircetion ] , 'Color','k');
- annotation('arrow',[arrow_pos_in_y_dircetion , arrow_pos_in_y_dircetion ] , [Base_pos(2) , Base_pos(2)+Base_pos(4)] , 'Color','k');
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码 下面是一个例子:
- % 本程序目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
- % 2008.10.08
- %
- clc;clear;close all;
- t=linspace(-2,8,100);
- a1=axes;
- plot(t,cos(t));
- % xt=get(gca,'xtick');
- % set(gca,'XTick',[],'XColor','w');
- % xL=xlim;
- % p=get(gca,'Position');
- % box off;
- % a2=axes('Position',p+[0,p(4)/2,0,-p(4)/2]);
- % xlim(xL);box off;
- % set(gca,'XTick',xt,'Color','None','YTick',[]);
- new_fig_handle = shift_axis_to_origin( gca ) ;
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码 此例子的实现效果如下两个图所示:
|