目录part1: 函数介绍基本使用角度范围常用函数:改变样式常用函数:设置下界常用函数:修改颜色添加图例part2: 完整类函数代码part3: 两个使用示例示例一示例二极坐标堆叠图也是风玫瑰图的常用形式,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.setLConf(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 endpart3: 两个使用示例示例一% 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堆叠柱状图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:利用Matlab实现图像亮度分布统计图基于Matlab绘制小提琴图的示例代码基于Matlab实现山脊图的绘制基于Matlab实现离散系统分岔图的绘制详解Matlab如何绘制桑基图如何利用Matlab绘制出好看的火山图详解Matlab如何绘制小提琴图
