MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)

这篇具有很好参考价值的文章主要介绍了MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

绘制效果

matlab雷达图,# MATLAB 科学绘图,matlab

matlab雷达图,# MATLAB 科学绘图,matlab


教程部分

基础绘制

数据为数值矩阵即可:

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

matlab雷达图,# MATLAB 科学绘图,matlab

改变样式

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

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

matlab雷达图,# MATLAB 科学绘图,matlab

添加修改标签添加图例

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();

matlab雷达图,# MATLAB 科学绘图,matlab

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();

matlab雷达图,# MATLAB 科学绘图,matlab

修改轴属性

使用:

  • 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]);

matlab雷达图,# MATLAB 科学绘图,matlab

修改标签属性

使用:

  • 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])

matlab雷达图,# MATLAB 科学绘图,matlab

修改圆形背景

使用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')

matlab雷达图,# MATLAB 科学绘图,matlab

修饰多边形

两种类型的多边形分别用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

matlab雷达图,# MATLAB 科学绘图,matlab

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

matlab雷达图,# MATLAB 科学绘图,matlab


工具函数完整代码

classdef radarChart
% @author : slandarer
% gzh  : slandarer随笔
    properties
        ax=[];Parent=[];arginList={'ClassName','PropName','Type','Parent'}
        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=[];
        PatchHdlL;PatchHdlP;PropLabelHdl;BkgHdl
    end

    methods
        function obj=radarChart(varargin)
            if isa(varargin{1},'matlab.graphics.axis.Axes')
                obj.ax=varargin{1};varargin(1)=[];
            else  
            end
            obj.XData=varargin{1};varargin(1)=[];
            obj.PropNum=size(obj.XData,2);
            obj.ClassNum=size(obj.XData,1);
            obj.RLim=[0,max(max(obj.XData))];

            % 获取其他信息
            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.ax)&&(~isempty(obj.Parent))
                obj.ax=obj.Parent;
            end
            if isempty(obj.ax)
                obj.ax=gca;
            end
            obj.ax.NextPlot='add';
            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(obj.ax,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(obj.ax,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(obj.ax,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);
                obj.PatchHdlP(i)=patch(obj.ax,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);
                obj.PatchHdlL(i)=plot(obj.ax,[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,:));
                switch obj.Type
                    case 'Line',set(obj.PatchHdlP(i),'Visible','off')
                    case 'Patch',set(obj.PatchHdlL(i),'Visible','off')
                    case 'Both'
                end
            end

            % 绘制R标签文本
            tnr=(tn(1)+tn(2))/2;
            for i=1:length(obj.RTick)
                obj.RLabelHdl(i)=text(obj.ax,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(obj.ax,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=setType(obj,Type)
            obj.Type=Type;
            for i=1:size(obj.XData,1)
                set(obj.PatchHdlP(i),'Visible','on')
                set(obj.PatchHdlL(i),'Visible','on')
                switch obj.Type
                    case 'Line',set(obj.PatchHdlP(i),'Visible','off')
                    case 'Patch',set(obj.PatchHdlL(i),'Visible','off')
                end
            end
            delete(findobj('Tag','SRClagend'))
            if isequal(obj.Type,'Line')
                obj.LgdHdl=legend(obj.ax,[obj.PatchHdlL],obj.ClassName,'FontSize',12,'Location','best','Tag','SRClagend');
            else
                obj.LgdHdl=legend(obj.ax,[obj.PatchHdlP],obj.ClassName,'FontSize',12,'Location','best','Tag','SRClagend');
            end
        end

        % 绘制图例
        function obj=legend(obj)
            if isequal(obj.Type,'Line')
                obj.LgdHdl=legend(obj.ax,[obj.PatchHdlL],obj.ClassName,'FontSize',12,'Location','best','Tag','SRClagend');
            else
                obj.LgdHdl=legend(obj.ax,[obj.PatchHdlP],obj.ClassName,'FontSize',12,'Location','best','Tag','SRClagend');
            end
        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)
            switch obj.Type
                case 'Line',set(obj.PatchHdlL(N),varargin{:})
                case 'Patch',set(obj.PatchHdlP(N),varargin{:})
            end
        end

        function setData(obj,Data)
            tn=linspace(0,2*pi,obj.PropNum+1);tn=tn(1:end-1);
            obj.XData=Data;
            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);
                set(obj.PatchHdlL(i),'XData',[XP,XP(1)],'YData',[YP,YP(1)]);
                set(obj.PatchHdlP(i),'XData',[XP,XP(1)],'YData',[YP,YP(1)]);
            end
        end
    end
% @author : slandarer
% gzh : slandarer随笔
% -------------------------------------------------------------------------
end

2023-3-19日更新

已支持app designer使用,提供一个示例:

matlab雷达图,# MATLAB 科学绘图,matlab文章来源地址https://www.toymoban.com/news/detail-526424.html

classdef radarChartApp < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure     matlab.ui.Figure
        ButtonGroup  matlab.ui.container.ButtonGroup
        Button_3     matlab.ui.control.RadioButton
        Button_2     matlab.ui.control.RadioButton
        Button       matlab.ui.control.Button
        UIAxes       matlab.ui.control.UIAxes
    end

    
    properties (Access = private)
        Data=randi([-3,8],[4,7])+rand([4,7]); % Description
        RC
    end

    % Callbacks that handle component events
    methods (Access = private)

        % Code that executes after component creation
        function startupFcn(app)
            app.RC=radarChart(app.UIAxes,app.Data);
            app.RC.RLim=[-5,10];
            app.RC.RTick=[-5,2,8:1:10];
            app.RC=app.RC.draw();
            app.RC=app.RC.legend();
        end

        % Button pushed function: Button
        function ButtonPushed(app, event)
            app.Data=randi([-3,8],[4,7])+rand([4,7]);
            app.RC.setData(app.Data);
        end

        % Selection changed function: ButtonGroup
        function ButtonGroupSelectionChanged(app, event)
            selectedButton = app.ButtonGroup.SelectedObject;
            switch selectedButton.Text
                case '填充',app.RC.setType('Patch')
                case '线条',app.RC.setType('Line')
            end
            
        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 640 480];
            app.UIFigure.Name = 'MATLAB App';

            % Create UIAxes
            app.UIAxes = uiaxes(app.UIFigure);
            title(app.UIAxes, 'Title')
            xlabel(app.UIAxes, 'X')
            ylabel(app.UIAxes, 'Y')
            zlabel(app.UIAxes, 'Z')
            app.UIAxes.Position = [1 21 446 441];

            % Create Button
            app.Button = uibutton(app.UIFigure, 'push');
            app.Button.ButtonPushedFcn = createCallbackFcn(app, @ButtonPushed, true);
            app.Button.BackgroundColor = [0 0.4471 0.7412];
            app.Button.FontName = '宋体';
            app.Button.FontSize = 24;
            app.Button.FontWeight = 'bold';
            app.Button.FontColor = [1 1 1];
            app.Button.Position = [488 380 113 71];
            app.Button.Text = {'生成随机'; '数并绘图'};

            % Create ButtonGroup
            app.ButtonGroup = uibuttongroup(app.UIFigure);
            app.ButtonGroup.SelectionChangedFcn = createCallbackFcn(app, @ButtonGroupSelectionChanged, true);
            app.ButtonGroup.Title = '雷达图类型';
            app.ButtonGroup.FontName = '宋体';
            app.ButtonGroup.FontSize = 18;
            app.ButtonGroup.Position = [488 235 123 120];

            % Create Button_2
            app.Button_2 = uiradiobutton(app.ButtonGroup);
            app.Button_2.Text = '线条';
            app.Button_2.FontName = '宋体';
            app.Button_2.FontSize = 14;
            app.Button_2.Position = [11 49 58 22];
            app.Button_2.Value = true;

            % Create Button_3
            app.Button_3 = uiradiobutton(app.ButtonGroup);
            app.Button_3.Text = '填充';
            app.Button_3.FontName = '宋体';
            app.Button_3.FontSize = 14;
            app.Button_3.Position = [11 21 65 22];

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = radarChartApp

            % Create UIFigure and components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            % Execute the startup function
            runStartupFcn(app, @startupFcn)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end

到了这里,关于MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MATLAB基础绘图第7棒】绘制各式柱状图

    绘制分组数据,并对 数据格式和边框 等进行设置,成图如下所示: MATLAB绘制代码如下: 图源:J2022-Observed decrease in light precipitation in part due to urbanization-Scientific Reports 成图如下: MATLAB代码如下: 区间范围柱状图 是柱状图的一种,能够更加清晰地展示各类目数据区间范围分布

    2024年02月09日
    浏览(45)
  • 《MATLAB科研绘图与学术图表绘制从入门到精通》

    解锁MATLAB科研绘图魅力,让数据可视化成为你的科研利器! 1.零基础快速入门:软件操作+实战案例+图文、代码结合讲解,从入门到精通快速高效。 2.多种科研绘图方法:科研绘图基础+变量图形+极坐标图形+3D图形+地理信息可视化等,绘图技巧全面掌握。 3.实用性和艺术性兼

    2024年04月13日
    浏览(86)
  • 【MATLAB基础绘图第2棒】绘制柱状/饼图填充图

    带填充纹理的堆叠图是通过在原始堆叠图的基础上添加不同的纹理得到的,可以很好地解决由于 颜色区分不够 而导致的对象识别困难问题。 由于Matlab中未收录提供填充纹理选项,因此需要大家自行设法解决。本博客介绍三种填充方法。 MATLAB官网-Hatchfill2(Kesh Ikuma. Matlab Ce

    2024年02月03日
    浏览(44)
  • MATLAB | 如何使用MATLAB获取顶刊《Nature》全部绘图(附带近3年全部图像)

    我出了如何使用MATLAB获取期刊《Cell》全部绘图,立马就有粉丝问《Nature》、《Sience》、《PNAS》啥的会不会安排,这期就给大家安排《Nature》全部绘图获取,之后其他期刊也会慢慢安排,但是不会一次性全出完(毕竟不能抓住一个主题就狠更)。 由于《Nature》绘图获取需要科学

    2024年02月09日
    浏览(45)
  • MATLAB | 如何使用MATLAB绘制甘特图(gantt chart)

    好久不见哈,今天带来一个不咋炫酷但是比较实用的甘特图绘制,就画一堆矩形嘛非常简单。 之所以这期工具函数放在最前面是因为比较短哈: 基本使用 设置任务开始时间,结束时间及任务编号后,调用工具函数绘图即可: 不咋好看的圆角 设置 Curvature 为0-1之间的数值即可

    2024年02月09日
    浏览(54)
  • 【MATLAB基础绘图第4棒】绘制椭圆形相关系矩阵图

    数据及代码下载: 下载专区-《MATLAB统计分析与应用:40个案例分析》程序与数据 绘图函数: 数据如下: MATLAB代码如下: 运行上述命令得出变量间的相关系数矩阵R、线性相关性检验的p值矩阵P以及相关系数矩阵图。成图如下所示: 图形参数修改可根据需要对 matrixplot函数 进

    2024年02月04日
    浏览(67)
  • MATLAB | 如何使用MATLAB绘制高度自定义的桑基图(sankey)

    我之前也出过一个超简单的桑基图绘制函数,但是无法应对很多特殊情况,在这里我将其重构了一些写成了类,加了很多内置修饰函数,实现了流入流出数据不相等或者跨层数据流动的特殊情况绘制,首先展示一下使用我编写的函数能够实现怎样的效果吧: 以上的图片全是本

    2024年02月04日
    浏览(97)
  • 【MATLAB基础绘图第9棒】绘制截断坐标轴(Broken Axis)

    有时候,用MATLAB绘制坐标图时会出现有的曲线值都特别大,有的曲线值都很小,但是又想在同一幅图中将他们展示出来,于是需要截断坐标轴的刻度或者改变纵轴的刻度,使其不均匀。此时,就需要对横坐标或纵坐标进行截断。 参考:博客-MATLAB实例:截断坐标轴(Broken Axis)

    2024年02月06日
    浏览(51)
  • Matlab绘图:绘制双坐标轴(双y轴)并设置两个y轴的颜色

    改变颜色有两种方法: 在开头就设置 在对应坐标轴启动的时候分别设置

    2024年02月11日
    浏览(43)
  • Matlab中的基本绘图操作,Matlab中如何绘图

    目录 一.示例基本程序 二.图片 三.说明         1.首先应该给定初值 2.matlab中的Π用pi代替 3.figure的作用是建立一个幕布,有时可以不写 4.plot( x=sin(x))作用是绘制一幅 x=sin(x)当前函数的图 5.title(\\\'   x=sin(x) \\\')的中可以添加图片的标题 x=sin(x) 6.xlabel(‘  x   ’)与ylabel(

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包