全球访问量最大的网站关键词搜索优化公司
这是第一期特殊绘图小合集文章,主要把一些绘制比较有技巧但是篇幅太短不适合单出文章的绘图拿过来放在一起,估计很久之后才能攒出这么多特殊绘图出第二期。。
1 渐变面积图
写了个小工具可以用来生成渐变面积图:
function areah(varargin)
% @author : slandarer
if isa(varargin{1},'matlab.graphics.axis.Axes')ax=varargin{1};varargin(1)=[];
elseax=gca;
end
hold on
X=varargin{1};Y=varargin{2};
XList=linspace(min(X(:)),max(X(:)),1000);
YList=linspace(min(Y(:)),max(Y(:)),1000);
[~,YMesh]=meshgrid(XList,YList);
YY=interp1(X(:),Y(:),XList);coe.Color=lines(ax.ColorOrderIndex);
coe.LineWidth=2;
for i=3:2:length(varargin)coe.(varargin{i})=varargin{i+1};
end
CMesh=zeros(1000,1000,3);
CMesh(:,:,1)=ones(1000,1000).*coe.Color(1);
CMesh(:,:,2)=ones(1000,1000).*coe.Color(2);
CMesh(:,:,3)=ones(1000,1000).*coe.Color(3);
AMesh=linspace(0,.5,1000)'.*ones(1,1000);
AMesh(YMesh>YY)=0;image(ax,[min(X(:)),max(X(:))],[min(Y(:)),max(Y(:))],CMesh,'AlphaData',AMesh)
plot(ax,X(:),Y(:),'Color',coe.Color,'LineWidth',coe.LineWidth)
ax.ColorOrderIndex=ax.ColorOrderIndex+1;
end
使用方法:
% areahDemo
% 生成数据
x=linspace(-8,12,100);
y1=normpdf(x,4,6);
y2=normpdf(x,0,1).*0.5+normpdf(x,4,2).*0.5;
y3=normpdf(x,-3,2);% 绘制渐变面积图
hold on
areah(gca,x,y1,'Color',[144,69,70]./255,'LineWidth',1.5);
areah(x,y2,'Color',[74,156,167]./255,'LineWidth',1.5);
areah(x,y3,'Color',[102,140,123]./255,'LineWidth',1.5);% 简单修饰坐标区域
ax=gca;
ax.XLim=[-8,12];
ax.Box='on';
2 特殊形状填充等高线图
实用contourf
绘制填充等高线图时,可以将矩阵一部分设置为nan,绘制效果就会将这部分省缺为空白:
% nanContourfDemo
Z=peaks(500);
[X,Y]=meshgrid(1:size(Z,2),1:size(Z,1));
Z(Y>sin(X/40).*100+350)=nan;
contourf(X,Y,Z,20,'EdgeColor','none')
3 环形饼状图
就饼状图中心画个白色的圆就好了:
% circularPieDemo
X=[1,2,1,4,5];
pieHdl=pie(X);
hold on
% 颜色列表,修改颜色和标签位置
colorList=[0.8858 0.8500 0.88800.6173 0.7311 0.78640.4041 0.5218 0.74400.3668 0.2640 0.64650.2589 0.0720 0.3397];
for i=2:2:length(pieHdl)pieHdl(i).Position=pieHdl(i).Position.*.57;pieHdl(i).Color=[1,1,1];pieHdl(i-1).FaceColor=colorList(i/2,:);
end
legend('AutoUpdate','off')
% 画个圆
t=linspace(0,2*pi,200);
fill(cos(t).*.5,sin(t).*.5,'w')
4 三维组合图
就是一个散点密度图,不过组合的形式变成了三维:
% densityDemo
pntSet=mvnrnd([2 3],[1 .5;.5 2],500);
scatter(pntSet(:,1),pntSet(:,2),40,'.','MarkerEdgeColor',[.5,.5,.5]);% 计算中心点,协方差矩阵
Mu=mean(pntSet);
Y=pntSet-repmat(Mu,size(pntSet,1),1);
Sigma=cov(Y);% Sigma=(Y'*(ones(size(pntSet,1),1).*Y))./(size(pntSet,1)-1);ax=gca;view(3)
hold on;box on;grid on
ax.XLim=[-2,10];
ax.YLim=[-2,10];
%ax.DataAspectRatio=[1,1,1];% 绘制置信椭圆
[X,Y]=getEllipse(Mu,Sigma,9.21,100);
plot(X,Y,'Color',[0,0,.8],'LineWidth',2);% 绘制直方图
H1Hdl=histogram(pntSet(:,1));
for i=1:length(H1Hdl.Values)fill3([H1Hdl.BinEdges([i,i+1,i+1,i])],[1,1,1,1].*ax.YLim(2),...[0,0,H1Hdl.Values([i,i])],[.7,.7,.7])
end
H2Hdl=histogram(pntSet(:,2));
for i=1:length(H2Hdl.Values)fill3([1,1,1,1].*ax.XLim(2),[H2Hdl.BinEdges([i,i+1,i+1,i])],...[0,0,H2Hdl.Values([i,i])],[.7,.7,.7])
endax.ZLim=[0,max([H1Hdl.Values,H2Hdl.Values])];% 绘制核密度曲线
[f,xi]=ksdensity(pntSet(:,1));
plot3(xi,ones(size(xi)).*ax.YLim(2),f.*size(pntSet,1).*H1Hdl.BinWidth,'Color',[0,0,.8],'LineWidth',2)
[f,yi]=ksdensity(pntSet(:,2));
plot3(ones(size(yi)).*ax.XLim(2),yi,f.*size(pntSet,1).*H2Hdl.BinWidth,'Color',[0,0,.8],'LineWidth',2)delete(H1Hdl)
delete(H2Hdl)% 置信椭圆定位函数
function [X,Y]=getEllipse(Mu,Sigma,S,pntNum)
% 置信区间 | 95%:5.991 99%:9.21 90%:4.605
% (X-Mu)*inv(Sigma)*(X-Mu)=SinvSig=inv(Sigma);[V,D]=eig(invSig);
aa=sqrt(S/D(1));
bb=sqrt(S/D(4));t=linspace(0,2*pi,pntNum);
XY=V*[aa*cos(t);bb*sin(t)];
X=(XY(1,:)+Mu(1))';
Y=(XY(2,:)+Mu(2))';
end
5 每组不同数量三维柱状图
也写了个工具函数:
function hdlSet=bar3n(X)
ax=gca;
ax.Projection='perspective';for i=1:length(X)SE=nan(length(X),length(X{i}));SE(i,:)=X{i};hdlSet{i}=bar3(SE,'grouped');if i==1hold on;end
endfor i=1:length(X)for j=1:length(hdlSet{i})% 删掉多余的柱状图tXData=hdlSet{i}(j).XData;hdlSet{i}(j).XData=nan.*ones(size(hdlSet{i}(j).XData));hdlSet{i}(j).XData((i-1)*6+1:i*6,:)=tXData((i-1)*6+1:i*6,:);end
end
end
非常简单的使用方法:
% bar3nDemo
X{1}=[1 4 6 4 1];
X{2}=[1 5 10 10 5 1];
X{3}=[1 6 15 20 15 6 1];
bar3n(X);
6 环形树状图
需要安装Statistics and Machine Learning Toolbox即统计与机器学习工具箱!!!
自己写的工具函数:
function [treeHdl,txtHdl]=ringTree(Data,Name)
% @author : slandarer
fig=gcf;
fig.Color=[1,1,1];
ax=gca;hold on
ax.XLim=[-1.2,1.2];
ax.YLim=[-1.2,1.2];
ax.DataAspectRatio=[1,1,1];
ax.XColor='none';
ax.YColor='none';
ax.Tag='author : slandarer';
disp(ax.Tag);fig1=figure();
tree1=linkage(Data,'average');
[~,~,order1]=dendrogram(tree1,0,'Orientation','top');theta1=0;
theta2=pi*2;
theta3=(theta2-theta1)./size(Data,1);
theta4=theta1+theta3/2;
theta5=theta2-theta3/2;LineSet1=fig1.Children.Children;
maxY1=0;
for i=1:length(LineSet1)maxY1=max(max(LineSet1(i).YData),maxY1);
end
tS=linspace(0,1,50);
for i=1:length(LineSet1)tX=LineSet1(i).XData;tY=LineSet1(i).YData;tR=(maxY1-tY)./maxY1;tT=theta4+(theta5-theta4).*(tX-1)./(size(Data,1)-1);tR=[tR(1),tR(2).*ones(1,50),tR(4)];tT=[tT(1),tT(2)+tS.*(tT(3)-tT(2)),tT(4)];treeHdl(i)=plot(ax,tR.*cos(tT),tR.*sin(tT),'Color','k','LineWidth',.7);
end
close(fig1)if nargin<2for i=1:size(Data,1)Name{i}=num2str(i);end
end
for i=1:length(order1)tT=theta4+(theta5-theta4).*(i-1)./(size(Data,1)-1);if tT<pi/2||tT>3*pi/2txtHdl(i)=text(ax,(1/30+1).*cos(tT),(1/30+1).*sin(tT),Name{order1(i)},...'FontSize',12,'Rotation',tT./pi.*180);elsetxtHdl(i)=text(ax,(1/30+1).*cos(tT),(1/30+1).*sin(tT),Name{order1(i)},...'FontSize',12,'Rotation',tT./pi.*180+180,'HorizontalAlignment','right');end
end
end
以下展示如何绘制环形树状图,更改标签,更改颜色字体线的粗细:
% ringTreeDemo% 20个变量
figure(1)
rng('default')
X=rand(20,3);
ringTree(X);% 50个变量
figure(2)
X=rand(50,3);
ringTree(X);% 随便定义变量名
Name{50}=[];
for i=1:50Name{i}=['slan',num2str(i)];
end
figure(3)
X=rand(50,3);
ringTree(X,Name);% 修饰文字和树
figure(4)
X=rand(50,3);
[treeHdl,txtHdl]=ringTree(X);
for i=1:length(treeHdl)treeHdl(i).Color=[0,0,.8];
end
for i=1:length(txtHdl)txtHdl(i).FontName='Cambria';txtHdl(i).Color=[.8,0,0];
end