《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 27624|回复: 209
收起左侧

[基础] [原创]坐标轴刻度标签旋转升级版

    [复制链接]
发表于 2012-3-17 22:56:37 | 显示全部楼层 |阅读模式
在 谢老师 的
【原创】旋转坐标轴刻度标签http://www.matlabsky.com/thread-20361-1-1.html

基础上进行升级完善,给出更加自由的坐标轴刻度标签旋转:

1.支持上下左右四个坐标轴的刻度标签旋转
2.支持plotyy及其他所有画图函数返回的axes句柄的刻度标签旋转(谢老师的我尝试过除了plot以外其他的画图函数有的支持的不是很好)
3.增加刻度标签的对齐方式(left | center | right)

实现核心说白了就是 利用text命令来重新绘制刻度标签。

可能有人要问为什么要进行坐标轴刻度标签旋转?当你要进行坐标轴刻度标签的自由控制,你就知道这有多重要了。

实例展示:
1.jpg

实例代码:
  1. %% TickLabelRotate_Test
  2. % by LiYang
  3. % Email:farutoliyang@gmail.com
  4. % 2012/3/17
  5. % MATLAB Version : Matlab R2011b
  6. %% A Little Clean Work
  7. tic;
  8. clear;
  9. clc;
  10. close all;
  11. format compact;
  12. %% TickLabelRotate(AX_handle,tag,rot,HorizontalAlignment,UpDown)

  13. x = 1:3;
  14. y = [-1,0,1];
  15. ylabel = {'-1(小)';'0(中)';'1(大)'};
  16. xlabel = {'2008-01-01';'2009-01-01';'2010-01-01'};

  17. figure;
  18. % 下
  19. subplot(2,2,1);
  20. plot(x,y);
  21. set(gca,'XTickLabel',xlabel);
  22. set(gca,'YTickLabel',ylabel);
  23. set(gca,'XTick',x);
  24. set(gca,'YTick',y);
  25. TickLabelRotate(gca,'x',60,'right',1);

  26. % 上
  27. subplot(2,2,2);
  28. plot(x,y);
  29. set(gca,'XTickLabel',xlabel);
  30. set(gca,'YTickLabel',ylabel);
  31. set(gca,'XTick',x);
  32. set(gca,'YTick',y);
  33. set(gca,'XAxisLocation','Top');
  34. TickLabelRotate(gca,'x',30,'left',2);
  35. % 左
  36. subplot(2,2,3);
  37. plot(x,y);
  38. set(gca,'XTickLabel',xlabel);
  39. set(gca,'YTickLabel',ylabel);
  40. set(gca,'XTick',x);
  41. set(gca,'YTick',y);
  42. TickLabelRotate(gca,'x',60,'right',1);
  43. TickLabelRotate(gca,'y',30,'right',3);
  44. % 右
  45. subplot(2,2,4);
  46. plot(x,y);
  47. set(gca,'XTickLabel',xlabel);
  48. set(gca,'YTickLabel',ylabel);
  49. set(gca,'XTick',x);
  50. set(gca,'YTick',y);
  51. set(gca,'YAxisLocation','Right');
  52. TickLabelRotate(gca,'y',30,'left',4);

  53. %% Record Time
  54. toc;
复制代码
坐标轴刻度标签旋转升级版TickLabelRotate.m源代码。
  1. function TickLabelRotate(AX_handle,tag,rot,HorizontalAlignment,UpDown)
  2. % 坐标TickLabel旋转
  3. % by LiYang
  4. % Email:farutoliyang@gmail.com
  5. % 2012/3/17
  6. % Matlab Version : Matlab R2011b
  7. %%
  8. if nargin < 5
  9.     % 1 Down 2 Up 3 Left 4 Right
  10.     UpDown = 1;
  11. end
  12. if nargin < 4
  13.     HorizontalAlignment = 'right';
  14.     % left | center | right
  15. end
  16. if nargin < 3
  17.     rot = 60;
  18. end
  19. if nargin < 2
  20.     tag = 'x';
  21. end
  22. %%
  23. switch tag
  24.     case 'x'
  25.         str = get(AX_handle,'XTickLabel');
  26.         x = get(AX_handle,'XTick');
  27.         yl = ylim(AX_handle);
  28.         set(AX_handle,'XTickLabel',[]);
  29.         if UpDown == 1
  30.             y = zeros(size(x)) + yl(1) - range(yl)/80;      
  31.         end
  32.         if UpDown == 2
  33.             y = zeros(size(x)) + yl(end) + range(yl)/80;
  34.         end
  35.         
  36.         text(x,y,str,'rotation',rot,...
  37.             'Interpreter','none','HorizontalAlignment',HorizontalAlignment);
  38.     case 'y'
  39.         str = get(AX_handle,'YTickLabel');
  40.         y = get(AX_handle,'YTick');
  41.         xl = xlim(AX_handle);
  42.         set(AX_handle,'YTickLabel',[]);
  43.         if UpDown == 3
  44.             x = zeros(size(y)) + xl(1) - range(xl)/80;      
  45.         end
  46.         if UpDown == 4
  47.             x = zeros(size(y)) + xl(end) + range(xl)/80;
  48.         end
  49.         
  50.         text(x,y,str,'rotation',rot,...
  51.             'Interpreter','none','HorizontalAlignment',HorizontalAlignment);        
  52.         
  53. end
复制代码
当然无论是谢老师的版本(【原创】旋转坐标轴刻度标签http://www.matlabsky.com/thread-20361-1-1.html)还是我的版本,都有一个弊病,就是当你进行图形的局部放大或缩小的时候,已经进行旋转的刻度标签无法进行位置的动态调整和动态标签增加,这个其实也是可以进行完善的,但稍微有点麻烦。懒得弄了。
发表于 2017-2-11 02:32:41 | 显示全部楼层
虽然自己还是初学者,但是感觉很有帮助,谢谢您
回复 支持 反对

使用道具 举报

发表于 2017-5-5 16:09:30 | 显示全部楼层
正好需要用到这个命令,非常感谢
回复 支持 反对

使用道具 举报

发表于 2017-12-9 20:47:08 | 显示全部楼层
TickLabelRotate_Test好东西…
回复 支持 反对

使用道具 举报

发表于 2012-3-18 08:45:52 | 显示全部楼层
懒得弄了……哈哈!感谢分享!
发表于 2012-3-18 09:38:37 | 显示全部楼层
 楼主| 发表于 2012-3-18 09:43:18 | 显示全部楼层
bdoux 发表于 2012-3-18 08:45
懒得弄了……哈哈!感谢分享!

 楼主| 发表于 2012-3-18 09:43:31 | 显示全部楼层
pzfs1016 发表于 2012-3-18 09:38
这个给力,收藏之!

发表于 2012-3-22 10:18:11 | 显示全部楼层
这个不错,学习学习!
 楼主| 发表于 2012-3-22 10:58:30 | 显示全部楼层
我i撤 发表于 2012-3-22 10:18
这个不错,学习学习!

发表于 2012-3-27 17:07:17 | 显示全部楼层
有意思 学习了

评分

参与人数 1贡献 +1 收起 理由
东方明月1 + 1 星际迷航12 bbs.6699.tv/dz/59728/

查看全部评分

 楼主| 发表于 2012-3-27 17:09:12 | 显示全部楼层
Thomasli 发表于 2012-3-27 17:07
有意思 学习了

发表于 2012-3-27 18:44:42 | 显示全部楼层
好东西……
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-8-6 07:09 , Processed in 0.057799 second(s), 17 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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