Matlab實現極坐標堆疊柱狀圖的繪制
極坐標堆疊圖也是風玫瑰圖的常用形式,MATLAB的bar
繪制的條形圖可以繪制成堆疊形式,但是並沒有一個自帶函數可以繪制極坐標堆疊圖,而且極坐標下fill
函數也不能用,於是就考慮將數據進行累加,並多次調用polarhistogram
函數進行繪圖,我將這個過程變為瞭一個方便調用的類。
以下先說明這個類該咋用,之後再給出類的完整代碼:
part1: 函數介紹
基本使用
h的每一行代表要繪制一層柱狀圖的數據,這裡要繪制三層的堆疊柱狀圖:
h1=randi([8,18],[1,35])+rand([1,35]); h2=randi([2,8],[1,35])+rand([1,35]); h3=randi([0,3],[1,35])+rand([1,35]); h=[h1;h2;h3]; wr=windrose(h);% 構造堆疊圖類 wr=wr.draw(); % 繪圖
其中wr=windrose(h)
是構造類的過程,第一個輸入可以是高度矩陣,也可以是當前的極坐標區域,繪制的角度范圍可以省略。
角度范圍
構造函數的角度范圍可以省略,默認范圍為[0,2π],以下兩種寫法是等同的:
wr=windrose(h) wr=wr.draw()
wr=windrose(h,[0,2*pi]) wr=wr.draw()
調節到 [0,π]:
wr=windrose(h,[0,pi]) wr=wr.draw()
**不均勻角度:**比數據長度多1的角度序列,角度值要求[0,2π]范圍:
wr=windrose(h,[0:5:30,31:1:59]./59.*2.*pi); wr=wr.draw()
常用函數:改變樣式
基本上的線條顏色,線條透明度,面透明度,線條粗細等patch
對象具有的一系列屬性,均可以依靠此setStyle
函數設置:
線條顏色: EdgeColor
線條透明度: EdgeAlpha
面透明度: FaceAlpha
線條粗細:LineWidth
% 隨機數據生成並拼成矩陣 h1=randi([8,18],[1,35])+rand([1,35]); h2=randi([2,8],[1,35])+rand([1,35]); h3=randi([0,3],[1,35])+rand([1,35]); h=[h1;h2;h3]; wr=windrose(h);% 構造堆疊圖類 wr=wr.draw(); % 繪圖 % 圖像屬性設置 wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])
常用函數:設置下界
就是添加一個圓形把中心區域密集的線條遮蓋一下,例如想要設置下界限為4,可以再之前代碼最後加入:
wr.setLConf(4)
常用函數:修改顏色
修改一個顏色:(例)修改第二層的顏色:
wr.setColor([.1,.8,.1],2)
修改多個顏色:(例)修改第一、三層的顏色:
wr.setColor([0,.2,0;0 0 .2],[1,3])
添加圖例
請使用返回對象的Children
屬性添加圖例:
% 添加圖例 lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3'); lgd.Location='best';
part2: 完整類函數代碼
classdef windrose % @author : slandarer % 公眾號 : slandarer隨筆 % % 使用實例: % ========================================================================= % % 隨機數據生成並拼成矩陣 % h1=randi([8,18],[1,35])+rand([1,35]); % h2=randi([2,8],[1,35])+rand([1,35]); % h3=randi([0,3],[1,35])+rand([1,35]); % h=[h1;h2;h3]; % % wr=windrose(h);% 等同於 wr=windrose(h,[0,2*pi]); % % wr=windrose(h,[0:5:30,31:1:59]./59.*2.*pi); % wr=wr.draw(); % % wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2]) % wr.setLConf(4) % % % 將第二層變成綠 % % wr.setColor([.1,.8,.1],2) % % 將第一第二層變成黑色 % % wr.setColor([0,.2,0;0 0 .2],[1,3]) % % % 添加圖例 % lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3'); % lgd.Location='best'; properties HSet % mxn 大小數據,m組數據,每組n個柱 ThetaSet % 1x(n+1) 分隔角度 histType % 可初始化屬性 LConfHdl % 下邊界圖形對象 Parent Children end methods function obj=windrose(varargin) % 變量數據讀取及傳入 if isa(varargin{1},'matlab.graphics.axis.PolarAxes') ax=varargin{1};varargin(1)=[]; else ax=polaraxes(gcf); end hold on obj.Parent=ax; obj.HSet=varargin{1};varargin(1)=[]; if ~isempty(varargin)&&isfloat(varargin{1}) if length(varargin{1})==2 obj.ThetaSet=linspace(varargin{1}(1),varargin{1}(2),size(obj.HSet,2)+1); else obj.ThetaSet=varargin{1}; end varargin(1)=[]; else obj.ThetaSet=linspace(0,2*pi,size(obj.HSet,2)+1); end obj.histType=varargin; end function obj=draw(obj) % 循環繪圖 tCoLorList=lines(size(obj.HSet,1)); tHSet=cumsum(obj.HSet); for i=size(obj.HSet,1):-1:1 obj.Children(i)=polarhistogram(obj.Parent,'BinEdges',... obj.ThetaSet,'BinCounts',tHSet(i,:),'FaceAlpha',1,'FaceColor',tCoLorList(i,:),obj.histType{:}); end % ------------------------------------------------------------- % 繪制下邊界圓形 obj.LConfHdl=polarhistogram(obj.Parent,'BinEdges',linspace(0,2*pi,101),... 'BinCounts',ones([1,100]),'FaceColor','none','FaceAlpha',1,'EdgeColor','none'); end % ========================================================================= function setStyle(obj,varargin) % 設置屬性 for i=1:length(obj.Children) set(obj.Children(i),varargin{:}); end end function setLConf(obj,LConf)% 設置下邊界 if strcmp(LConf,'none') obj.LConfHdl.FaceColor='none'; else obj.LConfHdl.FaceColor=obj.Parent.Color; obj.LConfHdl.BinCounts=ones([1,100]).*LConf; end end function setColor(obj,colorList,n)% 顏色 k=1; for i=n set(obj.Children(i),'FaceColor',colorList(k,:)); k=k+1; end end end end
part3: 兩個使用示例
示例一
% windrose demo 1 % 隨機數據生成並拼成矩陣 h1=randi([8,18],[1,35])+rand([1,35]); h2=randi([2,8],[1,35])+rand([1,35]); h3=randi([0,3],[1,35])+rand([1,35]); h=[h1;h2;h3]; wr=windrose(h); wr=wr.draw(); % 圖像屬性設置 wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2]) % 添加下界限 wr.setLConf(4) % 將第二層變成綠 % wr.setColor([.1,.8,.1],2) % 將第一第二層變成黑色 % wr.setColor([0,.2,0;0 0 .2],[1,3]) % 添加圖例 lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3'); lgd.Location='best'; % 坐標區域修飾 ax=gca; ax.LineWidth=1.5; ax.GridLineStyle='-.'; ax.FontName='Cambria'; ax.FontSize=13;
示例二
% windrose demo 2 % 隨機數據生成並拼成矩陣 h1=randi([8,18],[1,35])+rand([1,35]); h2=randi([2,8],[1,35])+rand([1,35]); h3=randi([0,3],[1,35])+rand([1,35]); h=[h1;h2;h3]; % 生成極坐標區域,並更改背景顏色 ax=polaraxes(gcf); ax.Color=[60,60,60]./255; ax.GridColor=[212,217,217]./255; ax.LineWidth=1.5; ax.GridLineStyle='-.'; ax.FontName='Cambria'; ax.FontSize=13; % 生成風玫瑰圖 wr=windrose(ax,h); wr=wr.draw(); % 屬性修飾 wr.setStyle('LineWidth',1.2,'FaceAlpha',1,'EdgeColor',[.2,.2,.2]) wr.setLConf(4) % 修改顏色 colorList=[194,196,191; 212,217,217; 110,135,117]./255; wr.setColor(colorList,1:3)
到此這篇關於Matlab實現極坐標堆疊柱狀圖的繪制的文章就介紹到這瞭,更多相關Matlab堆疊柱狀圖內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!