impu 发表于 2008-10-8 21:58

如何将横纵坐标都画出来,且坐标原点在图形的中心位置

请问: 用matlab画图,如何将横纵坐标都画出来,且坐标原点在图形的中心位置? 而且最好把默认的图形边框去掉。

[ 本帖最后由 impu 于 2008-10-8 22:04 编辑 ]

ch_j1985 发表于 2008-10-8 22:29

回复 楼主 impu 的帖子

看看这个帖子里面有没有你要的
http://forum.vibunion.com/thread-23755-1-1.html
另外可以看看精华帖、置顶帖或是关于绘图技巧的帖子

impu 发表于 2008-10-9 15:35

本帖最后由 牛小贱 于 2014-3-29 22:45 编辑

多谢楼上的提示,我编了一个新的函数,用来实现上述功能。
原则上讲,此函数可以把所有这样的图形图像的坐标轴画在原点,只要已知图像的句柄。

函数如下:
functionnew_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', , , 'Color','k');
    annotation('arrow', , , '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+);
% xlim(xL);box off;
% set(gca,'XTick',xt,'Color','None','YTick',[]);

new_fig_handle = shift_axis_to_origin( gca ) ;

   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%此例子的实现效果如下两个图所示:

zhangyiqi 发表于 2008-10-10 13:45

回复 板凳 impu 的帖子

果然厉害!
不过把坐标轴移到中心位置sin(x)的最大值不在1,最小值也不在-1处啊?

impu 发表于 2008-10-10 19:35

本帖最后由 牛小贱 于 2014-3-29 22:48 编辑

多谢提醒,更正的程序如下:

原则上讲,此函数可以把所有这样的图形图像的坐标轴画在原点,只要已知图像的句柄。

函数如下:
functionnew_fig_handle = shift_axis_to_origin( fig_handle )

% 本函数目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
% 2008.10.10 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 ;
    xxL = xL + [ -extend_x extend_x] ;
    yyL = yL + [ -extend_y extend_y] ;
    set(gca,'xlim', xxL) ;
    set(gca,'ylim', yyL) ;
   
    pos = get(gca,'Position') ;
    box off;
   
    x_shift = abs( yyL(1)/(yyL(2)-yyL(1)) ) ;
    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 ] ) ;
    xlim(xxL) ;
    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.99999 , 0 ] ) ;
    ylim(yyL) ;
    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) * yyL(1)/(yyL(2)-yyL(1)) ;
    arrow_pos_in_y_dircetion = Base_pos(1) - Base_pos(3) * xxL(1)/(xxL(2)-xxL(1)) ;
   
    annotation('arrow', , , 'Color','k');
    annotation('arrow', , , 'Color','k');
   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%下面是一个例子:
% 本程序目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
% 2008.10.10 in pku

clc;clear;close all;
t=linspace(-2,8,100);
a1=axes;
plot(t,cos(t));

new_fig_handle = shift_axis_to_origin( gca ) ;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%此例子的实现效果如下两个图所示:

zhangyiqi 发表于 2008-10-10 20:00

回复 5楼 impu 的帖子

强,不是一般的强!

kangxiaoxiao 发表于 2008-11-24 21:22

很有帮助,谢谢

trypsin 发表于 2010-10-11 22:24

暴强啊,这个必须学习了

suqiao 发表于 2010-10-14 18:49

好厉害,学习了~

流水振动 发表于 2011-3-27 14:41

怎么用啊,哥们?

ChaChing 发表于 2011-3-27 16:43

回复 10 # 流水振动 的帖子

将5F的程序存在路径/目录下, 再用5F的例子!

2099333666 发表于 2011-5-12 11:33

{:{39}:}

fphelpless 发表于 2011-7-22 22:03

大神啊,膜拜中。。谢过。。{:{39}:}

candy5052 发表于 2012-3-29 13:10

刚使用过,非常感谢!{:{01}:}

wfyyf 发表于 2012-4-21 16:25

油瓶在手 低头猛走 鼠标一抖 一分到手{:{26}:}
页: [1] 2
查看完整版本: 如何将横纵坐标都画出来,且坐标原点在图形的中心位置