记录了用matlab绘制雷达图的一般步骤,这雷达图就是lol比赛时,解说对比赛选手评价时常出现的那幅图!

文章完善进度100%

需求&方法1

在坐标上绘制孙伟各方面能力雷达图,总共有六个能力(’交流’,’逻辑’,’编程’,’心态’,’体育’,’其它’),每个能力的评分范围各为([0,10000;0,10000;0,10000;0,10000;0,10000;0,10000]),而孙伟的评分分别为(2000,8000,6000,9000,6250,8667)!

具体操作步骤

①先定义一个函数“draw_radar.m”,具体代码如下

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
function draw_radar(data,lim,labels)
n=length(data);
adj_data=zeros(n,1);
point=zeros(n,2);
set(gca,'units','normal','pos',[0 0 1 1]);
axis off
axis equal
hold on
theta_last=pi/2;
for i=1:n
theta=2*pi/n*i+pi/2;
plot([0,500*cos(theta)],[0,500*sin(theta)],'k-','linewidth',2);
for j=1:5
plot([j*100*cos(theta_last),j*100*cos(theta)],[j*100*sin(theta_last),j*100*sin(theta)],'--','linewidth',0.75,'color',[0.5,0.5,0.5]);
end
theta_last=theta;
if data(i)<lim(i,1)
adj_data(i)=0;
elseif data(i)>lim(i,2)
adj_data(i)=500;
else
adj_data(i)=(data(i)-lim(i,1))/(lim(i,2)-lim(i,1))*500;
end
point(i,1:2)=[adj_data(i)*cos(theta);adj_data(i)*sin(theta)];
text_around(510*cos(theta),510*sin(theta),labels{i},theta);
end

for i=1:n
theta=2*pi/n*i+pi/2;
for j=1:5
text_around(j*100*cos(theta),j*100*sin(theta),num2str(lim(i,1)+(lim(i,2)-lim(i,1))/5*j),theta+pi/2,7);
end
end
plot([point(:,1);point(1,1)],[point(:,2);point(1,2)],'k-','linewidth',0.8);
fill(point(:,1),point(:,2),[0.9 0.9 0.7])
alpha(0.5);
texts=findobj(gca,'Type','Text');
minx=-300;
maxx=300;
miny=-300;
maxy=300;
for i=1:length(texts)
rect=get(texts(i),'Extent');
x=rect(1);
y=rect(2);
dx=rect(3);
dy=rect(4);
if x<minx
minx=x;
elseif x+dx>maxx
maxx=x+dx;
end
if y<miny
miny=y;
elseif y+dy>maxy
maxy=y+dy;
end
end
axis([minx-50,maxx+50,miny-20,maxy+20]);
end
function text_around(x,y,txt,theta,fontsize)
if nargin==4
fontsize=10;
end
section=mod(theta+pi/12,2*pi);
if section>pi+pi/6
if section>1.5*pi+pi/6
text(x,y,txt,'VerticalAlignment','cap','HorizontalAlignment','left','Fontsize',fontsize);
elseif section>1.5*pi
text(x,y,txt,'VerticalAlignment','cap','HorizontalAlignment','center','Fontsize',fontsize);
else
text(x,y,txt,'VerticalAlignment','cap','HorizontalAlignment','right','Fontsize',fontsize);
end
elseif section>pi
text(x,y,txt,'VerticalAlignment','middle','HorizontalAlignment','right','Fontsize',fontsize);
elseif section>pi/6
if section>0.5*pi+pi/6
text(x,y,txt,'VerticalAlignment','bottom','HorizontalAlignment','right','Fontsize',fontsize);
elseif section>0.5*pi
text(x,y,txt,'VerticalAlignment','bottom','HorizontalAlignment','center','Fontsize',fontsize);
else
text(x,y,txt,'VerticalAlignment','bottom','HorizontalAlignment','left','Fontsize',fontsize);
end
else
text(x,y,txt,'VerticalAlignment','middle','HorizontalAlignment','left','Fontsize',fontsize);
end
end

②在主函数“main.m”中编写数据:label为具体能力,lim为能力评分范围,data为我的能力评分。

1
2
3
4
data = [2000,8000,6000,9000,6250,8667];
lim = [0,10000;0,10000;0,10000;0,10000;0,10000;0,10000];%每个数据的范围
labels = {'交流','逻辑','编程','心态','体育','其它'};%取名字
draw_radar(data,lim,labels);

③结果解读如下: