【Matlab】绘制雷达图及Legend灵活控制1. 绘制雷达图
本⽂根据: 修改,对于原⽂作者表⽰感谢。
function Draw_radar(data,lim,labels)
%data是要画图的数据(根据数据的个数来确定雷达图的轴数)
%lim是各指标画图上下限范围
%labels是坐标轴名称
n=length(data);%维度
adj_data=zeros(n,1);
point=zeros(n,2);
t(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]); endtoiletclub
theta_last=theta;
if data(i)<lim(i,1)
adj_data(i)=0;
elif data(i)>lim(i,2)
adj_data(i)=500;
el
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;
elif x+dx>maxx
南京东山外国语maxx=x+dx;
end
if y<miny
if y<miny
miny=y;
elif 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
ction=mod(theta+pi/12,2*pi);
if ction>pi+pi/6
in the sunshine
%上对齐
if ction>1.5*pi+pi/6
%左对齐
text(x,y,txt,'VerticalAlignment','cap','HorizontalAlignment','left','Fontsize',fontsize);
elif ction>1.5*pi
%中对齐
text(x,y,txt,'VerticalAlignment','cap','HorizontalAlignment','center','Fontsize',fontsize);
el
%右对齐
text(x,y,txt,'VerticalAlignment','cap','HorizontalAlignment','right','Fontsize',fontsize);
end
elif ction>pi
%中、右对齐
text(x,y,txt,'VerticalAlignment','middle','HorizontalAlignment','right','Fontsize',fontsize);
愚人节快乐用英语怎么说elif ction>pi/6
%下对齐
if ction>0.5*pi+pi/6
%右对齐
text(x,y,txt,'VerticalAlignment','bottom','HorizontalAlignment','right','Fontsize',fontsize); elif ction>0.5*pi
%中对齐
text(x,y,txt,'VerticalAlignment','bottom','HorizontalAlignment','center','Fontsize',fontsize); el
%左对齐
text(x,y,txt,'VerticalAlignment','bottom','HorizontalAlignment','left','Fontsize',fontsize);
end
el
%中、左对齐
text(x,y,txt,'VerticalAlignment','middle','HorizontalAlignment','left','Fontsize',fontsize);
end
end
1.1 单数据雷达图
data = [5 8 1 4];
lim = [0,10;0,10;0,10;0,10];
labels = {'1','2','3','4'};
Draw_radar(data,lim,labels);
1.2 多数据雷达图
当数据有多组时,例如:data = [5,8,1,4;7,5,4,8]。
可以绘制[5 8 1 4]之后,再hold on,最后绘制[7,5,4,8]即可。
data = [5 8 1 4];
lim = [0,10;0,10;0,10;0,10];
labels = {'1','2','3','4'};
Draw_radar(data,lim,labels);
hold on;
data = [7,5,4,8];
lim = [0,10;0,10;0,10;0,10];
labels = {'1','2','3','4'};
Draw_radar(data,lim,labels);
当然,最好把上⾯的操作封装⼀下,使⽤起来更⽅便,封装函数Draw_radar2代码如下:
function Draw_radar2(data,lim,labels)
hold on;
for i=1:size(data,1)
Draw_radar(data(i,:),lim,labels);
end
end
2. legend⾃由控制
当你想显⽰legend时,上述的⽅法可能就会出现如下的效果。
通过设置IconDisplayStyle属性为fal,通知Matlab不显⽰该plot语句所绘制图形的legend。t(get(get(plot句柄,'Annotation'),'LegendInformation'),'IconDisplayStyle','off');
例如:如果只想显⽰第1,6,11,16,21条线的legend,则可以【伪代码】:
for i = [2:5 7:10 12:15 17:20 22:25]
clap什么意思英语
t(get(get(H(i),'Annotation'),'LegendInformation'),'IconDisplayStyle','off');
end
legend('1','6','11','16','21');
其中,H为所有plot函数的句柄。
另外,调试发现,Draw_radar代码中的第39⾏,即最后⼀个plot绘图指令,就是我们要显⽰legend的线。对于上⾯的四个维度的数据,虚线⼀共4*5=20条,坐标轴实线共有4条,那么,第25条曲线就是我们需要显⽰legend的线。
那么,我们就可以做点什么了。我们可以只设置最后⼀个plot绘图对象的IconDisplayStyle属性为on,其余均设置为fal的⽅式,实现只显⽰第最后⼀条直线的legend的⽬的。
我们这⾥对最开始的Draw_radar函数做以下的修改:
1. ⾸先,在Draw_radar函数中保存所有plot函数的句柄到数组H中;
2. 接着,为了更能区分不同的曲线,笔者,将线的颜⾊和类型linestyle作为参数传⼊到Draw_radar函数中,当linestyle为'r-'时,对应
的数据会显⽰为红⾊线型;
3. 最后,为了更加清晰,将原有的填充中间区域注释掉了。
下⾯是修改后的Draw_radar和Draw_radar2的完整代码。
function [H] = Draw_radar(data,lim,labels,linestyle)
%data是要画图的数据(根据数据的个数来确定雷达图的轴数)
%lim是各指标画图上下限范围
%labels是坐标轴名称
H={};
n=length(data);%维度
adj_data=zeros(n,1);
point=zeros(n,2);
t(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;
H{length(H) + 1} = plot([0,500*cos(theta)],[0,500*sin(theta)],'k-','linewidth',2);
for j=1:5
H{length(H) + 1} = 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;
elif data(i)>lim(i,2)
adj_data(i)=500;
el
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
新加坡留学的政策要求H{length(H) + 1} = plot([point(:,1);point(1,1)],[point(:,2);point(1,2)],linestyle,'linewidth',1.5);%绘制
%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;
argentina是什么意思
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;
elif x+dx>maxx
maxx=x+dx;
一对一网站end
if y<miny
miny=y;
elif y+dy>maxy
maxy=y+dy;
end
end
axis([minx-50,maxx+50,miny-20,maxy+20]);
>sharon