Matlab實(shí)現(xiàn)繪制雷達(dá)圖(蜘蛛圖)
繪制效果


教程部分
基礎(chǔ)繪制
數(shù)據(jù)為數(shù)值矩陣即可:
X=randi([2,8],[4,7])+rand([4,7]); RC=radarChart(X); RC=RC.draw();

改變樣式
有Patch和Line兩種樣式,通過(guò)設(shè)置Type屬性設(shè)置樣式:
X=randi([2,8],[4,7])+rand([4,7]); RC=radarChart(X,'Type','Patch'); RC=RC.draw();

添加修改標(biāo)簽添加圖例
X=randi([2,8],[4,7])+rand([4,7]);
RC=radarChart(X);
RC.PropName={'建模','實(shí)驗(yàn)','編程','總結(jié)','撰寫(xiě)','創(chuàng)新','摸魚(yú)'};
RC.ClassName={'同門(mén)A','同門(mén)B','同門(mén)C','同門(mén)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
設(shè)置軸屬性,舉個(gè)例子,theta軸變?yōu)榈t色,R軸變?yōu)榈{(lán)色:
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]);

修改標(biāo)簽屬性
使用:
- setPropLabel
- setRLabel
修改屬性標(biāo)簽和R刻度標(biāo)簽:
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函數(shù)修飾背景:
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對(duì)象和Line對(duì)象繪制,修飾方式略有區(qū)別,不過(guò)都是使用setPatchN函數(shù)進(jìn)行修飾,以下以修改顏色舉例:
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

工具函數(shù)完整代碼
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','--');
% 繪制雷達(dá)圖
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標(biāo)簽文本
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
% 繪制屬性標(biāo)簽
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
% 設(shè)置圖例屬性
function obj=setLegend(obj,varargin)
set(obj.LgdHdl,varargin{:})
end
% 設(shè)置標(biāo)簽
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
% 設(shè)置軸
function obj=setRTick(obj,varargin)
set(obj.RTickHdl,varargin{:})
end
function obj=setThetaTick(obj,varargin)
set(obj.ThetaTickHdl,varargin{:})
end
% 設(shè)置patch屬性
function obj=setPatchN(obj,N,varargin)
set(obj.PatchHdl(N),varargin{:})
end
end
% @author : slandarer
% gzh : slandarer隨筆
end
以上就是Matlab實(shí)現(xiàn)繪制雷達(dá)圖(蜘蛛圖)的詳細(xì)內(nèi)容,更多關(guān)于Matlab雷達(dá)圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
OpenCV 視頻中火焰檢測(cè)識(shí)別實(shí)踐
本文主要介紹了OpenCV 視頻中火焰檢測(cè)識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
C++四種強(qiáng)制轉(zhuǎn)換原理與價(jià)值
這篇文章主要介紹了C++的四種強(qiáng)制轉(zhuǎn)換原理與價(jià)值,文中介紹的非常詳細(xì),對(duì)學(xué)習(xí)C語(yǔ)言有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2023-04-04
C語(yǔ)言中QString與QByteArray互相轉(zhuǎn)換的方法
本文主要介紹了C語(yǔ)言中QString與QByteArray互相轉(zhuǎn)換的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
include包含頭文件的語(yǔ)句中,雙引號(hào)和尖括號(hào)的區(qū)別(詳解)
下面小編就為大家?guī)?lái)一篇include包含頭文件的語(yǔ)句中,雙引號(hào)和尖括號(hào)的區(qū)別(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
使用C語(yǔ)言實(shí)現(xiàn)交換整數(shù)的奇數(shù)位和偶數(shù)位
在C語(yǔ)言中,要交換一個(gè)整數(shù)的二進(jìn)制位中的奇數(shù)位和偶數(shù)位,重點(diǎn)需要理解位操作,當(dāng)我們談?wù)摱M(jìn)制位的奇數(shù)位和偶數(shù)位時(shí),我們是指從右到左數(shù)的位置,本文給大家介紹了使用C語(yǔ)言代碼實(shí)現(xiàn)將一個(gè)整數(shù)的奇數(shù)位和偶數(shù)位交換,需要的朋友可以參考下2025-03-03
C++設(shè)計(jì)模式編程中Facade外觀模式的使用實(shí)例解析
這篇文章主要介紹了C++設(shè)計(jì)模式編程中Facade外觀模式的使用實(shí)例解析,外觀模式的主要用途就是為子系統(tǒng)的復(fù)雜處理過(guò)程提供方便的調(diào)用方法,需要的朋友可以參考下2016-03-03
Qt?http編程之nlohmann?json庫(kù)使用詳解
nlohmann是一個(gè)C++的JSON庫(kù),它提供了方便的方式來(lái)解析、生成和操作JSON數(shù)據(jù),這篇文章主要為大家介紹了nlohmann?json庫(kù)的簡(jiǎn)單使用,希望對(duì)大家有所幫助2024-04-04
C語(yǔ)言內(nèi)存管理及初始化細(xì)節(jié)示例詳解
這篇文章主要為大家介紹了C語(yǔ)言內(nèi)存管理及初始化細(xì)節(jié)示例的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
C語(yǔ)言鏈表實(shí)現(xiàn)簡(jiǎn)單圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表實(shí)現(xiàn)簡(jiǎn)單圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

