声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 31510|回复: 24

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

  [复制链接]
发表于 2008-10-8 21:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

[ 本帖最后由 impu 于 2008-10-8 22:04 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-10-8 22:29 | 显示全部楼层

回复 楼主 impu 的帖子

看看这个帖子里面有没有你要的
http://forum.vibunion.com/thread-23755-1-1.html
另外可以看看精华帖、置顶帖或是关于绘图技巧的帖子
 楼主| 发表于 2008-10-9 15:35 | 显示全部楼层
本帖最后由 牛小贱 于 2014-3-29 22:45 编辑

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

函数如下:
  1. function  new_fig_handle = shift_axis_to_origin( fig_handle )

  2. % 本函数目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
  3. % 2008.10.08 in pku
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. figure('Name','shift_axis_to_origin','NumberTitle','off')                         % Create a new figure
  6. % 拷贝图形到一个新的窗口
  7. new_fig_handle = copyobj( fig_handle , gcf );

  8. xL=xlim ;
  9. yL=ylim ;
  10.    
  11.     xt=get(gca,'xtick') ;
  12.     yt=get(gca,'ytick') ;
  13.     set(gca,'XTick',[],'XColor','w') ;
  14.     set(gca,'YTick',[],'YColor','w') ;
  15.    
  16.      % 把 x 和 y 坐标轴的两个方向各延长 10% (为了视觉上好看)
  17.   extend_x = ( xL(2)-xL(1) ) * 0.1 ;
  18.     extend_y = ( yL(2)-yL(1) ) * 0.1 ;
  19.     set(gca,'xlim', xL + [ -extend_x extend_x]) ;
  20.     set(gca,'ylim', yL + [ -extend_y extend_y]) ;
  21.    
  22.     pos = get(gca,'Position') ;
  23.     box off;
  24.    
  25.     x_shift = abs( yL(1)/(yL(2)-yL(1)) ) ;
  26.     y_shift = abs( xL(1)/(xL(2)-xL(1)) ) ;
  27.     temp_1 = axes( 'Position', pos + [ 0 , pos(4) * x_shift , 0 , - pos(4)* x_shift ] ) ;
  28.     xlim(xL) ;
  29.     box off ;
  30.     set(temp_1,'XTick',xt,'Color','None','YTick',[]) ;
  31.     set(temp_1,'YColor','w') ;
  32.    
  33.       
  34.     temp_2 = axes( 'Position', pos + [ pos(3) * y_shift , 0 , - pos(3)* y_shift , 0 ] ) ;
  35.     ylim(yL) ;
  36.     box off ;
  37.     set(temp_2,'YTick',yt,'Color','None','XTick',[]) ;
  38.     set(temp_2,'XColor','w') ;
  39.    
  40.     Base_pos = get(new_fig_handle,'Position') ;
  41.     arrow_pos_in_x_dircetion = Base_pos(2) - Base_pos(4) * yL(1)/(yL(2)-yL(1)) ;
  42.     arrow_pos_in_y_dircetion = Base_pos(1) - Base_pos(3) *xL(1)/(xL(2)-xL(1)) ;
  43.    
  44.     annotation('arrow',[Base_pos(1) , Base_pos(1)+Base_pos(3)] , [arrow_pos_in_x_dircetion , arrow_pos_in_x_dircetion ] , 'Color','k');
  45.     annotation('arrow',[arrow_pos_in_y_dircetion , arrow_pos_in_y_dircetion ] , [Base_pos(2) , Base_pos(2)+Base_pos(4)] , 'Color','k');

  46.    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码
下面是一个例子:
  1. % 本程序目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
  2. % 2008.10.08
  3. %

  4. clc;clear;close all;
  5. t=linspace(-2,8,100);
  6. a1=axes;
  7. plot(t,cos(t));

  8. % xt=get(gca,'xtick');
  9. % set(gca,'XTick',[],'XColor','w');
  10. % xL=xlim;
  11. % p=get(gca,'Position');
  12. % box off;
  13. % a2=axes('Position',p+[0,p(4)/2,0,-p(4)/2]);
  14. % xlim(xL);box off;
  15. % set(gca,'XTick',xt,'Color','None','YTick',[]);

  16. new_fig_handle = shift_axis_to_origin( gca ) ;

  17.    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码
此例子的实现效果如下两个图所示:

1.jpg
2.jpg

点评

赞成: 5.0
赞成: 5
  发表于 2014-3-29 22:44

评分

3

查看全部评分

发表于 2008-10-10 13:45 | 显示全部楼层

回复 板凳 impu 的帖子

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

点评

赞成: 3.0
赞成: 3
  发表于 2014-3-29 22:46
 楼主| 发表于 2008-10-10 19:35 | 显示全部楼层
本帖最后由 牛小贱 于 2014-3-29 22:48 编辑

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

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

函数如下:
  1. function  new_fig_handle = shift_axis_to_origin( fig_handle )

  2. % 本函数目的是把 matlab 做的图坐标轴移到图形的中间部分去(与数学的做图习惯一致)
  3. % 2008.10.10 in pku
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. figure('Name','shift_axis_to_origin','NumberTitle','off')                         % Create a new figure
  6. % 拷贝图形到一个新的窗口
  7. new_fig_handle = copyobj( fig_handle , gcf );

  8. xL=xlim ;
  9. yL=ylim ;
  10.    
  11.     xt=get(gca,'xtick') ;
  12.     yt=get(gca,'ytick') ;
  13.     set(gca,'XTick',[],'XColor','w') ;
  14.     set(gca,'YTick',[],'YColor','w') ;
  15.    
  16.      % 把 x 和 y 坐标轴的两个方向各延长 10% (为了视觉上好看)
  17.     extend_x = ( xL(2)-xL(1) ) * 0.1 ;
  18.     extend_y = ( yL(2)-yL(1) ) * 0.1 ;
  19.     xxL = xL + [ -extend_x extend_x] ;
  20.     yyL = yL + [ -extend_y extend_y] ;
  21.     set(gca,'xlim', xxL) ;
  22.     set(gca,'ylim', yyL) ;
  23.    
  24.     pos = get(gca,'Position') ;
  25.     box off;
  26.    
  27.     x_shift = abs( yyL(1)/(yyL(2)-yyL(1)) ) ;
  28.     y_shift = abs( xxL(1)/(xxL(2)-xxL(1)) ) ;
  29.    
  30.     temp_1 = axes( 'Position', pos + [ 0 , pos(4) * x_shift , 0 , - pos(4)* x_shift*0.99999 ] ) ;
  31.     xlim(xxL) ;
  32.     box off ;
  33.     set(temp_1,'XTick',xt,'Color','None','YTick',[]) ;
  34.     set(temp_1,'YColor','w') ;
  35.    
  36.       
  37.     temp_2 = axes( 'Position', pos + [ pos(3) * y_shift , 0 , -pos(3)* y_shift*0.99999 , 0 ] ) ;
  38.     ylim(yyL) ;
  39.     box off ;
  40.     set(temp_2,'YTick',yt,'Color','None','XTick',[]) ;
  41.     set(temp_2,'XColor','w') ;
  42.    
  43.     Base_pos = get(new_fig_handle,'Position') ;
  44.     arrow_pos_in_x_dircetion = Base_pos(2) - Base_pos(4) * yyL(1)/(yyL(2)-yyL(1)) ;
  45.     arrow_pos_in_y_dircetion = Base_pos(1) - Base_pos(3) * xxL(1)/(xxL(2)-xxL(1)) ;
  46.    
  47.     annotation('arrow',[Base_pos(1) , Base_pos(1)+Base_pos(3)] , [arrow_pos_in_x_dircetion , arrow_pos_in_x_dircetion ] , 'Color','k');
  48.     annotation('arrow',[arrow_pos_in_y_dircetion , arrow_pos_in_y_dircetion ] , [Base_pos(2) , Base_pos(2)+Base_pos(4)] , 'Color','k');
  49.    

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

  3. clc;clear;close all;
  4. t=linspace(-2,8,100);
  5. a1=axes;
  6. plot(t,cos(t));

  7. new_fig_handle = shift_axis_to_origin( gca ) ;

  8. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码
此例子的实现效果如下两个图所示:

1.jpg
2.jpg

点评

赞成: 4.0
赞成: 4
不错!!  发表于 2014-4-22 20:32

评分

1

查看全部评分

发表于 2008-10-10 20:00 | 显示全部楼层

回复 5楼 impu 的帖子

强,不是一般的强!
发表于 2008-11-24 21:22 | 显示全部楼层
很有帮助,谢谢
发表于 2010-10-11 22:24 | 显示全部楼层
暴强啊,这个必须学习了
发表于 2010-10-14 18:49 | 显示全部楼层
好厉害,学习了~
发表于 2011-3-27 14:41 | 显示全部楼层
怎么用啊,哥们?
发表于 2011-3-27 16:43 | 显示全部楼层
回复 10 # 流水振动 的帖子

将5F的程序存在路径/目录下, 再用5F的例子!
发表于 2011-5-12 11:33 | 显示全部楼层
发表于 2011-7-22 22:03 | 显示全部楼层
大神啊,膜拜中。。谢过。。
发表于 2012-3-29 13:10 | 显示全部楼层
刚使用过,非常感谢!
发表于 2012-4-21 16:25 | 显示全部楼层
油瓶在手 低头猛走 鼠标一抖 一分到手

点评

反对: 3.0
反对: 3
灌水??  发表于 2012-4-22 01:31
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-11 03:34 , Processed in 0.080174 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表