Matlab实现绘制雷达图(蜘蛛图)

 更新时间:2022年09月22日 08:43:08   作者:slandarer  
这篇文章主要为大家详细介绍了如何利用Matlab实现雷达图(蜘蛛图)的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下

绘制效果

教程部分

基础绘制

数据为数值矩阵即可:

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X);
RC=RC.draw(); 

改变样式

PatchLine两种样式,通过设置Type属性设置样式:

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X,'Type','Patch');
RC=RC.draw(); 

添加修改标签添加图例

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X);
RC.PropName={'建模','实验','编程','总结','撰写','创新','摸鱼'};
RC.ClassName={'同门A','同门B','同门C','同门D'};
RC=RC.draw();
RC.legend();

R轴位置及其范围

范围改为[2,10],并绘制2,8,9,10四条刻度线:

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X);
RC.RLim=[2,10];
RC.RTick=[2,8:1:10];
RC=RC.draw();
RC.legend();

修改轴属性

使用:

  • setThetaTick
  • setRTick

设置轴属性,举个例子,theta轴变为淡红色,R轴变为淡蓝色:

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X);
RC=RC.draw();
RC.legend();

RC.setThetaTick('LineWidth',2,'Color',[.6,.6,.8]);
RC.setRTick('LineWidth',1.5,'Color',[.8,.6,.6]);

修改标签属性

使用:

  • setPropLabel
  • setRLabel

修改属性标签和R刻度标签:

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X);
RC=RC.draw();
RC.legend();

RC.setPropLabel('FontSize',20,'FontName','Cambria','Color',[0,0,.8])
RC.setRLabel('FontSize',15,'FontName','Cambria','Color',[.8,0,0])

修改圆形背景

使用setBkg函数修饰背景:

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X);
RC=RC.draw();
RC.legend();

RC.setBkg('FaceColor',[0,0,.1])
RC.setRLabel('Color','none')

修饰多边形

两种类型的多边形分别用Patch对象和Line对象绘制,修饰方式略有区别,不过都是使用setPatchN函数进行修饰,以下以修改颜色举例:

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X);
RC=RC.draw();
RC.legend();

colorList=[78 101 155;
          138 140 191;
          184 168 207;
          231 188 198;
          253 207 158;
          239 164 132;
          182 118 108]./255;
for n=1:RC.ClassNum
    RC.setPatchN(n,'Color',colorList(n,:),'MarkerFaceColor',colorList(n,:))
end

X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X,'Type','Patch');
RC=RC.draw();
RC.legend();

colorList=[78 101 155;
          138 140 191;
          184 168 207;
          231 188 198;
          253 207 158;
          239 164 132;
          182 118 108]./255;
for n=1:RC.ClassNum
    RC.setPatchN(n,'FaceColor',colorList(n,:),'EdgeColor',colorList(n,:))
end

工具函数完整代码

classdef radarChart
% @author : slandarer
% gzh  : slandarer随笔

    properties
        ax;arginList={'ClassName','PropName','Type'}
        XData;RTick=[];RLim=[];SepList=[1,1.2,1.5,2,2.5,3,4,5,6,8]
        Type='Line';
        PropNum;ClassNum
        ClassName={};
        PropName={};
        
        BC=[198,199,201;  38, 74, 96; 209, 80, 51; 241,174, 44; 12,13,15;
            102,194,165; 252,140, 98; 142,160,204; 231,138,195; 
            166,217, 83; 255,217, 48; 229,196,148; 179,179,179]./255;

        % 句柄
        ThetaTickHdl;RTickHdl;RLabelHdl;LgdHdl;PatchHdl;PropLabelHdl;BkgHdl
    end

    methods
        function obj=radarChart(varargin)
            if isa(varargin{1},'matlab.graphics.axis.Axes')
                obj.ax=varargin{1};varargin(1)=[];
            else
                obj.ax=gca;
            end
            % 获取版本信息
            tver=version('-release');
            verMatlab=str2double(tver(1:4))+(abs(tver(5))-abs('a'))/2;
            if verMatlab<2017
                hold on
            else
                hold(obj.ax,'on')
            end

            obj.XData=varargin{1};varargin(1)=[];
            obj.PropNum=size(obj.XData,2);
            obj.ClassNum=size(obj.XData,1);
            obj.RLim=[0,max(obj.XData,[],[1,2])];

            % 获取其他信息
            for i=1:2:(length(varargin)-1)
                tid=ismember(obj.arginList,varargin{i});
                if any(tid)
                obj.(obj.arginList{tid})=varargin{i+1};
                end
            end
            if isempty(obj.ClassName)
                for i=1:obj.ClassNum
                    obj.ClassName{i}=['class ',num2str(i)];
                end
            end
            if isempty(obj.PropName)
                for i=1:obj.PropNum
                    obj.PropName{i}=['prop ',num2str(i)];
                end
            end
            help radarChart
        end

        function obj=draw(obj)
            obj.ax.XLim=[-1,1];
            obj.ax.YLim=[-1,1];
            obj.ax.XTick=[];
            obj.ax.YTick=[];
            obj.ax.XColor='none';
            obj.ax.YColor='none';
            obj.ax.PlotBoxAspectRatio=[1,1,1];
            % 绘制背景圆形
            tt=linspace(0,2*pi,200);
            obj.BkgHdl=fill(cos(tt),sin(tt),[252,252,252]./255,'EdgeColor',[200,200,200]./255,'LineWidth',1);
            % 绘制Theta刻度线
            tn=linspace(0,2*pi,obj.PropNum+1);tn=tn(1:end-1);
            XTheta=[cos(tn);zeros([1,obj.PropNum]);nan([1,obj.PropNum])];
            YTheta=[sin(tn);zeros([1,obj.PropNum]);nan([1,obj.PropNum])];
            obj.ThetaTickHdl=plot(XTheta(:),YTheta(:),'Color',[200,200,200]./255,'LineWidth',1);
            % 绘制R刻度线
            if isempty(obj.RTick)
                dr=diff(obj.RLim);
                sepR=dr./3;
                multiE=ceil(log(sepR)/log(10));
                sepR=sepR.*10^(1-multiE);
                sepR=obj.SepList(find(sepR<obj.SepList,1)-1)./10^(1-multiE);

                sepNum=floor(dr./sepR);
                obj.RTick=obj.RLim(1)+(0:sepNum).*sepR;
                if obj.RTick(end)~=obj.RLim(2)
                    obj.RTick=[obj.RTick,obj.RLim];
                end
            end
            obj.RLim(obj.RLim<obj.RLim(1))=[];
            obj.RLim(obj.RLim>obj.RLim(2))=[];
            
            XR=cos(tt').*(obj.RTick-obj.RLim(1))./diff(obj.RLim);XR=[XR;nan([1,length(obj.RTick)])];
            YR=sin(tt').*(obj.RTick-obj.RLim(1))./diff(obj.RLim);YR=[YR;nan([1,length(obj.RTick)])];
            obj.RTickHdl=plot(XR(:),YR(:),'Color',[200,200,200]./255,'LineWidth',1.1,'LineStyle','--');

            % 绘制雷达图
            for i=1:size(obj.XData,1)
                XP=cos(tn).*(obj.XData(i,:)-obj.RLim(1))./diff(obj.RLim);
                YP=sin(tn).*(obj.XData(i,:)-obj.RLim(1))./diff(obj.RLim);
                switch obj.Type
                    case 'Line'
                        obj.PatchHdl(i)=plot([XP,XP(1)],[YP,YP(1)],...
                            'Color',obj.BC(mod(i-1,size(obj.BC,1))+1,:),'Marker','o',...
                            'LineWidth',1.8,'MarkerFaceColor',obj.BC(mod(i-1,size(obj.BC,1))+1,:));
                    case 'Patch'
                        obj.PatchHdl(i)=patch(XP,YP,obj.BC(mod(i-1,size(obj.BC,1))+1,:),...
                            'EdgeColor',obj.BC(mod(i-1,size(obj.BC,1))+1,:),'FaceAlpha',.2,...
                            'LineWidth',1.8);

                end
            end

            % 绘制R标签文本
            tnr=(tn(1)+tn(2))/2;
            for i=1:length(obj.RTick)
                obj.RLabelHdl(i)=text(cos(tnr).*(obj.RTick(i)-obj.RLim(1))./diff(obj.RLim),...
                                      sin(tnr).*(obj.RTick(i)-obj.RLim(1))./diff(obj.RLim),...
                                      sprintf('%.2f',obj.RTick(i)),'FontName','Arial','FontSize',11);
            end

            % 绘制属性标签
            for i=1:obj.PropNum
                obj.PropLabelHdl(i)=text(cos(tn(i)).*1.1,sin(tn(i)).*1.1,obj.PropName{i},...
                    'FontSize',12,'HorizontalAlignment','center');
            end

        end
% =========================================================================
        function obj=setBkg(obj,varargin)
            set(obj.BkgHdl,varargin{:})
        end

        % 绘制图例
        function obj=legend(obj)
            obj.LgdHdl=legend([obj.PatchHdl],obj.ClassName,'FontSize',12,'Location','best');
        end
        % 设置图例属性
        function obj=setLegend(obj,varargin)
            set(obj.LgdHdl,varargin{:})
        end

        % 设置标签
        function obj=setPropLabel(obj,varargin)
            for i=1:obj.PropNum
                set(obj.PropLabelHdl(i),varargin{:})
            end
        end
        function obj=setRLabel(obj,varargin)
            for i=1:length(obj.RLabelHdl)
                set(obj.RLabelHdl(i),varargin{:})
            end
        end

        % 设置轴
        function obj=setRTick(obj,varargin)
            set(obj.RTickHdl,varargin{:})
        end
        function obj=setThetaTick(obj,varargin)
            set(obj.ThetaTickHdl,varargin{:})
        end

        % 设置patch属性
        function obj=setPatchN(obj,N,varargin)
            set(obj.PatchHdl(N),varargin{:})
        end
    end
% @author : slandarer
% gzh  : slandarer随笔
end

以上就是Matlab实现绘制雷达图(蜘蛛图)的详细内容,更多关于Matlab雷达图的资料请关注脚本之家其它相关文章!

相关文章

  • vector,map,list,queue的区别详细解析

    vector,map,list,queue的区别详细解析

    如果我们需要随机访问一个容器则vector要比list好得多。如果我们已知要存储元素的个数则vector 又是一个比list好的选择。如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好
    2013-09-09
  • Qt控件之QDialog使用及技巧小结

    Qt控件之QDialog使用及技巧小结

    QDialog是Qt中的一个类,继承自QWidget类,用于创建对话框窗口,可以显示模态或非模态的对话框,本文就来介绍一下Qt控件之QDialog使用及技巧小结,感兴趣的可以了解一下
    2023-10-10
  • C语言二叉排序(搜索)树实例

    C语言二叉排序(搜索)树实例

    这篇文章主要为大家详细介绍了C语言二叉排序树实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • C语言利用EasyX绘制小企鹅表情包

    C语言利用EasyX绘制小企鹅表情包

    这篇文章主要为大家详细介绍了C语言如何利用EasyX绘图库实现绘制可爱的小企鹅表情包,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • 解析C++编程中的bad_cast异常

    解析C++编程中的bad_cast异常

    这篇文章主要介绍了C++编程中的bad_cast异常,bad_cast异常通常出现于表达式中类型转换错误时等一些场景,需要的朋友可以参考下
    2016-01-01
  • C++实现两个日期间差多少天的解决方法

    C++实现两个日期间差多少天的解决方法

    本篇文章用实例说明,在C++中实现两个日期间差多少天的方法。需要的朋友参考下
    2013-05-05
  • C++11/14如何使用typedef和using定义类型别名和别名模版

    C++11/14如何使用typedef和using定义类型别名和别名模版

    这篇文章主要介绍了C++11/14如何使用typedef和using定义类型别名和别名模版
    2023-04-04
  • 纯C语言实现五子棋

    纯C语言实现五子棋

    本文给大家分享的是去年制作的一个纯C语言实现的五子棋的代码,虽然没有带漂亮的界面,还是推荐给大家,有需要的小伙伴可以参考下。
    2015-03-03
  • C语言取模取整的深入理解

    C语言取模取整的深入理解

    本文主要介绍了 C语言取模取整的深入理解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • c++下迭代器总结

    c++下迭代器总结

    大家好,本篇文章主要讲的是c++下迭代器总结,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论