极坐标堆叠图也是风玫瑰图的常用形式,MATLAB的bar
绘制的条形图可以绘制成堆叠形式,但是并没有一个自带函数可以绘制极坐标堆叠图,而且极坐标下fill
函数也不能用,于是就考虑将数据进行累加,并多次调用polarhistogram
函数进行绘图,我将这个过程变为了一个方便调用的类。
以下先说明这个类该咋用,之后再给出类的完整代码:
part1: 函数介绍
基本使用
h的每一行代表要绘制一层柱状图的数据,这里要绘制三层的堆叠柱状图:
- h1=randi([8,18],[1,35])+rand([1,35]);
- h2=randi([2,8],[1,35])+rand([1,35]);
- h3=randi([0,3],[1,35])+rand([1,35]);
- h=[h1;h2;h3];
-
- wr=windrose(h);% 构造堆叠图类
- wr=wr.draw(); % 绘图

其中wr=windrose(h)
是构造类的过程,第一个输入可以是高度矩阵,也可以是当前的极坐标区域,绘制的角度范围可以省略。
角度范围
构造函数的角度范围可以省略,默认范围为[0,2π],以下两种写法是等同的:
- wr=windrose(h)
- wr=wr.draw()
- wr=windrose(h,[0,2*pi])
- wr=wr.draw()

调节到 [0,π]:
- wr=windrose(h,[0,pi])
- wr=wr.draw()

**不均匀角度:**比数据长度多1的角度序列,角度值要求[0,2π]范围:
- wr=windrose(h,[0:5:30,31:1:59]./59.*2.*pi);
- wr=wr.draw()

常用函数:改变样式
基本上的线条颜色,线条透明度,面透明度,线条粗细等patch
对象具有的一系列属性,均可以依靠此setStyle
函数设置:
线条颜色: EdgeColor
线条透明度: EdgeAlpha
面透明度: FaceAlpha
线条粗细:LineWidth
- % 随机数据生成并拼成矩阵
- h1=randi([8,18],[1,35])+rand([1,35]);
- h2=randi([2,8],[1,35])+rand([1,35]);
- h3=randi([0,3],[1,35])+rand([1,35]);
- h=[h1;h2;h3];
-
- wr=windrose(h);% 构造堆叠图类
- wr=wr.draw(); % 绘图
-
- % 图像属性设置
- wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])

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

常用函数:修改颜色
修改一个颜色:(例)修改第二层的颜色:
- wr.setColor([.1,.8,.1],2)

修改多个颜色:(例)修改第一、三层的颜色:
- wr.setColor([0,.2,0;0 0 .2],[1,3])

添加图例
请使用返回对象的Children
属性添加图例:
- % 添加图例
- lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
- lgd.Location='best';

part2: 完整类函数代码
- classdef windrose
- % @author : slandarer
- % 公众号 : slandarer随笔
- %
- % 使用实例:
- % =========================================================================
- % % 随机数据生成并拼成矩阵
- % h1=randi([8,18],[1,35])+rand([1,35]);
- % h2=randi([2,8],[1,35])+rand([1,35]);
- % h3=randi([0,3],[1,35])+rand([1,35]);
- % h=[h1;h2;h3];
- %
- % wr=windrose(h);% 等同于 wr=windrose(h,[0,2*pi]);
- % % wr=windrose(h,[0:5:30,31:1:59]./59.*2.*pi);
- % wr=wr.draw();
- %
- % wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])
- % wr.setLConf(4)
- %
- % % 将第二层变成绿
- % % wr.setColor([.1,.8,.1],2)
- % % 将第一第二层变成黑色
- % % wr.setColor([0,.2,0;0 0 .2],[1,3])
- %
- % % 添加图例
- % lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
- % lgd.Location='best';
-
- properties
- HSet % mxn 大小数据,m组数据,每组n个柱
- ThetaSet % 1x(n+1) 分隔角度
- histType % 可初始化属性
-
- LConfHdl % 下边界图形对象
-
- Parent
- Children
- end
-
- methods
- function obj=windrose(varargin)
- % 变量数据读取及传入
- if isa(varargin{1},'matlab.graphics.axis.PolarAxes')
- ax=varargin{1};varargin(1)=[];
- else
- ax=polaraxes(gcf);
- end
- hold on
- obj.Parent=ax;
- obj.HSet=varargin{1};varargin(1)=[];
- if ~isempty(varargin)&&isfloat(varargin{1})
- if length(varargin{1})==2
- obj.ThetaSet=linspace(varargin{1}(1),varargin{1}(2),size(obj.HSet,2)+1);
- else
- obj.ThetaSet=varargin{1};
- end
- varargin(1)=[];
- else
- obj.ThetaSet=linspace(0,2*pi,size(obj.HSet,2)+1);
- end
- obj.histType=varargin;
-
- end
- function obj=draw(obj) % 循环绘图
- tCoLorList=lines(size(obj.HSet,1));
- tHSet=cumsum(obj.HSet);
-
- for i=size(obj.HSet,1):-1:1
- obj.Children(i)=polarhistogram(obj.Parent,'BinEdges',...
- obj.ThetaSet,'BinCounts',tHSet(i,:),'FaceAlpha',1,'FaceColor',tCoLorList(i,:),obj.histType{:});
- end
- % -------------------------------------------------------------
- % 绘制下边界圆形
- obj.LConfHdl=polarhistogram(obj.Parent,'BinEdges',linspace(0,2*pi,101),...
- 'BinCounts',ones([1,100]),'FaceColor','none','FaceAlpha',1,'EdgeColor','none');
- end
- % =========================================================================
-
- function setStyle(obj,varargin) % 设置属性
- for i=1:length(obj.Children)
- set(obj.Children(i),varargin{:});
- end
- end
-
- function setLConf(obj,LConf)% 设置下边界
- if strcmp(LConf,'none')
- obj.LConfHdl.FaceColor='none';
- else
- obj.LConfHdl.FaceColor=obj.Parent.Color;
- obj.LConfHdl.BinCounts=ones([1,100]).*LConf;
- end
- end
-
- function setColor(obj,colorList,n)% 颜色
- k=1;
- for i=n
- set(obj.Children(i),'FaceColor',colorList(k,:));
- k=k+1;
- end
- end
- end
- end
part3: 两个使用示例
示例一
- % windrose demo 1
-
- % 随机数据生成并拼成矩阵
- h1=randi([8,18],[1,35])+rand([1,35]);
- h2=randi([2,8],[1,35])+rand([1,35]);
- h3=randi([0,3],[1,35])+rand([1,35]);
- h=[h1;h2;h3];
-
- wr=windrose(h);
- wr=wr.draw();
-
- % 图像属性设置
- wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])
-
- % 添加下界限
- wr.setLConf(4)
-
- % 将第二层变成绿
- % wr.setColor([.1,.8,.1],2)
- % 将第一第二层变成黑色
- % wr.setColor([0,.2,0;0 0 .2],[1,3])
-
- % 添加图例
- lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
- lgd.Location='best';
-
- % 坐标区域修饰
- ax=gca;
- ax.LineWidth=1.5;
- ax.GridLineStyle='-.';
- ax.FontName='Cambria';
- ax.FontSize=13;

示例二
- % windrose demo 2
-
- % 随机数据生成并拼成矩阵
- h1=randi([8,18],[1,35])+rand([1,35]);
- h2=randi([2,8],[1,35])+rand([1,35]);
- h3=randi([0,3],[1,35])+rand([1,35]);
- h=[h1;h2;h3];
-
- % 生成极坐标区域,并更改背景颜色
- ax=polaraxes(gcf);
- ax.Color=[60,60,60]./255;
- ax.GridColor=[212,217,217]./255;
- ax.LineWidth=1.5;
- ax.GridLineStyle='-.';
- ax.FontName='Cambria';
- ax.FontSize=13;
-
- % 生成风玫瑰图
- wr=windrose(ax,h);
- wr=wr.draw();
-
- % 属性修饰
- wr.setStyle('LineWidth',1.2,'FaceAlpha',1,'EdgeColor',[.2,.2,.2])
- wr.setLConf(4)
-
- % 修改颜色
- colorList=[194,196,191;
- 212,217,217;
- 110,135,117]./255;
- wr.setColor(colorList,1:3)

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