利用Matlab實現(xiàn)陰影柱狀圖的繪制
陰影柱狀圖繪制的代碼MATHWORKS上也有,不過是生成圖片后,識別圖像上不同顏色塊并直接修改像素生成陰影線,這樣的生成方式不可逆且自由度較低,因此本人開發(fā)了一個直接畫線條填充的硬畫版本。
另:由于不太想動腦子,使用polyshape
對象進行了交點判定,減少了代碼出錯的概率,但由于代碼開發(fā)基于polyshape
對象,陰影柱狀圖繪制函數(shù)理論上需要至少R2017b
及之后版本才能使用(越新越好)。(再安利一下polyshape
對象,屬實太好用了)
由于工具函數(shù)過長,將被放在最后展示,以下將先展示函數(shù)用法。
示例圖
使用教程
1.基本使用
就短短三行代碼就能畫,真的簡單:
y=[2?2?-3?-2?-5;?-2?-5?6?2?5;?9?8?9?2?5]; SH=shadowHist(y,'ShadowType',{'/','\','.','x','|'}); SH=SH.draw();
2.添加圖例
使用legend
函數(shù)添加圖例,使用方式如下:
y=[2?2?3?2?5;?2?5?6?2?5;?9?8?9?2?5]; SH=shadowHist(y,'ShadowType',{'/','\','.','_','+'}); SH=SH.draw(); SH=SH.legend({'AAAAAAA','BBBBBBB','CCCCCCC','DDDDDDD','EEEEEEE'},'FontName','Arial','FontSize',11);
圖例是自行繪制的,能拖動及自動縮放(老難算了這玩意):
3.陰影格式
陰影有:\
,/
,_
,|
,+
,x
,.
,w
,k
,g
十種格式,以下全部展示一下:
y=[2?2?3?2?5?4?2?2?2?1;2?2?3?2?5?4?2?4?3?6]; SH=shadowHist(y,'ShadowType',{'/','\','x','.','_','|','+','w','k','g'}); SH=SH.draw(); SH=SH.legend({'A','B','C','D','E','F','G','H','I','J'});
4.特殊結(jié)構(gòu)
含負數(shù)
y=[2?2?-3?-2?-5;?-2?-5?6?2?5;?9?8?9?2?5]; SH=shadowHist(y,'ShadowType',{'/','\','.','x','|'}); SH=SH.draw();
堆疊柱狀圖
y=[2?2?-3?-2?-5;?-2?-5?6?2?5;?9?8?9?2?5;?-3?-5?6?2?5;?4?8?5?2?5]; SH=shadowHist(y,'ShadowType',{'/','\','.','x','|'},'stacked'); SH=SH.draw();
5.額外修飾
陰影、柱狀圖框、圖例框分別具有barShadow
,barBox
,lgdBox
的標簽,使用findobj
獲取對象并循環(huán)修飾即可,不過為了繪制更好看,部分陰影使用plot
繪制部分則是使用scatter
繪制,因此陰影修飾時要用if先檢測一下格式,給個示例:
y=[2?2?3?2?5;?2?5?6?2?5;?9?8?9?2?5]; SH=shadowHist(y,'ShadowType',{'/','\','.','_','+'}); SH=SH.draw(); SH=SH.legend({'AAAAAAA','BBBBBBB','CCCCCCC','DDDDDDD','EEEEEEE'},'FontName','Cambria','FontSize',11); %?修飾陰影變成紅色并加粗 shadowHdl=findobj('Tag','barShadow'); for?i=1:length(shadowHdl) ????if?isa(shadowHdl(i),'matlab.graphics.chart.primitive.Line') ????????shadowHdl(i).Color=[.8,.6,.6]; ????????shadowHdl(i).LineWidth=1; ????else ????????shadowHdl(i).MarkerFaceColor=[.8,.6,.6]; ????????shadowHdl(i).SizeData=5; ????end end %?修飾框變?yōu)樗{色并加粗 boxHdl=findobj('Tag','barBox'); for?i=1:length(boxHdl) ????boxHdl(i).EdgeColor=[.3,.3,.8]; ????boxHdl(i).LineWidth=2; end %?圖例框加粗并變成綠色 lgdBox=findobj('Tag','lgdBox'); lgdBox.LineWidth=1.3; lgdBox.EdgeColor=[.1,.3,.1]; lgdBox.FaceColor=[173,189,163]./255;
光看上面代碼大佬們應(yīng)該就已經(jīng)懂了咋用,如果比較小白,可以直接使用MATLAB自帶的屬性修飾器:
點擊:查看->屬性修飾器
點擊選中對象即可立即修飾顏色、粗細等各種格式:
工具函數(shù)完整代碼
classdef shadowHist % @author : slandarer % 公眾號 : slandarer隨筆 % 知乎 : hikari % 使用示例: % ========================================================================= % y=[2 2 3 2 5; 2 5 6 2 5; 9 8 9 2 5]; % % SH=shadowHist(y,'ShadowType',{'/','\','.','x','|'}); % SH=SH.draw(); properties ax % 繪圖坐標區(qū)域 YData % 數(shù)值矩陣 shadowTypeList={'\','/','_','|','+','x','.','w','k','g'} shadowType % 陰影類型 otherProp % 其他初始屬性 oriBarHdl % 原始圖形句柄 newBarHdl pshapeHdl % polyshape圖形句柄 groupNum % 組數(shù) classNum % 類數(shù) YEndMat % 末端y值 maxY % 最大Y值 minY=0 % 最小Y值 diffY % Y值之差 BarW % 寬度 YSep1 % linspace(obj.minY,obj.maxY+.02.*obj.diffY,obj.lineNum) YSep2 XMean % 每組柱狀圖每個柱子的中心位置 lineNum=90 % 陰影基礎(chǔ)線數(shù)量 XYRate SHLegend oriLegend end methods function obj=shadowHist(varargin) % 基礎(chǔ)屬性設(shè)置 if isa(varargin{1},'matlab.graphics.axis.Axes') obj.ax=varargin{1};varargin(1)=[]; else obj.ax=gca; end hold(obj.ax,'on'); obj.YData=varargin{1};varargin(1)=[]; if any(strcmpi('shadowType',varargin)) tind=find(strcmpi('shadowType',varargin)); obj.shadowType=varargin{tind+1}; varargin([tind,tind+1])=[]; else obj.shadowType=obj.shadowTypeList; end obj.otherProp=varargin; help shadowHist end function obj=draw(obj) % 基礎(chǔ)繪圖 obj.oriBarHdl=bar(obj.ax,obj.YData,obj.otherProp{:},'Tag','barBox'); obj.XYRate=diff(obj.ax.YLim)./diff(obj.ax.XLim); % 更多屬性獲取 obj.YEndMat=zeros([length(obj.oriBarHdl),length(obj.oriBarHdl(1).XData)]); for i=1:length(obj.oriBarHdl) obj.YEndMat(i,:)=obj.oriBarHdl(i).YEndPoints; end obj.maxY=max(obj.YEndMat,[],[1,2]); obj.minY=min(0,min(obj.YEndMat,[],[1,2])); obj.diffY=obj.maxY-obj.minY; obj.classNum=length(obj.oriBarHdl); obj.groupNum=length(obj.oriBarHdl(1).XData); % 計算柱狀圖寬度和位置 % obj.XMean=linspace(-obj.classNum+1,obj.classNum-1,obj.classNum)./(3+2*obj.classNum); for i=1:obj.classNum obj.XMean(i)=obj.oriBarHdl(i).XEndPoints(1)-1; end tXMean=[obj.XMean,1];obj.BarW=(tXMean(2)-tXMean(1))./2.*obj.oriBarHdl(1).BarWidth; if strcmp(obj.oriBarHdl(1).BarLayout,'stacked') obj.BarW=1./2.*obj.oriBarHdl(1).BarWidth; end YY1=linspace(obj.minY,obj.maxY+.02.*obj.diffY,obj.lineNum)'; YY2=linspace(obj.minY-.02.*obj.diffY,obj.maxY,obj.lineNum)'; obj.YSep1=YY1(1)-YY2(2);obj.YSep2=YY1(2)-YY1(1); % 循環(huán)繪制陰影 for i=1:obj.classNum obj.oriBarHdl(i).FaceColor='none'; obj.oriBarHdl(i).LineWidth=.8; if strcmp(obj.oriBarHdl(1).BarLayout,'stacked') obj.oriBarHdl(i).LineWidth=.8; end tType=mod(i-1,length(obj.shadowType))+1; switch obj.shadowType{tType} case 'w',obj.oriBarHdl(i).FaceColor=[1,1,1]; case 'k',obj.oriBarHdl(i).FaceColor=[0,0,0]; case 'g',obj.oriBarHdl(i).FaceColor=[.5,.5,.5]; end for j=1:obj.groupNum tX=[-1,1,1,-1].*obj.BarW+obj.XMean(i)+j; tY=[obj.oriBarHdl(i).YEndPoints(j)-obj.oriBarHdl(i).YData(j),... obj.oriBarHdl(i).YEndPoints(j)-obj.oriBarHdl(i).YData(j),... obj.oriBarHdl(i).YEndPoints(j),... obj.oriBarHdl(i).YEndPoints(j)]; tPolyPhape=polyshape(tX,tY); switch obj.shadowType{tType} case '\' XX1=-1.2.*ones([obj.lineNum,1]).*obj.BarW+obj.XMean(i)+j; XX2=1.2.*ones([obj.lineNum,1]).*obj.BarW+obj.XMean(i)+j; YY1=linspace(obj.minY,obj.maxY+.02.*obj.diffY,obj.lineNum)'; YY2=linspace(obj.minY-.02.*obj.diffY,obj.maxY,obj.lineNum)'; tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]); for k=1:obj.lineNum [in,~]=intersect(tPolyPhape,[XX1(k),YY1(k);XX2(k),YY2(k)]); if ~isempty(in) tXX(:,k)=[in(1,1);in(end,1);nan]; tYY(:,k)=[in(1,2);in(end,2);nan]; else tXX(:,k)=[nan;nan;nan]; tYY(:,k)=[nan;nan;nan]; end end plot(tXX(:),tYY(:),'Color',[0,0,0],'LineWidth',.5,'Tag','barShadow') case '/' XX1=-1.2.*ones([obj.lineNum,1]).*obj.BarW+obj.XMean(i)+j; XX2=1.2.*ones([obj.lineNum,1]).*obj.BarW+obj.XMean(i)+j; YY1=linspace(obj.minY-.02.*obj.diffY,obj.maxY,obj.lineNum)'; YY2=linspace(obj.minY,obj.maxY+.02.*obj.diffY,obj.lineNum)'; tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]); for k=1:obj.lineNum [in,~]=intersect(tPolyPhape,[XX1(k),YY1(k);XX2(k),YY2(k)]); if ~isempty(in) tXX(:,k)=[in(1,1);in(end,1);nan]; tYY(:,k)=[in(1,2);in(end,2);nan]; else tXX(:,k)=[nan;nan;nan]; tYY(:,k)=[nan;nan;nan]; end end plot(tXX(:),tYY(:),'Color',[0,0,0],'LineWidth',.5,'Tag','barShadow') case '_' tXX=[tX(1),tX(2),nan]; tYY=linspace(obj.minY-.02.*obj.diffY,obj.maxY+.02.*obj.diffY,obj.lineNum)'; tYY(tYY>=max(tY))=[];tYY(tYY<=min(tY))=[]; tXX=repmat(tXX,[length(tYY),1])'; tYY=repmat(tYY,[1,size(tXX,1)])'; plot(tXX(:),tYY(:),'Color',[0,0,0],'LineWidth',.5,'Tag','barShadow') case '|' tXX=linspace(tX(1),tX(2),5); if strcmp(obj.oriBarHdl(1).BarLayout,'stacked') tXX=linspace(tX(1),tX(2),9); end tXX=tXX(2:end-1); tYY=[tY(2),tY(3),nan]'; tXX=repmat(tXX,[length(tYY),1]); tYY=repmat(tYY,[1,size(tXX,2)]); plot(tXX(:),tYY(:),'Color',[0,0,0],'LineWidth',.5,'Tag','barShadow') case '+' tXX=[tX(1),tX(2),nan]; tYY=linspace(obj.minY-.02.*obj.diffY,obj.maxY+.02.*obj.diffY,obj.lineNum)'; tYY(tYY>=max(tY))=[];tYY(tYY<=min(tY))=[]; tXX1=repmat(tXX,[length(tYY),1])'; tYY1=repmat(tYY,[1,size(tXX1,1)])'; tXX=linspace(tX(1),tX(2),5); if strcmp(obj.oriBarHdl(1).BarLayout,'stacked') tXX=linspace(tX(1),tX(2),9); end tXX=tXX(2:end-1); tYY=[tY(2),tY(3),nan]'; tXX2=repmat(tXX,[length(tYY),1]); tYY2=repmat(tYY,[1,size(tXX2,2)]); plot([tXX1(:);nan;tXX2(:)],[tYY1(:);nan;tYY2(:)],'Color',[0,0,0],'LineWidth',.5,'Tag','barShadow') case 'x' XX1=-1.2.*ones([obj.lineNum,1]).*obj.BarW+obj.XMean(i)+j; XX2=1.2.*ones([obj.lineNum,1]).*obj.BarW+obj.XMean(i)+j; YY1=linspace(obj.minY-obj.BarW.*2.4.*obj.XYRate,obj.maxY,obj.lineNum)'; YY2=YY1+obj.BarW.*2.4.*obj.XYRate; tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]); for k=1:obj.lineNum [in,~]=intersect(tPolyPhape,[XX1(k),YY1(k);XX2(k),YY2(k)]); if ~isempty(in) tXX(:,k)=[in(1,1);in(end,1);nan]; tYY(:,k)=[in(1,2);in(end,2);nan]; else tXX(:,k)=[nan;nan;nan]; tYY(:,k)=[nan;nan;nan]; end end;tXX1=tXX(:);tYY1=tYY(:); YY1=linspace(obj.minY,obj.maxY+obj.BarW.*2.4.*obj.XYRate,obj.lineNum)'; YY2=YY1-obj.BarW.*2.4.*obj.XYRate; tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]); for k=1:obj.lineNum [in,~]=intersect(tPolyPhape,[XX1(k),YY1(k);XX2(k),YY2(k)]); if ~isempty(in) tXX(:,k)=[in(1,1);in(end,1);nan]; tYY(:,k)=[in(1,2);in(end,2);nan]; else tXX(:,k)=[nan;nan;nan]; tYY(:,k)=[nan;nan;nan]; end end;tXX2=tXX(:);tYY2=tYY(:); plot([tXX1(:);nan;tXX2(:)],[tYY1(:);nan;tYY2(:)],'Color',[0,0,0],'LineWidth',.5,'Tag','barShadow') case '.' tXX=linspace(tX(1)+obj.BarW./4,tX(2)-obj.BarW./4,3); if strcmp(obj.oriBarHdl(1).BarLayout,'stacked') tXX=linspace(tX(1)+obj.BarW./8,tX(2)-obj.BarW./8,9); end tYY=linspace(obj.minY-.02.*obj.diffY,obj.maxY+.02.*obj.diffY,obj.lineNum)'; tYY(tYY>=max(tY))=[];tYY(tYY<=min(tY))=[]; tXX=repmat(tXX,[length(tYY),1]); tYY=repmat(tYY,[1,size(tXX,2)]); scatter(tXX(:),tYY(:),2,'filled','o','MarkerEdgeColor','none','MarkerFaceColor',[0,0,0],'Tag','barShadow') end end end end function obj=legend(obj,cellStr,varargin) obj.newBarHdl=bar(obj.ax,obj.YData,obj.otherProp{:},'FaceColor','none','EdgeColor','none'); obj.oriLegend=legend(obj.newBarHdl,cellStr,varargin{:}); obj.oriLegend.AutoUpdate='off'; obj.oriLegend.Box='off'; obj.ax.XLim=obj.ax.XLim; obj.ax.YLim=obj.ax.YLim; tXYMin=(obj.oriLegend.Position(1:2)-obj.ax.Position(1:2))./obj.ax.Position(3:4).*[diff(obj.ax.XLim),diff(obj.ax.YLim)]+[obj.ax.XLim(1),obj.ax.YLim(1)]; tXYMax=(obj.oriLegend.Position(1:2)+obj.oriLegend.Position(3:4)-obj.ax.Position(1:2))./obj.ax.Position(3:4).*[diff(obj.ax.XLim),diff(obj.ax.YLim)]+[obj.ax.XLim(1),obj.ax.YLim(1)]; boxHdl=fill([tXYMin(1),tXYMax(1),tXYMax(1),tXYMin(1)],[tXYMin(2),tXYMin(2),tXYMax(2),tXYMax(2)],[1,1,1],'Tag','lgdBox'); for n=1:length((obj.oriBarHdl)) ttType=mod(n-1,length(obj.shadowType))+1; squareHdl(n)=fill([0,0,0],[0,0,0],[1,1,1],'EdgeColor',[0,0,0],'LineWidth',.7,'Tag','barBox'); if strcmp(obj.shadowType{ttType},'.') lgdLineHdl(n)=scatter(0,0,2,'filled','o','MarkerEdgeColor','none','MarkerFaceColor',[0,0,0],'Tag','barShadow'); else lgdLineHdl(n)=plot(0,0,'Color',[0,0,0],'LineWidth',.5,'Tag','barBox','Tag','barShadow'); end end moveLgd() set(obj.ax.Parent,'WindowButtonMotionFcn',@moveLgd); function moveLgd(~,~) XYMin=(obj.oriLegend.Position(1:2)-obj.ax.Position(1:2))./obj.ax.Position(3:4).*[diff(obj.ax.XLim),diff(obj.ax.YLim)]+[obj.ax.XLim(1),obj.ax.YLim(1)]; XYMax=(obj.oriLegend.Position(1:2)+obj.oriLegend.Position(3:4)-obj.ax.Position(1:2))./obj.ax.Position(3:4).*[diff(obj.ax.XLim),diff(obj.ax.YLim)]+[obj.ax.XLim(1),obj.ax.YLim(1)]; boxHdl.XData=[XYMin(1),XYMax(1),XYMax(1),XYMin(1)]; boxHdl.YData=[XYMin(2),XYMin(2),XYMax(2),XYMax(2)]; Y=XYMin(2)+(XYMax(2)-XYMin(2)).*linspace(1/length(obj.newBarHdl)/2+1/50,1-1/length(obj.newBarHdl)/2-1/50,length(obj.newBarHdl)); obj.XYRate=diff(obj.ax.YLim)./diff(obj.ax.XLim); PBA=obj.ax.PlotBoxAspectRatio(2)./obj.ax.PlotBoxAspectRatio(1)./0.7896; Y=fliplr(Y); for i=1:length((obj.oriBarHdl)) tX=XYMin(1)+(XYMax(2)-XYMin(2))./2./length(obj.newBarHdl).*[1/10,1.18,1.18,1/10].*(PBA./obj.XYRate.*3); tY=Y(i)+0.75.*[-1,-1,1,1].*(XYMax(2)-XYMin(2))./2./length(obj.newBarHdl); squareHdl(i).XData=tX; squareHdl(i).YData=tY; tPolyPhape=polyshape(tX,tY); tType=mod(i-1,length(obj.shadowType))+1; switch obj.shadowType{tType} case '\' XX1=ones([51,1]).*(tX(1)-.2.*(tX(2)-tX(1))); XX2=ones([51,1]).*(tX(2)+.2.*(tX(2)-tX(1))); YY1=((-25:1:25).*obj.YSep2+obj.YSep1+Y(i))'; YY2=((-25:1:25).*obj.YSep2-obj.YSep1+Y(i))'; tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]); for k=1:51 [in,~]=intersect(tPolyPhape,[XX1(k),YY1(k);XX2(k),YY2(k)]); if ~isempty(in) tXX(:,k)=[in(1,1);in(end,1);nan]; tYY(:,k)=[in(1,2);in(end,2);nan]; else tXX(:,k)=[nan;nan;nan]; tYY(:,k)=[nan;nan;nan]; end end lgdLineHdl(i).XData=tXX(:)'; lgdLineHdl(i).YData=tYY(:)'; case '/' XX1=ones([51,1]).*(tX(1)-.2.*(tX(2)-tX(1))); XX2=ones([51,1]).*(tX(2)+.2.*(tX(2)-tX(1))); YY1=((-25:1:25).*obj.YSep2-obj.YSep1+Y(i))'; YY2=((-25:1:25).*obj.YSep2+obj.YSep1+Y(i))'; tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]); for k=1:51 [in,~]=intersect(tPolyPhape,[XX1(k),YY1(k);XX2(k),YY2(k)]); if ~isempty(in) tXX(:,k)=[in(1,1);in(end,1);nan]; tYY(:,k)=[in(1,2);in(end,2);nan]; else tXX(:,k)=[nan;nan;nan]; tYY(:,k)=[nan;nan;nan]; end end lgdLineHdl(i).XData=tXX(:); lgdLineHdl(i).YData=tYY(:); case '_' tXX=[tX(1),tX(2),nan]; tYY=linspace(tY(2),tY(3),5)';tYY=tYY(2:4); tXX=repmat(tXX,[length(tYY),1])'; tYY=repmat(tYY,[1,size(tXX,1)])'; lgdLineHdl(i).XData=tXX(:); lgdLineHdl(i).YData=tYY(:); case '|' tXX=linspace(tX(1),tX(2),11);tXX=tXX(2:end-1); tYY=[tY(2),tY(3),nan]'; tXX=repmat(tXX,[length(tYY),1]); tYY=repmat(tYY,[1,size(tXX,2)]); lgdLineHdl(i).XData=tXX(:); lgdLineHdl(i).YData=tYY(:); case '+' tXX=[tX(1),tX(2),nan]; tYY=linspace(tY(2),tY(3),5)';tYY=tYY(2:4); tXX1=repmat(tXX,[length(tYY),1])'; tYY1=repmat(tYY,[1,size(tXX1,1)])'; tXX=linspace(tX(1),tX(2),11);tXX=tXX(2:end-1); tYY=[tY(2),tY(3),nan]'; tXX2=repmat(tXX,[length(tYY),1]); tYY2=repmat(tYY,[1,size(tXX2,2)]); lgdLineHdl(i).XData=[tXX1(:);nan;tXX2(:)]; lgdLineHdl(i).YData=[tYY1(:);nan;tYY2(:)]; case 'x' XX1=ones([51,1]).*(tX(1)-.2.*(tX(2)-tX(1))); XX2=ones([51,1]).*(tX(2)+.2.*(tX(2)-tX(1))); YY1=((-25:1:25).*obj.YSep2-obj.YSep1+Y(i))'; YY2=YY1+(tX(2)-tX(1)+.4.*(tX(2)-tX(1))).*obj.XYRate; tXX=zeros([3,51]);tYY=zeros([3,51]); for k=1:51 [in,~]=intersect(tPolyPhape,[XX1(k),YY1(k);XX2(k),YY2(k)]); if ~isempty(in) tXX(:,k)=[in(1,1);in(end,1);nan]; tYY(:,k)=[in(1,2);in(end,2);nan]; else tXX(:,k)=[nan;nan;nan]; tYY(:,k)=[nan;nan;nan]; end end;tXX1=tXX(:);tYY1=tYY(:); YY2=((-25:1:25).*obj.YSep2-obj.YSep1+Y(i))'; YY1=YY2+(tX(2)-tX(1)+.4.*(tX(2)-tX(1))).*obj.XYRate; tXX=zeros([3,51]);tYY=zeros([3,51]); for k=1:51 [in,~]=intersect(tPolyPhape,[XX1(k),YY1(k);XX2(k),YY2(k)]); if ~isempty(in) tXX(:,k)=[in(1,1);in(end,1);nan]; tYY(:,k)=[in(1,2);in(end,2);nan]; else tXX(:,k)=[nan;nan;nan]; tYY(:,k)=[nan;nan;nan]; end end;tXX2=tXX(:);tYY2=tYY(:); lgdLineHdl(i).XData=[tXX1(:);nan;tXX2(:)]; lgdLineHdl(i).YData=[tYY1(:);nan;tYY2(:)]; case '.' tXX=linspace(tX(1),tX(2),9); tYY=linspace(tY(2)+(tY(3)-tY(2))/6,tY(3)-(tY(3)-tY(2))/6,3)'; tXX(1)=[];tXX(end)=[]; tXX=repmat(tXX,[length(tYY),1]); tYY=repmat(tYY,[1,size(tXX,2)]); lgdLineHdl(i).XData=tXX(:); lgdLineHdl(i).YData=tYY(:); case 'w' squareHdl(i).FaceColor=[1,1,1]; case 'k' squareHdl(i).FaceColor=[0,0,0]; case 'g' squareHdl(i).FaceColor=[.5,.5,.5]; end end end end end % @author : slandarer % 公眾號 : slandarer隨筆 % 知乎 : hikari end
封面圖繪制代碼
y=[2?2?3?2?5;?2?5?6?2?5;?9?8?9?2?5]; SH=shadowHist(y,'ShadowType',{'/','\','.','_','+'}); SH=SH.draw(); SH=SH.legend({'AAAAAAA','BBBBBBB','CCCCCCC','DDDDDDD','EEEEEEE'},'FontName','Cambria','FontSize',11); %?坐標區(qū)域修飾 ax=gca; ax.FontName='Cambria'; ax.LineWidth=1.1; ax.XColor=[1,1,1].*.3; ax.YColor=[1,1,1].*.3; ax.XMinorTick='on'; ax.YMinorTick='on'; ax.XGrid='on'; ax.YGrid='on'; ax.Box='on'; ax.GridLineStyle='-.'; ax.GridAlpha=.1; %?圖例框修飾 lgdBox=findobj('Tag','lgdBox'); lgdBox.LineWidth=1.3;
以上就是利用Matlab實現(xiàn)陰影柱狀圖的繪制的詳細內(nèi)容,更多關(guān)于Matlab陰影柱狀圖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c++創(chuàng)建二維動態(tài)數(shù)組與內(nèi)存釋放問題
這篇文章主要介紹了c++創(chuàng)建二維動態(tài)數(shù)組與內(nèi)存釋放問題,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06詳細分析C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象
這篇文章主要介紹了C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象的的相關(guān)資料,文中代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-06-06C++中delete和delete[]的區(qū)別詳細介紹
一直對C++中的delete和delete[]的區(qū)別不甚了解,今天遇到了,上網(wǎng)查了一下,得出了結(jié)論,拿出來和大家分享一下2012-11-11C++:構(gòu)造函數(shù),析構(gòu)函數(shù)詳解
今天小編就為大家分享一篇關(guān)于C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2021-09-09