如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」~

大家好,欢迎来到IT知识分享网。

极坐标堆叠图也是风玫瑰图的常用形式,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();  % 绘图

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

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

角度范围

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

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

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

调节到 [ 0 , π ] [0,\pi] [0,π]:

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

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

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

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

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

常用函数:改变样式

基本上的线条颜色,线条透明度,面透明度,线条粗细等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])

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

常用函数:设置下界

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

wr.setLConf(4)

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

常用函数:修改颜色

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

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

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

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

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

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

添加图例

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

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

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」


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;

如何使用MATLAB绘制极坐标堆叠柱状图「终于解决」

示例二

% 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绘制极坐标堆叠柱状图「终于解决」


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24582.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信