這些各種各樣的花里胡哨的折線填充圖咋畫?
折線下面填充純色的話area函數(shù)很容易做到,但上面那些各種花里胡哨的填充圖就沒那么容易做到了,本期就來講講這些玩意都是咋畫的:
事先說明,為了繪圖好看本文絕大多數(shù)圖像都使用如下函數(shù)進(jìn)行修飾:
function defualtAxes
ax=gca;hold on;box on
ax.XGrid='on';
ax.YGrid='on';
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.LineWidth=.8;
ax.GridLineStyle='-.';
ax.FontName='Cambria';
ax.FontSize=12;
ax.GridAlpha=.03;
end
1 二維特殊填充
二維填充所用到的數(shù)據(jù)是由以下函數(shù)生成的:
function [X,Y1,Y2,Y3]=demoData()
X0=1:40;
Y01=[0,1,3,2,4,5,7,6,21,15,...
19,23,27,14,10,5,4,7,...
5,8,3,9,11,22,29,31,...
34,27,40,52,33,20,19,...
16,14,60,55,54,66,70];
Y02=[35,34,38,32,26,17,25,8,15,2,...
7,9,17,14,10,15,24,17,...
25,28,33,49,31,42,29,31,...
34,27,40,52,33,20,19,...
26,24,10,15,14,6,0];
X=linspace(1,40,500);
Y1=interp1(X0,Y01,X,'cubic');
Y2=interp1(X0,Y02,X,'cubic');
Y3=X+3;
end
三條折線大概長(zhǎng)這樣:
我們需要數(shù)據(jù)點(diǎn)盡可能的密集,因此可以適當(dāng)插插值。
1.1 懸掛填充折線圖
這個(gè)很簡(jiǎn)單就是兩次fill即可:
% 懸掛填充折線圖
% 獲取數(shù)據(jù)
[X,Y1,Y2,Y3]=demoData();
hold on
% Uy:上面的輔助線y值,Ly:下面的輔助線y值
Uy=40;Ly=20;
yline(Uy,'LineWidth',.8,'LineStyle','--')
yline(Ly,'LineWidth',.8,'LineStyle','--')
% 填充顏色
UY=Y1;UY(UY<Uy)=Uy;
fill([X(1),X,X(end)],[Uy,UY,Uy],[255,153,154]./255,'EdgeColor','none','FaceAlpha',.9)
LY=Y1;LY(LY>Ly)=Ly;
fill([X(1),X,X(end)],[Ly,LY,Ly],[153,153,253]./255,'EdgeColor','none','FaceAlpha',.9)
% 繪制折線圖
plot(X,Y1,'LineWidth',1,'Color',[0,0,0])
% 坐標(biāo)區(qū)域修飾
defualtAxes()
1.2 雙關(guān)系填充
就是看兩條折線關(guān)系,根據(jù)大小關(guān)系賦予不同顏色:
% 雙關(guān)系填充
% 獲取數(shù)據(jù)
[X,Y1,Y2,Y3]=demoData();
hold on
% 獲取Y軸數(shù)據(jù)范圍
YY=[Y1,Y3];
YLim=[min(YY),max(YY)];
% 構(gòu)造并繪制網(wǎng)格
[XMesh,YMesh]=meshgrid(X,linspace(YLim(1),YLim(2),1000));
YMeshA=repmat(Y1,[1000,1]);
YMeshB=repmat(Y3,[1000,1]);
CMesh=nan.*XMesh;
CMesh(YMesh>=YMeshB&YMesh<=YMeshA)=1;
CMesh(YMesh>=YMeshA&YMesh<=YMeshB)=2;
surf(XMesh,YMesh,XMesh.*0,'EdgeColor','none','CData',CMesh,'FaceColor','flat','FaceAlpha',.8)
% 設(shè)置配色
ColorList=[255,153,154;153,153,253]./255;
colormap(ColorList)
% 繪制折線圖
plot(X,Y1,'LineWidth',1,'Color',[0,0,0])
plot(X,Y3,'LineWidth',1,'Color',[0,0,0])
% 坐標(biāo)區(qū)域修飾
defualtAxes()
1.3 雙關(guān)系漸變填充
根據(jù)倆折線差值大小和正負(fù)填充不同顏色,這里使用了含nan的surf函數(shù)繪制填充形狀:
% 雙關(guān)系漸變填充
% 獲取數(shù)據(jù)
[X,Y1,Y2,Y3]=demoData();
hold on
% 獲取Y軸數(shù)據(jù)范圍
YY=[Y1,Y3];
YLim=[min(YY),max(YY)];
% 構(gòu)造并繪制網(wǎng)格
[XMesh,YMesh]=meshgrid(X,linspace(YLim(1),YLim(2),1000));
YMeshA=repmat(Y1,[1000,1]);
YMeshB=repmat(Y3,[1000,1]);
CMesh=nan.*XMesh;
YMeshD=YMeshA-YMeshB;
CMesh(YMesh>=YMeshB&YMesh<=YMeshA)=YMeshD(YMesh>=YMeshB&YMesh<=YMeshA);
CMesh(YMesh>=YMeshA&YMesh<=YMeshB)=YMeshD(YMesh>=YMeshA&YMesh<=YMeshB);
surf(XMesh,YMesh,XMesh.*0,'EdgeColor','none','CData',CMesh,'FaceColor','flat','FaceAlpha',.8)
% 設(shè)置配色
colormap(turbo(32))
% colormap(slanCM(100,32))
colorbar
% 繪制折線圖
plot(X,Y1,'LineWidth',1,'Color',[0,0,0])
plot(X,Y3,'LineWidth',1,'Color',[0,0,0])
% 坐標(biāo)區(qū)域修飾
defualtAxes()
想要更豐富配色可以使用slanCM工具:https://slandarer.blog.csdn.net/article/details/127719784
1.4 單變量漸變填充
這個(gè)就簡(jiǎn)單很多,就是和自己的最小值作比較。
% 單變量漸變填充
% 獲取數(shù)據(jù)
[X,Y1,Y2,Y3]=demoData();
hold on
% 獲取Y軸數(shù)據(jù)范圍
YY=Y1;
YLim=[min(YY),max(YY)];
% 構(gòu)造并繪制網(wǎng)格
[XMesh,YMesh]=meshgrid(X,linspace(YLim(1),YLim(2),1000));
YMeshA=repmat(YY,[1000,1]);
CMesh=nan.*XMesh;
YMeshD=YMeshA-YLim(1);
CMesh(YMesh>=YLim(1)&YMesh<=YMeshA)=YMeshD(YMesh>=YLim(1)&YMesh<=YMeshA);
surf(XMesh,YMesh,XMesh.*0,'EdgeColor','none','CData',CMesh,'FaceColor','flat','FaceAlpha',.8)
% 設(shè)置配色
colormap(turbo(32))
colormap(slanCM(136,32))
colorbar
% 繪制折線圖
plot(X,YY,'LineWidth',1,'Color',[0,0,0])
% 坐標(biāo)區(qū)域修飾
defualtAxes()
1.5 單變量橫向漸變填充
橫向條紋填充,和旁邊colorbar完全對(duì)的上:
% 單變量橫向漸變填充
% 獲取數(shù)據(jù)
[X,Y1,Y2,Y3]=demoData();
hold on
% 獲取Y軸數(shù)據(jù)范圍
YY=Y1;
YLim=[min(YY),max(YY)];
% 構(gòu)造并繪制網(wǎng)格
[XMesh,YMesh]=meshgrid(X,linspace(YLim(1),YLim(2),1000));
YMeshA=repmat(YY,[1000,1]);
CMesh=nan.*XMesh;
CMesh(YMesh>=YLim(1)&YMesh<=YMeshA)=YMesh(YMesh>=YLim(1)&YMesh<=YMeshA);
surf(XMesh,YMesh,XMesh.*0,'EdgeColor','none','CData',CMesh,'FaceColor','flat','FaceAlpha',.8)
% 設(shè)置配色
colormap(turbo(32))
colormap(slanCM(141,32))
colorbar
% 繪制折線圖
plot(X,YY,'LineWidth',1,'Color',[0,0,0])
% 坐標(biāo)區(qū)域修飾
defualtAxes()
1.6 區(qū)域填充
% 區(qū)域填充
% 獲取數(shù)據(jù)
[X,Y1,Y2,Y3]=demoData();
hold on
% 設(shè)置填充區(qū)域范圍
UXLim=[20,30];
xline(UXLim(1),'LineWidth',.8,'LineStyle','--')
xline(UXLim(2),'LineWidth',.8,'LineStyle','--')
% 填充顏色
YY=Y1;
UY=YY(X<=UXLim(2)&X>=UXLim(1));
UX=X(X<=UXLim(2)&X>=UXLim(1));
fill([UXLim(1),UX,UXLim(end)],[min(YY),UY,min(YY)],[255,153,154]./255,'EdgeColor','none','FaceAlpha',.9)
% 繪制折線圖
plot(X,Y1,'LineWidth',1,'Color',[0,0,0])
% 坐標(biāo)區(qū)域修飾
defualtAxes()
1.7 分段x軸區(qū)域填充
就多分幾段多填幾種顏色:
% 分段X軸區(qū)域填充
% 獲取數(shù)據(jù)
[X,Y1,Y2,Y3]=demoData();
hold on
% 設(shè)置間斷點(diǎn)和顏色
pwPnt=[10,20,30];
ColorList=[0.8275 0.7294 0.4078
0.8353 0.4118 0.3647
0.3647 0.5490 0.6588
0.3961 0.6431 0.4745];
colormap(ColorList)
% 獲取Y軸數(shù)據(jù)范圍
YY=Y1;
YLim=[min(YY),max(YY)];
% 構(gòu)造并繪制網(wǎng)格
[XMesh,YMesh]=meshgrid(X,linspace(YLim(1),YLim(2),1000));
YMeshA=repmat(YY,[1000,1]);
CMesh=nan.*XMesh;
pwPnt=[min(X),pwPnt,max(X)];
for i=1:length(pwPnt)-1
CMesh(YMesh<=YMeshA&XMesh>=pwPnt(i)&XMesh<=pwPnt(i+1))=i;
end
surf(XMesh,YMesh,XMesh.*0,'EdgeColor','none','CData',CMesh,'FaceColor','flat','FaceAlpha',.7)
% 繪制分界線
for i=1:length(pwPnt)
plot(pwPnt([i,i]),[min(YY),interp1(X,YY,pwPnt(i),'linear')],'Color',[0,0,0],'LineWidth',1);
end
% 繪制折線圖
plot(X,Y1,'LineWidth',1,'Color',[0,0,0])
% 坐標(biāo)區(qū)域修飾
defualtAxes()
2 三維特殊填充
三維填充所用到的數(shù)據(jù)是由以下函數(shù)生成的:
function [X,Y]=demoDataN()
X1=normrnd(2,2,1,50);
X2=[normrnd(4,4,1,50),normrnd(5,2,1,50)];
X3=[normrnd(6,2,1,50),normrnd(8,4,1,50)];
X4=[normrnd(12,1,1,50),normrnd(12,4,1,50)];
X5=[normrnd(10,2,1,50),normrnd(10,4,1,50)];
X6=[normrnd(7,2,1,50),normrnd(7,4,1,50)];
X7=[normrnd(4,2,1,50),normrnd(4,4,1,50)];
Data={X1,X2,X3,X4,X5,X6,X7};
Y=zeros(7,500);
for i=1:length(Data)
tX=Data{i};tX=tX(:)';
[F,Xi]=ksdensity(tX,linspace(-5,10,500));
Y(i,:)=F;
end
X=Xi;
end
X是1xn向量,Y是7xn向量:
2.1 3D單色填充折線
fill3函數(shù)簡(jiǎn)簡(jiǎn)單單。
% 3D填充折線
% 獲取數(shù)據(jù)
[X,Y]=demoDataN();
% 設(shè)置顏色
colorList=[0.2549 0.2784 0.4196
0.4039 0.3294 0.4706
0.6196 0.3882 0.4549
0.7765 0.4824 0.4353
0.8706 0.6078 0.4431
0.9373 0.7373 0.5098
0.9843 0.8745 0.6353];
hold on
% 繪制填充
for i=1:size(Y,1)
fill3([X(1),X,X(end)],[i,X.*0+i,i],[min(Y(i,:)),Y(i,:),min(Y(i,:))],...
colorList(i,:),'FaceAlpha',.7,'EdgeColor','none')
end
% 繪制折線圖
for i=1:size(Y,1)
plot3(X,X.*0+i,Y(i,:),'LineWidth',1,'Color',colorList(i,:))
end
% 坐標(biāo)區(qū)域修飾
defualtAxes();
set(gca,'Projection','perspective','GridAlpha',.05)
view(39,45)
2.2 3D高度漸變填充折線
就把surf函數(shù)轉(zhuǎn)一下然后繪制多次即可:
% 3D高度漸變填充折線
% 獲取數(shù)據(jù)
[X,Y]=demoDataN();
YLim=[min(min(Y)),max(max(Y))];
% 構(gòu)造并繪制網(wǎng)格
[XMesh,YMesh]=meshgrid(X,linspace(YLim(1),YLim(2),1000));
hold on
for i=1:size(Y,1)
YMeshA=repmat(Y(i,:),[1000,1]);
CMesh=nan.*XMesh;
YMeshD=YMeshA-YLim(1);
CMesh(YMesh>=YLim(1)&YMesh<=YMeshA)=YMeshD(YMesh>=YLim(1)&YMesh<=YMeshA);
surf(XMesh,XMesh.*0+i,YMesh,'EdgeColor','none','CData',CMesh,'FaceColor','flat','FaceAlpha',.8)
end
% 繪制折線圖
for i=1:size(Y,1)
plot3(X,X.*0+i,Y(i,:),'LineWidth',1,'Color',[0,0,0,.8])
end
% 設(shè)置配色
colorList=turbo(64);
% colorList=slanCM(110,64);
colormap(colorList)
colorbar
% 坐標(biāo)區(qū)域修飾
defualtAxes();
set(gca,'Projection','perspective','GridAlpha',.05)
view(16,36)
3 其他填充
3.1 單色漸變填充
寫了個(gè)工具函數(shù):
function areah(varargin)
% @author : slandarer
if isa(varargin{1},'matlab.graphics.axis.Axes')
ax=varargin{1};varargin(1)=[];
else
ax=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
和area函數(shù)使用方法幾乎一模一樣,給出一組使用效果:
% areahDemo
% 生成數(shù)據(jù)
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);
y4=normpdf(x,-2,2)+normpdf(x,-3,2);
y5=normpdf(x,4,6)+normpdf(x,-3,2);
% 簡(jiǎn)單修飾坐標(biāo)區(qū)域1
ax1=axes(gcf,'Position',[0.1,0.54,0.44,0.44]);hold on
ax1.XLim=[-8,12];
ax1.YLim=[-.1,.5];
ax1.YTick=0:.1:.4;
ax1.XTickLabel='';
ax1.Box='on';
ax1.LineWidth=.8;
ax1.FontName='Cambria';
ax1.YLabel.String='YYYYY1';
% 繪制漸變面積圖
areah(x,y2,'Color',[150,60,59]./255,'LineWidth',1);
areah(x,y4,'Color',[74,156,167]./255,'LineWidth',1);
text(-7,.45,'(a)','FontSize',12,'FontName','Cambria')
text(0,.4,{'made by MATLAB';'follow slandarer'},'FontSize',12,'FontName','Cambria')
% 簡(jiǎn)單修飾坐標(biāo)區(qū)域2
ax2=axes(gcf,'Position',[0.54,0.54,0.44,0.44]);hold on
ax2.XLim=[-8,12];
ax2.YLim=[-.1,.5];
ax2.XTickLabel='';
ax2.YTickLabel='';
ax2.Box='on';
ax2.LineWidth=.8;
ax2.FontName='Cambria';
% 繪制漸變面積圖
areah(x,y2,'Color',[132,158,119]./255,'LineWidth',1);
areah(x,y4,'Color',[150,60,59]./255,'LineWidth',1);
areah(x,y5,'Color',[242,199,60]./255,'LineWidth',1);
text(-7,.45,'(b)','FontSize',12,'FontName','Cambria')
% 簡(jiǎn)單修飾坐標(biāo)區(qū)域3
ax3=axes(gcf,'Position',[0.1,0.1,0.44,0.44]);hold on
ax3.XLim=[-8,12];
ax3.YLim=[-.05,.3];
ax3.Box='on';
ax3.LineWidth=.8;
ax3.FontName='Cambria';
ax3.XLabel.String='XXXXX1';
ax3.YLabel.String='YYYYY2';
% 繪制漸變面積圖
areah(x,y1,'Color',[150,60,59]./255,'LineWidth',1);
areah(x,y2,'Color',[74,156,167]./255,'LineWidth',1);
areah(x,y3,'Color',[132,158,119]./255,'LineWidth',1);
text(-7,.25,'(c)','FontSize',12,'FontName','Cambria')
annotation('textarrow',[.35,.3],[.4,.35],'String','noting to write','FontSize',12,'FontName','Cambria')
% 簡(jiǎn)單修飾坐標(biāo)區(qū)域4
ax4=axes(gcf,'Position',[0.54,0.1,0.44,0.44]);hold on
ax4.XLim=[-8,12];
ax4.YLim=[-.05,.3];
ax4.YTickLabel='';
ax4.Box='on';
ax4.LineWidth=.8;
ax4.FontName='Cambria';
ax4.XLabel.String='XXXXX2';
% 繪制漸變面積圖
areah(x,y2,'Color',[132,158,119]./255,'LineWidth',1);
areah(x,y5,'Color',[242,199,60]./255,'LineWidth',1);
text(-7,.25,'(d)','FontSize',12,'FontName','Cambria')
3.2 一個(gè)area函數(shù)使用實(shí)例
官網(wǎng)上其實(shí)咋用已經(jīng)寫的很清楚了(詳見官網(wǎng)https://ww2.mathworks.cn/help/matlab/ref/area.html),這里給個(gè)畫的比較好看的Pi可視化的案例:文章來源:http://www.zghlxwxcb.cn/news/detail-415036.html
% 獲取pi前500位小數(shù)
Pi=getPi(500);
% 計(jì)算比例變化
Ratio=cumsum(Pi==(0:9)',2);
Ratio=Ratio./sum(Ratio);
% 配色列表
CM=[231,98,84;239,138,71;247,170,88;255,208,111;255,230,183;
170,220,224;114,188,213;82,143,173;55,103,149;30,70,110]./255;
% 繪制堆疊面積圖
hold on
areaHdl=area(Ratio');
for i=1:10
areaHdl(i).FaceColor=CM(i,:);
areaHdl(i).FaceAlpha=.9;
end
% 圖窗和坐標(biāo)區(qū)域修飾
set(gcf,'Position',[200,100,720,420]);
ax=gca;
ax.YLim=[0,1];
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.LineWidth=.8;
ax.FontName='Cambria';
ax.FontSize=11;
ax.TickDir='out';
ax.XLabel.String='Decimals';
ax.YLabel.String='Proportion';
ax.XLabel.FontSize=13;
ax.YLabel.FontSize=13;
ax.Title.String='Area Chart of Proportion — 500 digits';
ax.Title.FontSize=14;
% 繪制圖例并修飾
lgdHdl=legend(num2cell('0123456789'));
lgdHdl.NumColumns=5;
lgdHdl.FontSize=11;
lgdHdl.Location='southeast';
function Pi=getPi(n)
if nargin<1,n=3;end
Pi=char(vpa(sym(pi),n+10));
Pi=abs(Pi)-48;
Pi=Pi(3:n+2);
end
文章來源地址http://www.zghlxwxcb.cn/news/detail-415036.html
完
到了這里,關(guān)于MATLAB | 這些各種各樣的花里胡哨的折線填充圖咋畫的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!