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

MATLAB技术论坛

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

[基础] Matlab的Bar图中Bar颜色灵活设置的一点总结

  [复制链接]
发表于 2012-4-13 12:14:37 | 显示全部楼层 |阅读模式
“道生一,一生二,二生三,三生万物,万物负阴而抱阳,冲气以为和”——《道德经》四十二章
有些东西其实没有你我想象的那么困难!

main.jpg

% 有时候可能需要灵活展示Bar图中Bar颜色,比如收益率展示中我们希望大于0的为红色,小于0的为蓝色(或绿色)
% 类似上图的该如何实现
  1. %% 类似实现方式如下
  2. Data = [1,-2,3,1,-1,-2];
  3. DataP = Data;
  4. DataN = Data;
  5. DataP(Data < 0) = 0;
  6. DataN(Data > 0) = 0;
  7. figure;
  8. bar(DataP,'r','EdgeColor','r');
  9. hold on;
  10. bar(DataN,'b','EdgeColor','b');
复制代码
1.jpg
% 通过如上方式通过设置关注调整不同的值的范围,来控制Bar颜色
% 比如值小于-1的bar设为蓝色,值为-1到0的bar设为黑色,值大于0的bar设为红色
% 实现如下,如下实现方式可以进行相关扩展
  1. Data = [1,-2,3,1,-1,-2,-0.9];
  2. DataT = [Data;Data;Data];
  3. threshold = [-1,0,1];
  4. ColorSer = {'b','k','r'};
  5. figure;
  6. for i = 1:size(DataT,1)
  7.     if i == 1
  8.         DataT(i,Data>threshold(i)) = 0;
  9.     end
  10.     if i == size(DataT,1)
  11.         DataT(i,Data<threshold(i)) = 0;
  12.     end
  13.     if i ~= size(DataT,1) && i>1
  14.         DataT(i,Data<=threshold(i-1)) = 0;
  15.         DataT(i,Data>=threshold(i)) = 0;
  16.     end

  17.     bar(DataT(i,:),ColorSer{i},'EdgeColor',ColorSer{i});
  18.     hold on;
  19. end
复制代码
2.jpg

% 有没有其它方式实现每一个Bar的颜色的灵活设置呢?
% 答案是肯定的,可以通过调整 FaceVertexCData 属性来调整颜色
% 实现如下
  1. Data = [1,-2,3,1];
  2. figure;
  3. b_h = bar(Data);
  4. ch = get(b_h,'children');
  5. set(ch,'FaceVertexCData',[0 0 1;0 1 1;1 1 1;1 0 1])
复制代码
3.jpg


整体脚本代码:
  1. %% BarColorSet
  2. % MATLAB的Bar图中Bar颜色灵活设置的一点总结
  3. % by LiYang
  4. % Email:farutoliyang@gmail.com
  5. % 2012/4/13
  6. % Matlab Version : Matlab R2011b
  7. %% A Little Clean Work
  8. tic;
  9. clear;
  10. clc;
  11. close all;
  12. format compact;
  13. %% 《道德经》四十二章
  14. % “道生一,一生二,二生三,三生万物,万物负阴而抱阳,冲气以为和”——《道德经》四十二章
  15. % 有些东西其实没有你我想象的那么困难!
  16. %% Bar图中Bar颜色灵活设置的一点总结
  17. % 有时候可能需要灵活展示Bar图中Bar颜色,比如收益率展示中我们希望大于0的为红色,小于0的为蓝色(或绿色)
  18. % 类似上图的该如何实现
  19. %% 类似实现方式如下
  20. Data = [1,-2,3,1,-1,-2];
  21. DataP = Data;
  22. DataN = Data;
  23. DataP(Data < 0) = 0;
  24. DataN(Data > 0) = 0;
  25. figure;
  26. bar(DataP,'r','EdgeColor','r');
  27. hold on;
  28. bar(DataN,'b','EdgeColor','b');
  29. %%  
  30. % 通过如上方式通过设置关注调整不同的值的范围,来控制Bar颜色
  31. % 比如值小于-1的bar设为蓝色,值为-1到0的bar设为黑色,值大于0的bar设为红色
  32. % 实现如下,如下实现方式可以进行相关扩展
  33. Data = [1,-2,3,1,-1,-2,-0.9];
  34. DataT = [Data;Data;Data];
  35. threshold = [-1,0,1];
  36. ColorSer = {'b','k','r'};
  37. figure;
  38. for i = 1:size(DataT,1)
  39.     if i == 1
  40.         DataT(i,Data>threshold(i)) = 0;
  41.     end
  42.     if i == size(DataT,1)
  43.         DataT(i,Data<threshold(i)) = 0;
  44.     end
  45.     if i ~= size(DataT,1) && i>1
  46.         DataT(i,Data<=threshold(i-1)) = 0;
  47.         DataT(i,Data>=threshold(i)) = 0;
  48.     end

  49.     bar(DataT(i,:),ColorSer{i},'EdgeColor',ColorSer{i});
  50.     hold on;
  51. end
  52. %%
  53. % 有没有其它方式实现每一个Bar的颜色的灵活设置呢?
  54. % 答案是肯定的,可以通过调整 FaceVertexCData 属性来调整颜色
  55. % 实现如下
  56. Data = [1,-2,3,1];
  57. figure;
  58. b_h = bar(Data);
  59. ch = get(b_h,'children');
  60. set(ch,'FaceVertexCData',[0 0 1;0 1 1;1 1 1;1 0 1])

  61. %% Record Time
  62. toc;
复制代码
发表于 2015-11-2 12:55:27 | 显示全部楼层
这个很有用
不过最后一点在2014b不能使用了啊
回复 支持 反对

使用道具 举报

发表于 2017-2-11 02:27:36 | 显示全部楼层
很不错的技巧,对于初学者来说感觉真的是超赞
回复 支持 反对

使用道具 举报

发表于 2017-10-17 12:05:46 | 显示全部楼层
非常有用,不要百度,要搜索论坛啊
回复 支持 反对

使用道具 举报

发表于 2012-4-13 12:27:43 | 显示全部楼层
好东东,学习学习
发表于 2012-4-14 11:16:52 | 显示全部楼层
发表于 2012-4-14 15:20:36 | 显示全部楼层
huangzilai,如果您要查看本帖隐藏内容请回复
发表于 2012-4-14 15:23:24 | 显示全部楼层
代码中加
%% 《道德经》四十二章
罕见{:soso_e128:}
发表于 2012-4-16 09:39:29 | 显示全部楼层
嗯,还是可以的
 楼主| 发表于 2012-4-16 20:41:03 | 显示全部楼层
huangzilai 发表于 2012-4-14 15:23
代码中加
%% 《道德经》四十二章
罕见

O(∩_∩)O
发表于 2012-4-16 21:52:43 | 显示全部楼层
嗯,不错,学习一下
发表于 2012-4-17 00:46:32 | 显示全部楼层
哈哈哈哈哈哈
发表于 2012-4-17 08:36:30 | 显示全部楼层
楼主的总结很经典,花了不少心思吧!
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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

GMT+8, 2020-8-6 07:06 , Processed in 0.060458 second(s), 13 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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