EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
function new_fig_handle = shift_axis_to_origin( fig_handle ) % 本函数目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
% ]. L( }! I {% 2008.10.10 in pku
# x* S8 T* B+ E& _' @# e1 R4 W- ~! D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% d/ N# I$ v3 w; ^
figure('Name','shift_axis_to_origin','NumberTitle','off') % Create a new figure9 w5 F- |2 M4 ^: |- P/ s
% 拷贝图形到一个新的窗口" r0 H7 ]5 ^0 c
new_fig_handle = copyobj( fig_handle , gcf ); xL=xlim ;) x+ @: {$ _1 g
yL=ylim ; xt=get(gca,'xtick') ;! g6 \( `+ R* ~
yt=get(gca,'ytick') ;& p, s5 H! v0 I3 X
set(gca,'XTick',[],'XColor','w') ;: N$ z& E/ h: A
set(gca,'YTick',[],'YColor','w') ; % 把 x 和 y 坐标轴的两个方向各延长 10% (为了视觉上好看)+ @! D x' j( _0 C3 G9 f" }# d! N
extend_x = ( xL(2)-xL(1) ) * 0.1 ;
+ s2 _, {8 w& Wextend_y = ( yL(2)-yL(1) ) * 0.1 ;
! _8 s# u8 @! b. ?% DxxL = xL + [ -extend_x extend_x] ;1 u) Y+ @% b) K2 i
yyL = yL + [ -extend_y extend_y] ;
7 b6 \) k+ S/ P6 P- ^/ g0 j6 i; j; @set(gca,'xlim', xxL) ;
( u w% o- q( I1 U, _" {set(gca,'ylim', yyL) ; pos = get(gca,'Position') ;
+ {$ [9 ^. y( Z Z7 wbox off; x_shift = abs( yyL(1)/(yyL(2)-yyL(1)) ) ;! \, S9 W( y S3 a# v
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 ] ) ;3 V, K( ?' ]# _$ v1 n( Z
xlim(xxL) ;; n/ Y. @9 r" f/ e( n) C0 y
box off ;9 N( q+ [ q& }+ ^2 n: D
set(temp_1,'XTick',xt,'Color','None','YTick',[]) ;5 {8 V2 o6 S R
set(temp_1,'YColor','w') ; temp_2 = axes( 'Position', pos + [ pos(3) * y_shift , 0 , -pos(3)* y_shift*0.99999 , 0 ] ) ;# `7 r# U' o! r% {- {
ylim(yyL) ;
1 Q, O) n3 w/ X/ J+ |" n# cbox off ;# O- Z& [5 i5 e0 D* B4 `
set(temp_2,'YTick',yt,'Color','None','XTick',[]) ;
5 N6 ]" ^! P7 @! @* Q. {9 Mset(temp_2,'XColor','w') ; Base_pos = get(new_fig_handle,'Position') ;
5 ]7 _4 S4 S" g0 G$ j$ jarrow_pos_in_x_dircetion = Base_pos(2) - Base_pos(4) * yyL(1)/(yyL(2)-yyL(1)) ;# W4 g$ G3 F& c5 @9 @! c
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'); r4 E1 j, o3 ^
annotation('arrow',[arrow_pos_in_y_dircetion , arrow_pos_in_y_dircetion ] , [Base_pos(2) , Base_pos(2)+Base_pos(4)] , 'Color','k');! ~: T: d8 ?( J7 y: \% m4 O5 o! I* K
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下面是一个例子: % 本程序目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
2 z$ m: k' r8 V) t$ L% J$ [# e: `% 2008.10.08( Z3 }" L" m( k7 r
% clc;clear;close all;
8 R7 u/ P! i* qt=linspace(-2,8,100);
! k. w# `* d# J% M' Y% H9 ?3 Ba1=axes;/ z+ P4 p) b9 I
plot(t,cos(t)); % xt=get(gca,'xtick');
. q6 s( G5 K1 {7 c0 X% set(gca,'XTick',[],'XColor','w');
- G' v9 r$ l" S! c: A% xL=xlim;
; r! ?1 c( e, _8 r4 p7 N) o2 Z5 O% p=get(gca,'Position');9 b$ s6 |1 U8 D; R8 }: l5 f
% box off;6 w7 M. D5 G: o& R7 D* D
% a2=axes('Position',p+[0,p(4)/2,0,-p(4)/2]);8 {( |/ r/ h- B+ D7 \6 v9 `7 P5 b
% xlim(xL);box off;
2 [( ~$ Y4 j) K0 A( R' ^. o0 \, s% set(gca,'XTick',xt,'Color','None','YTick',[]); new_fig_handle = shift_axis_to_origin( gca ) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 此例子的实现效果如下两个图所示:
7 _- M3 A! {9 B# n2 k) Y1 E4 p
x+ @5 p3 w; r; {+ h- v6 S9 A5 w" Q ' b; ?6 b& c& p; o' G, V8 S1 j" _5 r
) t2 i6 Q! C0 \- H5 e, M
; U" H r2 o2 F( q8 G/ v |