[我分享] MATLAB画图,实现坐标轴原点/交点在图中心

[复制链接]
math 发表于 2012-8-9 01:32:34
看到有些会员需要,同时MATLAB Central也有这样的程序,所以分享一下。

以前我给大家演示hysteresis modelling的时候,也曾经使用过其他方法来实现:



程序下载地址:http://www.mathworks.com/matlabcentral/fileexchange/10473

17 条回复


yinhefeng 发表于 2012-8-9 09:46:29
多谢math分享~

天涯海角1065 发表于 2012-11-15 09:38:25
程序的网址打不开了。。。能不能直接贴过来?急用,谢谢哈

kyu16866 发表于 2013-3-7 01:18:12
对某些数据还是有问题,这个函数还是的修改

only8810205028 发表于 2013-7-24 17:01:10
本帖最后由 深蓝孩童 于 2017-1-14 20:50 编辑

某位PKU前辈的工作,很赞。移动坐标轴就先隐藏之前的坐标轴,再用axis('position')属性重新生成新轴,很巧妙。

  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. xt=get(gca,'xtick') ;
  11. yt=get(gca,'ytick') ;
  12. set(gca,'XTick',[],'XColor','w') ;
  13. set(gca,'YTick',[],'YColor','w') ;
  14. % 把 x 和 y 坐标轴的两个方向各延长 10% (为了视觉上好看)
  15. extend_x = ( xL(2)-xL(1) ) * 0.1 ;
  16. extend_y = ( yL(2)-yL(1) ) * 0.1 ;
  17. xxL = xL + [ -extend_x extend_x] ;
  18. yyL = yL + [ -extend_y extend_y] ;
  19. set(gca,'xlim', xxL) ;
  20. set(gca,'ylim', yyL) ;
  21. pos = get(gca,'Position') ;
  22. box off;
  23. x_shift = abs( yyL(1)/(yyL(2)-yyL(1)) ) ;
  24. y_shift = abs( xxL(1)/(xxL(2)-xxL(1)) ) ;
  25. temp_1 = axes( 'Position', pos + [ 0 , pos(4) * x_shift , 0 , - pos(4)* x_shift*0.99999 ] ) ;
  26. xlim(xxL) ;
  27. box off ;
  28. set(temp_1,'XTick',xt,'Color','None','YTick',[]) ;
  29. set(temp_1,'YColor','w') ;
  30. temp_2 = axes( 'Position', pos + [ pos(3) * y_shift , 0 , -pos(3)* y_shift*0.99999 , 0 ] ) ;
  31. ylim(yyL) ;
  32. box off ;
  33. set(temp_2,'YTick',yt,'Color','None','XTick',[]) ;
  34. set(temp_2,'XColor','w') ;
  35. Base_pos = get(new_fig_handle,'Position') ;
  36. arrow_pos_in_x_dircetion = Base_pos(2) - Base_pos(4) * yyL(1)/(yyL(2)-yyL(1)) ;
  37. arrow_pos_in_y_dircetion = Base_pos(1) - Base_pos(3) * xxL(1)/(xxL(2)-xxL(1)) ;
  38. annotation('arrow',[Base_pos(1) , Base_pos(1)+Base_pos(3)] , [arrow_pos_in_x_dircetion , arrow_pos_in_x_dircetion ] , 'Color','k');
  39. annotation('arrow',[arrow_pos_in_y_dircetion , arrow_pos_in_y_dircetion ] , [Base_pos(2) , Base_pos(2)+Base_pos(4)] , 'Color','k');
  40. end
复制代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
下面是一个例子:

  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 ) ;
复制代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
此例子的实现效果如下两个图所示:


2.png
1.png

F_YTK 发表于 2013-8-17 15:44:17
请问可以在实时捕获的图像中实现吗?

space_2012 发表于 2014-6-11 12:41:57
学习学习。:)

leosirius 发表于 2014-12-10 21:32:37
简单,见效!

zhaomenghuan 发表于 2015-1-31 12:13:38
太方便了,真的很实用

5141314 发表于 2015-3-10 10:54:38
学习了,感觉好有用;P;P

zzjo 发表于 2015-11-12 16:21:46
only8810205028 发表于 2013-7-24 17:01
某位PKU前辈的工作,很赞。移动坐标轴就先隐藏之前的坐标轴,再用axis('position')属性重新生成新轴,很巧 ...

这个更详细一些,更完善一些,谢谢分享

yuanshaoqing 发表于 2016-1-25 17:27:31
5141314 发表于 2015-3-10 10:54
学习了,感觉好有用

拜托能不能讲解一下怎么用啊 我是小白 实在是看不懂 谢谢谢谢

antonyqkj 发表于 2016-4-7 19:35:37
only8810205028 发表于 2013-7-24 17:01
某位PKU前辈的工作,很赞。移动坐标轴就先隐藏之前的坐标轴,再用axis('position')属性重新生成新轴,很巧 ...

然而我试了并没有办法生成grid on 画上网格标尺

antonyqkj 发表于 2016-4-7 20:07:10
怎么在平移坐标之后加grid on啊  平移后网格都没有了

xiaoliguang 发表于 2016-11-2 10:43:03
Matlab2016b已经完美解决这个问题了,只需要将xaxislocation设为origin,同理设置y轴,坐标就可以回到坐标原点

xiashaoyan 发表于 2017-4-2 14:47:20
老师,有画三维图,把坐标轴放在中间的设置程序吗?

nothingsyh 发表于 2017-6-25 16:51:11
这个之后怎么加图例呢?而且我坐标轴添标签的时候只有y轴的可以?

huangyg123 发表于 2018-11-7 17:32:23
only8810205028 发表于 2013-7-24 17:01
某位PKU前辈的工作,很赞。移动坐标轴就先隐藏之前的坐标轴,再用axis('position')属性重新生成新轴,很巧 ...

真的是太棒了,感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表