利用matlab绘制矩阵色块图.docx
《利用matlab绘制矩阵色块图.docx》由会员分享,可在线阅读,更多相关《利用matlab绘制矩阵色块图.docx(22页珍藏版)》请在冰豆网上搜索。
利用matlab绘制矩阵色块图
R语言中有一个根据实值矩阵绘制色块图的程序(用于绘制相关系数矩阵图),可以用丰富的颜色和形状形象的展示矩阵元素值的大小。
遗憾的是MATLAB中没有这样的函数,因
此我就用MATLAB编写了一个matrixplot函数,下面给出示例和源码,与大家一起分享!
**********************************************
【例1】绘制网格线,网格中显示矩阵元素。
显示黑色文字:
>>x=[1,-0.2,0.3,0.8,-0.5
-0.2,1,0.6,-0.7,0.2
0.3,0.6,1,0.5,-0.3
0.8,-0.7,0.5,1,0.7
-0.5,0.2,-0.3,0.7,1];
>>XVarNames={'xiezhh','heping','keda','tust','tianjin'};
>>
matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',XVarNames);
效果图1:
根据矩阵元素值自动设置文字颜色:
>>
【例2】绘制实值矩阵各元素对应的色块,通过不同的参数/参数值”控制色块的形状、大
小、颜色等属性。
方形色块,充满方格,灰白色字体
>>
matrixplot(x,'XVarNames‘,XVarNames,'YVarNames',XVarNames,'TextColor',[0.6,0.6,0.6],'ColorBar','on');
效果图3:
方形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体
>>
椭圆形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体
>>
matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','off,'FigSize','Auto','ColorBar','on','FigShape','e');
圆形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体,上三角形式显示
>>
六边形色块,根据矩阵元素值自动确定色块的大小和颜色,显示字体,下三角形式显示
>>
matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','on','FigSize','Auto','ColorBar','on','FigShape','h','FigStyle','Tril');
效果图7:
表盘形色块,根据矩阵元素值自动确定色块的颜色,不显示字体
>>
matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','off,'FigSize','Full','ColorBar','on','FigShape','d');
【例3】读取真彩图片,绘制伪红外图。
>>I=double(imread('kids.tif));
>>matrixplot(l,'DisplayOpt','off,'colorbar','on','grid','off);
最后贴上matrixplot函数的源码,源码中有详细的调用格式及参数说
明,感兴趣的版友可以通过设置不同参数,做出更为精彩的图形,希望大家喜欢!
functionmatrixplot(data,varargin)
%根据实值矩阵绘制色块图,用丰富的颜色和形状形象的展示矩阵元素值的大小。
%
%
matrixplot(data)
绘制矩阵色块图,data为实值矩阵,
每一个元素对应一个色块,色
%
块颜色由元素值大小决定。
%
%
matrixplot(data,'PARAM1',val1,'PARAM2',val2,...)
%
用成对出现的参数名/参数值控制色块的各项属性。
可用的参数名/参数值如下:
%
'FigShape'---
设定色块的形状,其参数值为:
%
'Square'
---方形(默认)
%
'Circle'
---圆形
%
'Ellipse'
--椭圆形
%
'Hexagon'---六边形
%
'Dial'
---表盘形
%
%
'FigSize'---
设定色块的大小,其参数值为:
%
'Full'
---最大色块(默认)
%
'Auto'
---根据矩阵元素值自动确定色块大小
%
%
'FigStyle'---
设定矩阵图样式,其参数值为:
%
'Auto'
---矩形矩阵图(默认)
%
'Tril'
---下三角矩阵图
%
'Triu'
---上三角矩阵图
%
%
'FillStyle'---
设定色块填充样式,其参数值为:
%
'Fill'-
--填充色块内部(默认)
%
'NoFill'
---不填充色块内部
%
%
'DisplayOpt'-
--设定是否在色块中显示矩阵元素值,
其参数值为:
%
'On'
---显示矩阵元素值(默认)
%
'Off'
---不显示矩阵元素值
%
%
'TextColor'---
设定文字的颜色,其参数值为:
%
表示单色的字符('r','g','b','y','m','c','w','k')
默认为黑色
%
1行3列的红、绿、蓝三元色灰度值向量(
[r,g,b])
%
'Auto'
---根据矩阵元素值自动确定文字颜色
%
%
'XVarNames'
---设定X轴方向需要显示的变量名(默认为X1,X2,…),其参数值
为:
%
字符串矩阵或字符串元胞数组,若为字符串矩阵,
其行数应与data的列数相
同
%
若为字符串元胞数组,其长度应与data的列数相同。
%
%'YVarNames'---设定Y轴方向需要显示的变量名(默认为Y1,Y2,...),其参数值为:
%字符串矩阵或字符串元胞数组,若为字符串矩阵,其行数应与data的行数相
同
%若为字符串元胞数组,其长度应与data的行数相同。
'ColorBar'---设定是否显示颜色条,其参数值为:
%'On'---显示颜色条
%
%
%
%
'Off'---不显示颜色条(默认)
'Grid'---设定是否显示网格线,其参数值为:
'On'---显示网格线(默认)
'Off'---不显示网格线
%Example:
%x=[1,-0.2,0.3,0.8,-0.5
%-0.2,1,0.6,-0.7,0.2
%0.3,0.6,1,0.5,-0.3
%0.8,-0.7,0.5,1,0.7
%-0.5,0.2,-0.3,0.7,1];
%matrixplot(x);
%matrixplot(x,'DisplayOpt','off');
%matrixplot(x,'FillStyle','nofill','TextColor','Auto');
%matrixplot(x,'TextColor',[0.7,0.7,0.7],'FigShap','s','FigSize','Auto','ColorBar','on');
%matrixplot(x,'TextColor','k','FigShap','d','FigSize','Full','ColorBar','on','FigStyle','Triu');
%XVarNames={'xiezhh','heping','keda','tust','tianjin'};
%matrixplot(x,'FigShap','e','FigSize','Auto','ColorBar','on','XVarNames',XVarNames,'YVar
Names',XVarNames);
%
%CopyRight:
xiezhh(谢中华),2013.01.24编写
%对第一个输入参数类型进行判断if~ismatrix(data)||~isreal(data)error('输入参数类型不匹配:
第一个输入参数应为实值矩阵');end%解析成对出现的参数名/参数值
[FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,XVarNames,...
YVarNames,ColorBar,GridOpt]=parseInputs(varargin{:
});
%产生网格数据
[m,n]=size(data);
[x,y]=meshgrid(0:
n,0:
m);
data=data(:
);maxdata=nanmax(data);mindata=nanmin(data);rangedata=maxdata-mindata;ifisnan(rangedata)
warning('MATLAB:
warning1','请检查您输入的矩阵是否合适!
');
return;
end
z=zeros(size(x))+0.2;
sx=x(1:
end-1,1:
end-1)+0.5;
sy=y(1:
end-1,1:
end-1)+0.5;
ifstrncmpi(FigStyle,'Tril',4)
z(triu(ones(size(z)),2)>0)=NaN;sx(triu(ones(size(sx)),1)>0)=NaN;
elseifstrncmpi(FigStyle,'Triu',4)
z(tril(ones(size(z)),-2)>0)=NaN;
sx(tril(ones(size(sx)),-1)>0)=NaN;
end
sx=sx(:
);
sy=sy(:
);
id=isnan(sx)|isnan(data);
sx(id)=[];
sy(id)=[];
data(id)=[];
ifisempty(XVarNames)
XVarNames=strcat('X',cellstr(num2str((1:
n)')));
else
if(iscell(XVarNames)&&(numel(XVarNames)~=n))||(~iscell(XVarNames)&&(size(XVarNames,1)~=n))
error('X轴方向变量名应为字符串矩阵或字符串元胞数组,其长度与输入矩阵的列数相同');
end
end
ifisempty(YVarNames)
YVarNames=strcat('Y',cellstr(num2str((1:
m)')));
else
if(iscell(YVarNames)&&(numel(YVarNames)~=m))||(~iscell(YVarNames)&&(size(YVarNames,1)~=m))
error('Y轴方向变量名应为字符串矩阵或字符串元胞数组,其长度与输入矩阵的行数相同');
end
end
%绘图
figure('color','w',...
'units','normalized',...
'pos',[0.289165,0.154948,0.409956,0.68099]);axes('units','normalized','pos',[0.1,0.022,0.89,0.85]);ifstrncmpi(GridOpt,'On',2)
mesh(x,y,z,...'EdgeColor',[0.7,0.7,0.7],...
'FaceAlpha',0,...'LineWidth',1);%参考网格线endholdon;axisequal;
axis([-0.1,n+0.1,-0.1,m+0.1,-0.5,0.5]);
view
(2);
%设置X轴和Y轴刻度位置及标签set(gca,'Xtick',(1:
n)-0.5,...
'XtickLabel',XVarNames,...
'Ytick',(1:
m)-0.5,...
'YtickLabel',YVarNames,...'XAxisLocation','top',...
'YDir','reverse',...
'Xcolor',[0.7,0.7,0.7],...
'Ycolor',[0.7,0.7,0.7],...
'TickLength',[0,0]);
axisoff
%绘制填充色块
ifstrncmpi(FillStyle,'Fill',3)MyPatch(sx',sy',data',FigShape,FigSize);
end%显示数值文本信息
ifstrncmpi(DisplayOpt,'On',2)
str=num2str(data,'%4.2f');
scale=0.1*max(n/m,1)/(max(m,nF0.55);
ifstrncmpi(TextColor,'Auto',3)
ColorMat=get(gcf,'ColorMap');
nc=size(ColorMat,1);
cid=fix(mapminmax(data',0,1)*nc)+1;cid(cid<1)=1;
cid(cid>nc)=nc;
TextColor=ColorMat(cid,:
);
fori=1:
numel(data)text(sx(i),sy(i),0.1,str(i,:
),...
'FontUnits','normalized',...'FontSize',scale,...
'fontweight','bold',...
'HorizontalAlignment','center',...'Color',TextColor(i,:
));
end
else
text(sx,sy,0.1*ones(size(sx)),str,...'FontUnits','normalized',...'FontSize',scale,...
'fontweight','bold',...
'HorizontalAlignment','center',...'Color',TextColor);
end
end
%设置X轴和Y轴刻度标签的缩进方式MyTickLabel(gca,FigStyle);
%添加颜色条
ifstrncmpi(ColorBar,'On',2)
ifany(strncmpi(FigStyle,{'Auto','Triu'},4))colorbar('Location','EastOutside');
else
colorbar('Location','SouthOutside');
endendend
%
%调整坐标轴刻度标签子函数
%
functionMyTickLabel(ha,tag)%根据显示范围自动调整坐标轴刻度标签的函数
%ha坐标系句柄值
%tag调整坐标轴刻度标签的标识字符串,可用取值如下:
%'Auto'---将x轴刻度标签旋转90度,y轴刻度标签不作调整
%'Tril'---将x轴刻度标签旋转90度,并依次缩进,y轴刻度标签不作调整
%'Triu'---将x轴刻度标签旋转90度,y轴刻度标签依次缩进
%Example:
%MyTickLabel(gca,'Tril');
%
%CopyRight:
xiezhh(谢中华),2013.1编写
if~ishandle(ha)
warning('MATLAB:
warning2','第一个输入参数应为坐标系句柄');return;
endif~strcmpi(get(ha,'type'),'axes')
warning('MATLAB:
warning3','第一个输入参数应为坐标系句柄');
return;
endaxes(ha);
xstr=get(ha,'XTickLabel');
xtick=get(ha,'XTick');
xl=xlim(ha);
ystr=get(ha,'YTickLabel');
ytick=get(ha,'YTick');
yl=ylim(ha);set(ha,'XTickLabel',[],'YTickLabel',[]);
x=zeros(size(ytick))+xl
(1)-range(xl)/30;y=zeros(size(xtick))+yl
(1)-range(yl)/70;nx=numel(xtick);
ny=numel(ytick);
ifstrncmpi(tag,'Tril',4)y=y+(1:
nx)-1;
elseifstrncmpi(tag,'Triu',4)
x=x+(1:
ny)-1;
end
text(xtick,y,xstr,...
'rotation',90,...
'Interpreter','none',...'color','r',...
'HorizontalAlignment','left');
text(x,ytick,ystr,...
'Interpreter','none',...
'color','r',...
'HorizontalAlignment','right');
end
%
%根据散点数据绘制3维色块图子函数
%
functionMyPatch(x,y,z,FigShape,FigSize)
%根据散点数据绘制3维色块图
%MyPatch(x,y,z,FigShape,FigSize)x,y,z是实值数组,用来指定色块中心点三维
%坐标。
FigShape是字符串变量,用来指定色块形状。
%FigSize是字符串变量,用来指定色块大小。
%
%CopyRight:
xiezhh(谢中华),2013.01编写
%
%Example:
%x=rand(10,1);
%y=rand(10,1);
%z=rand(10,1);
%MyPatch(x,y,z,'s','Auto');
%%输入参数类型判断
ifnargin<3
error('至少需要三个输入参数');
end
if~isreal(x)||~isreal(y)||~isreal(z)error('前三个输入应为实值数组');
endn=numel(z);
ifnumel(x)~=n||numel(y)~=nerror('坐标应等长');
end
ifstrncmpi(FigSize,'Auto',3)&&~strncmpi(FigShape,'Ellipse',1)id=(z==0);
x(id)=[];
y(id)=[];
z(id)=[];
endifisempty(z)return;
end%求色块顶点坐标
rab1=ones(size(z));maxz=max(abs(z));
ifmaxz==0
maxz=1;
end
rab2=abs(z)/maxz;
ifstrncmpi(FigShape,'Square',1)
%方形
ifstrncmpi(FigSize,'Full',3)
r=rab1;
else
r=sqrt(rab2);
end
SquareVertices(x,y,z,r);
elseifstrncmpi(FigShape,'Circle',1)
%圆形
ifstrncmpi(FigSize,'Full',3)
r=0.5*rab1;
else
r=0.5*sqrt(rab2);
end
CircleVertices(x,y,z,r);
elseifstrncmpi(FigShape,'Ellipse',1)
%椭圆形
a=0.48+rab2*(0.57-0.48);
b=(1-rab2).*a;
EllipseVertices(x,y,z,a,b);
elseifstrncmpi(FigShape,'Hexagon',1)
%六边形
ifstrncmpi(FigSize,'Full',3)
r=0.5*rab1;
else
r=0.5*sqrt(rab2);
end
HexagonVertices(x,y,z,r);
else
%表盘形
ifstrncmpi(FigSize,'Full',3)
r=0.45*rab1;
else
r=0.45*sqrt(rab2);
end
DialVertices(x,y,z,r);
end
end
%
%求色块顶点坐标并绘制色块的子函数
%
functionSquareVertices(x,y,z,r)
%方形
hx=r/2;
hy=hx;
Xp=[x-hx;x-hx;x+hx;x+hx;x-hx];
Yp=[y-hy;y+hy;y+hy;y-hy;y-hy];
Zp=repmat(z,[5,1]);patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat');end
functionCircleVertices(x,y,z,r)
%圆形
t=linspace(0,2*pi,30)';
m=numel(t);
Xp=repmat(x,[m,1])+cos(t)*r;
Yp=repmat(y,[m,1])+sin(t)*r;
Zp=repmat(z,[m,1]);
patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat');end
functionEllipseVertices(x,y,z,a,b)
%椭圆形
t=linspace(0,2*pi,30)';
m=numel(t);
t0=-sign(z)*pi/4;
t0=repmat(t0,[m,1]);
x0=cos(t)*a;
y0=sin(t)*b;
X