• 如何使用MATLAB绘制极坐标堆叠柱状图


    极坐标堆叠图也是风玫瑰图的常用形式,MATLABbar绘制的条形图可以绘制成堆叠形式,但是并没有一个自带函数可以绘制极坐标堆叠图,而且极坐标下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();  % 绘图
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    角度范围

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

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

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

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

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

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

    常用函数:改变样式

    基本上的线条颜色,线条透明度,面透明度,线条粗细等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])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    常用函数:设置下界

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

    wr.setLConf(4)
    
    • 1

    常用函数:修改颜色

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

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

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

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

    添加图例

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

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


    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    示例二

    % 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30


  • 相关阅读:
    日志收集分析平台
    TinyML:是否是FPGA在人工智能方面的最佳应用?
    STM32单片机LCD1602智能药盒定时药盒开盒检测拿起检测
    【OS】I/O多路复用的一点理解
    Dart(3)-常量
    Flutter TapGestureRecognizer 如何工作
    CS224W2.2——传统基于特征的方法(边层级特征)
    【车间调度】基于改进鲸鱼算法解决柔性车间调度多目标问题附matlab代码
    tomcat的优化
    Git 分支管理策略汇总
  • 原文地址:https://blog.csdn.net/slandarer/article/details/126088022