EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
function new_fig_handle = shift_axis_to_origin( fig_handle ) % 本函数目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)# F9 L2 V" _2 m+ J
% 2008.10.10 in pku
2 d+ {) U/ r, d7 s% I7 r- e%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 w: i0 L8 u! j) \! }figure('Name','shift_axis_to_origin','NumberTitle','off') % Create a new figure A( h d J- ], Y+ W: D2 @
% 拷贝图形到一个新的窗口( e) p9 P( N* n9 O2 ?8 U3 L
new_fig_handle = copyobj( fig_handle , gcf ); xL=xlim ;2 P8 o. T9 f6 j4 D) M
yL=ylim ; xt=get(gca,'xtick') ;- M1 W5 J+ f' @2 a9 a
yt=get(gca,'ytick') ;
4 f2 `2 ~/ g2 w) tset(gca,'XTick',[],'XColor','w') ;
9 M5 ?6 y# v( G8 D% mset(gca,'YTick',[],'YColor','w') ; % 把 x 和 y 坐标轴的两个方向各延长 10% (为了视觉上好看)9 w' B T! N- c i
extend_x = ( xL(2)-xL(1) ) * 0.1 ;
/ S4 q+ L+ W; t* q- } R+ |extend_y = ( yL(2)-yL(1) ) * 0.1 ;
5 E6 z: t4 N6 YxxL = xL + [ -extend_x extend_x] ;
- B1 {* a* O; f0 LyyL = yL + [ -extend_y extend_y] ;
$ [! v- p2 k V3 E' l3 [0 n; Vset(gca,'xlim', xxL) ;( s+ \3 t6 i9 i& @9 G" \' k7 V; A7 V
set(gca,'ylim', yyL) ; pos = get(gca,'Position') ;
5 d0 m: i& V4 U, \! `box off; x_shift = abs( yyL(1)/(yyL(2)-yyL(1)) ) ;: D) S) {! M# ^; a
y_shift = abs( xxL(1)/(xxL(2)-xxL(1)) ) ; temp_1 = axes( 'Position', pos + [ 0 , pos(4) * x_shift , 0 , - pos(4)* x_shift*0.99999 ] ) ;4 O+ k: B, Q, ~3 S
xlim(xxL) ;
2 M- v$ [/ j6 O+ lbox off ;+ r' X- T5 W- v3 z, \7 g+ p5 m
set(temp_1,'XTick',xt,'Color','None','YTick',[]) ;
9 U: T, z1 u! P9 Y5 s* D {set(temp_1,'YColor','w') ; temp_2 = axes( 'Position', pos + [ pos(3) * y_shift , 0 , -pos(3)* y_shift*0.99999 , 0 ] ) ;' e3 p' I2 S* v, b
ylim(yyL) ;* [, I8 d- A% p( J( h" ]8 F
box off ;
" ?, p, N! N z0 }: g3 S+ [set(temp_2,'YTick',yt,'Color','None','XTick',[]) ;/ F. f% ^, G% Q, v& @
set(temp_2,'XColor','w') ; Base_pos = get(new_fig_handle,'Position') ;& {0 s- Q, Z' p) I4 a
arrow_pos_in_x_dircetion = Base_pos(2) - Base_pos(4) * yyL(1)/(yyL(2)-yyL(1)) ;& z" ^ i6 i# @* R9 Z
arrow_pos_in_y_dircetion = Base_pos(1) - Base_pos(3) * xxL(1)/(xxL(2)-xxL(1)) ; annotation('arrow',[Base_pos(1) , Base_pos(1)+Base_pos(3)] , [arrow_pos_in_x_dircetion , arrow_pos_in_x_dircetion ] , 'Color','k');
6 v! x+ A3 c# ~9 Hannotation('arrow',[arrow_pos_in_y_dircetion , arrow_pos_in_y_dircetion ] , [Base_pos(2) , Base_pos(2)+Base_pos(4)] , 'Color','k');% H0 r' I6 M1 t/ u
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下面是一个例子: % 本程序目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致); ^' |0 _2 u& o2 t3 D
% 2008.10.08) o( m" X6 t& h2 Y
% clc;clear;close all;2 L U% `6 h/ y7 |- `0 Y+ N3 @" q1 I
t=linspace(-2,8,100);
4 p7 r3 D4 ~ z4 y- N! `a1=axes;6 J9 b/ M. w2 f* t( q6 D$ ^% W
plot(t,cos(t)); % xt=get(gca,'xtick');
) q2 o" B4 d7 G5 n% ?6 o% set(gca,'XTick',[],'XColor','w');3 Z' e5 V; d4 C4 u6 d1 v. r
% xL=xlim;
8 E, v# _" D( d" n/ x4 R% p=get(gca,'Position');
2 k5 }* O/ V; b3 U. ^7 z1 s" Y% box off;- A. a; ~" c7 r$ P
% a2=axes('Position',p+[0,p(4)/2,0,-p(4)/2]);: ]- M2 Q( q+ j' p: ?
% xlim(xL);box off;
7 ]% J x5 @7 U n% set(gca,'XTick',xt,'Color','None','YTick',[]); new_fig_handle = shift_axis_to_origin( gca ) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 此例子的实现效果如下两个图所示:
& z9 A( i. [2 O4 Y: C7 a g, r+ F
1 m) ] p; @/ w( C( X: D/ L
% k) {3 n* Y0 G9 Y7 j
8 a; P$ A9 k) P/ o7 ?
" }) n3 h, G$ L) {* [" Y |