本人终于写了第一篇博客
因毕业设计画图需要,用MATLAB写了一个自动画雷达图的程序,可以画两种雷达图:多边形风格和圆风格的雷达图,有需要的朋友可以参考。
一、多边形风格雷达图
画图的原理是,先一条一条画直线,然后再标注文字,然后填充图形。画直线用plot函数,标文字用text函数,填充图形用fill函数。这里有几个小技巧:
- 后画的内容会遮挡先画的内容,由于直线不便调透明, 所以先画直线再写字。
- 使用默认的对齐方式时,文字有时候会重叠在图上,不美观。所以需要根据文字的位置来设置合适的对其方式。
- 使用axes equal使横纵坐标相同,可以更方便地计算坐标。可以把图像中心定义为0,0点,然后用极坐标的形式去确定画图坐标。
- 为了使图窗大小正好是雷达图的大小,防止有些文字显示在图窗外面,需要读取各文字的extent属性,确定他们的坐标,然后调整绘图大小使得画图区足够容纳他们。
画图函数整合成draw_radar(data,lim,prefer_range,labels)函数,data是要画图的数据(根据数据的个数来确定雷达图的轴数),lim是各指标画图上下限范围,prefer_range是各指标参考上下限范围,labels是坐标轴名称。
function draw_radar(data,lim,prefer_range,labels)
n=length(data);
adj_data=zeros(n,1);
point=zeros(n,2);
adj_preferl=zeros(n,1);
preferl_point=zeros(n,2);
adj_preferu=zeros(n,1);
preferu_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)];
adj_preferl(i)=(prefer_range(i,1)-lim(i,1))/(lim(i,2)-lim(i,1))*500;
preferl_point(i,1:2)=[adj_preferl(i)*cos(theta);adj_preferl(i)*sin(theta)];
adj_preferu(i)=(prefer_range(i,2)-lim(i,1))/(lim(i,2)-lim(i,1))*500;
preferu_point(i,1:2)=[adj_preferu(i)*cos(theta);adj_preferu(i)*sin(theta)];
text_around(510*cos(theta),510*sin(theta),labels{i},theta);
end
plot([preferl_point(:,1);preferl_point(1,1)],[preferl_point(:,2);preferl_point(1,2)],'b-','linewidth',1.5);
plot([prefe