经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » MATLAB » 查看文章
Matlab实现极坐标堆叠柱状图的绘制
来源:jb51  时间:2022/8/1 17:09:33  对本文有异议

极坐标堆叠图也是风玫瑰图的常用形式,MATLAB的bar绘制的条形图可以绘制成堆叠形式,但是并没有一个自带函数可以绘制极坐标堆叠图,而且极坐标下fill函数也不能用,于是就考虑将数据进行累加,并多次调用polarhistogram函数进行绘图,我将这个过程变为了一个方便调用的类。

以下先说明这个类该咋用,之后再给出类的完整代码:

part1: 函数介绍

基本使用

h的每一行代表要绘制一层柱状图的数据,这里要绘制三层的堆叠柱状图:

  1. h1=randi([8,18],[1,35])+rand([1,35]);
  2. h2=randi([2,8],[1,35])+rand([1,35]);
  3. h3=randi([0,3],[1,35])+rand([1,35]);
  4. h=[h1;h2;h3];
  5.  
  6. wr=windrose(h);% 构造堆叠图类
  7. wr=wr.draw(); % 绘图

其中wr=windrose(h)是构造类的过程,第一个输入可以是高度矩阵,也可以是当前的极坐标区域,绘制的角度范围可以省略。

角度范围

构造函数的角度范围可以省略,默认范围为[0,2π],以下两种写法是等同的:

  1. wr=windrose(h)
  2. wr=wr.draw()
  1. wr=windrose(h,[0,2*pi])
  2. wr=wr.draw()

调节到 [0,π]:

  1. wr=windrose(h,[0,pi])
  2. wr=wr.draw()

**不均匀角度:**比数据长度多1的角度序列,角度值要求[0,2π]范围:

  1. wr=windrose(h,[0:5:30,31:1:59]./59.*2.*pi);
  2. wr=wr.draw()

常用函数:改变样式

基本上的线条颜色,线条透明度,面透明度,线条粗细等patch对象具有的一系列属性,均可以依靠此setStyle函数设置:

线条颜色: EdgeColor

线条透明度: EdgeAlpha

面透明度: FaceAlpha

线条粗细:LineWidth

  1. % 随机数据生成并拼成矩阵
  2. h1=randi([8,18],[1,35])+rand([1,35]);
  3. h2=randi([2,8],[1,35])+rand([1,35]);
  4. h3=randi([0,3],[1,35])+rand([1,35]);
  5. h=[h1;h2;h3];
  6.  
  7. wr=windrose(h);% 构造堆叠图类
  8. wr=wr.draw(); % 绘图
  9.  
  10. % 图像属性设置
  11. wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])

常用函数:设置下界

就是添加一个圆形把中心区域密集的线条遮盖一下,例如想要设置下界限为4,可以再之前代码最后加入:

  1. wr.setLConf(4)

常用函数:修改颜色

修改一个颜色:(例)修改第二层的颜色:

  1. wr.setColor([.1,.8,.1],2)

修改多个颜色:(例)修改第一、三层的颜色:

  1. wr.setColor([0,.2,0;0 0 .2],[1,3])

添加图例

请使用返回对象的Children属性添加图例:

  1. % 添加图例
  2. lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
  3. lgd.Location='best';

part2: 完整类函数代码

  1. classdef windrose
  2. % @author : slandarer
  3. % 公众号 : slandarer随笔
  4. %
  5. % 使用实例:
  6. % =========================================================================
  7. % % 随机数据生成并拼成矩阵
  8. % h1=randi([8,18],[1,35])+rand([1,35]);
  9. % h2=randi([2,8],[1,35])+rand([1,35]);
  10. % h3=randi([0,3],[1,35])+rand([1,35]);
  11. % h=[h1;h2;h3];
  12. %
  13. % wr=windrose(h);% 等同于 wr=windrose(h,[0,2*pi]);
  14. % % wr=windrose(h,[0:5:30,31:1:59]./59.*2.*pi);
  15. % wr=wr.draw();
  16. %
  17. % wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])
  18. % wr.setLConf(4)
  19. %
  20. % % 将第二层变成绿
  21. % % wr.setColor([.1,.8,.1],2)
  22. % % 将第一第二层变成黑色
  23. % % wr.setColor([0,.2,0;0 0 .2],[1,3])
  24. %
  25. % % 添加图例
  26. % lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
  27. % lgd.Location='best';
  28.  
  29. properties
  30. HSet % mxn 大小数据,m组数据,每组n个柱
  31. ThetaSet % 1x(n+1) 分隔角度
  32. histType % 可初始化属性
  33.  
  34. LConfHdl % 下边界图形对象
  35.  
  36. Parent
  37. Children
  38. end
  39.  
  40. methods
  41. function obj=windrose(varargin)
  42. % 变量数据读取及传入
  43. if isa(varargin{1},'matlab.graphics.axis.PolarAxes')
  44. ax=varargin{1};varargin(1)=[];
  45. else
  46. ax=polaraxes(gcf);
  47. end
  48. hold on
  49. obj.Parent=ax;
  50. obj.HSet=varargin{1};varargin(1)=[];
  51. if ~isempty(varargin)&&isfloat(varargin{1})
  52. if length(varargin{1})==2
  53. obj.ThetaSet=linspace(varargin{1}(1),varargin{1}(2),size(obj.HSet,2)+1);
  54. else
  55. obj.ThetaSet=varargin{1};
  56. end
  57. varargin(1)=[];
  58. else
  59. obj.ThetaSet=linspace(0,2*pi,size(obj.HSet,2)+1);
  60. end
  61. obj.histType=varargin;
  62. end
  63. function obj=draw(obj) % 循环绘图
  64. tCoLorList=lines(size(obj.HSet,1));
  65. tHSet=cumsum(obj.HSet);
  66.  
  67. for i=size(obj.HSet,1):-1:1
  68. obj.Children(i)=polarhistogram(obj.Parent,'BinEdges',...
  69. obj.ThetaSet,'BinCounts',tHSet(i,:),'FaceAlpha',1,'FaceColor',tCoLorList(i,:),obj.histType{:});
  70. end
  71. % -------------------------------------------------------------
  72. % 绘制下边界圆形
  73. obj.LConfHdl=polarhistogram(obj.Parent,'BinEdges',linspace(0,2*pi,101),...
  74. 'BinCounts',ones([1,100]),'FaceColor','none','FaceAlpha',1,'EdgeColor','none');
  75. end
  76. % =========================================================================
  77.  
  78. function setStyle(obj,varargin) % 设置属性
  79. for i=1:length(obj.Children)
  80. set(obj.Children(i),varargin{:});
  81. end
  82. end
  83.  
  84. function setLConf(obj,LConf)% 设置下边界
  85. if strcmp(LConf,'none')
  86. obj.LConfHdl.FaceColor='none';
  87. else
  88. obj.LConfHdl.FaceColor=obj.Parent.Color;
  89. obj.LConfHdl.BinCounts=ones([1,100]).*LConf;
  90. end
  91. end
  92.  
  93. function setColor(obj,colorList,n)% 颜色
  94. k=1;
  95. for i=n
  96. set(obj.Children(i),'FaceColor',colorList(k,:));
  97. k=k+1;
  98. end
  99. end
  100. end
  101. end

part3: 两个使用示例

示例一

  1. % windrose demo 1
  2.  
  3. % 随机数据生成并拼成矩阵
  4. h1=randi([8,18],[1,35])+rand([1,35]);
  5. h2=randi([2,8],[1,35])+rand([1,35]);
  6. h3=randi([0,3],[1,35])+rand([1,35]);
  7. h=[h1;h2;h3];
  8.  
  9. wr=windrose(h);
  10. wr=wr.draw();
  11.  
  12. % 图像属性设置
  13. wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])
  14.  
  15. % 添加下界限
  16. wr.setLConf(4)
  17.  
  18. % 将第二层变成绿
  19. % wr.setColor([.1,.8,.1],2)
  20. % 将第一第二层变成黑色
  21. % wr.setColor([0,.2,0;0 0 .2],[1,3])
  22.  
  23. % 添加图例
  24. lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
  25. lgd.Location='best';
  26.  
  27. % 坐标区域修饰
  28. ax=gca;
  29. ax.LineWidth=1.5;
  30. ax.GridLineStyle='-.';
  31. ax.FontName='Cambria';
  32. ax.FontSize=13;

示例二

  1. % windrose demo 2
  2.  
  3. % 随机数据生成并拼成矩阵
  4. h1=randi([8,18],[1,35])+rand([1,35]);
  5. h2=randi([2,8],[1,35])+rand([1,35]);
  6. h3=randi([0,3],[1,35])+rand([1,35]);
  7. h=[h1;h2;h3];
  8.  
  9. % 生成极坐标区域,并更改背景颜色
  10. ax=polaraxes(gcf);
  11. ax.Color=[60,60,60]./255;
  12. ax.GridColor=[212,217,217]./255;
  13. ax.LineWidth=1.5;
  14. ax.GridLineStyle='-.';
  15. ax.FontName='Cambria';
  16. ax.FontSize=13;
  17.  
  18. % 生成风玫瑰图
  19. wr=windrose(ax,h);
  20. wr=wr.draw();
  21.  
  22. % 属性修饰
  23. wr.setStyle('LineWidth',1.2,'FaceAlpha',1,'EdgeColor',[.2,.2,.2])
  24. wr.setLConf(4)
  25.  
  26. % 修改颜色
  27. colorList=[194,196,191;
  28. 212,217,217;
  29. 110,135,117]./255;
  30. wr.setColor(colorList,1:3)

到此这篇关于Matlab实现极坐标堆叠柱状图的绘制的文章就介绍到这了,更多相关Matlab堆叠柱状图内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号