基於Matlab繪制小提琴圖的示例代碼
本文將為大傢詳細講解Matlab中小提琴圖的繪制函數及ggtheme主題修飾函數
violinChart 函數使用方法
寫瞭個matlab繪制小提琴圖的函數:
1.圖中小提琴狀區域為核密度曲線。
2.白色方塊為25%,75%分位數。
3.中間橫線為中位數。
4.白色點為離群值點。
5.豎著的黑線是去掉離群值點後點的上下限。
基礎使用,Y為矩陣
X=1:5; Y=randn(100,5); violinChart(gca,X,Y,[0 0.447 0.741],0.6);
- X | 橫坐標。
- Y | 數據集。
- FaceColor | 顏色,示例用的是[0 0.447 0.741]。
- width | 小提琴圖寬度,這裡取的是0.6,就是以兩個小提琴圖間距的0.6倍為概率密度的上限1。
基礎使用,Y為向量,X為標簽
X=[1.*ones(1,50),2.*ones(1,30),3.*ones(1,20),4.*ones(1,50),5.*ones(1,50)]; Y=randn(1,200)+sin(X); violinChart(gca,X,Y,[0 0.447 0.741]);
基礎使用,多個圖像繪制,並添加圖例
X1=[1:2:7,13]; Y1=randn(100,5)+sin(X1); X2=2:2:10; Y2=randn(100,5)+cos(X2); figure Hdl1=violinChart(gca,X1,Y1,[0 0.447 0.741]); Hdl2=violinChart(gca,X2,Y2,[0.850 0.325 0.098]); legend([Hdl1.F_legend,Hdl2.F_legend],{'randn+sin(x)','randn+cos(x)'});
violinChart 完整函數
若函數有更新則會將更新版本放入文末所示壓縮文件內。
function Hdl=violinChart(ax,X,Y,FaceColor,width) % @author slandarer % Hdl: 返回的圖形對象句柄結構體 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Hdl.F_density(i) | patch | 核密度分佈 % Hdl.F_outlier(i) | scatter | 離群值點 % Hdl.F_range95(i) | line | 去除離群值點後最大值及最小值 % Hdl.F_quantile(i) | patch | 四分位數框 % Hdl.F_medianLine(i)| line | 中位數 % % Hdl.F_legend | patch | 用於生成legend圖例的圖形對象 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % 請使用如下方式生成圖例: % Hdl1=violinChart(ax,X,Y,... ...) % Hdl2=violinChart(ax,X,Y,... ...) % ... ... % legend([Hdl1,Hdl2,... ...],{Name1,Name2,...}) % =========================================================== % 以下為使用實例代碼: % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % X1=[1:2:7,13]; % Y1=randn(100,5)+sin(X1); % X2=2:2:10; % Y2=randn(100,5)+cos(X2); % % Hdl1=violinChart(gca,X1,Y1,[0 0.447 0.741],0.5); % Hdl2=violinChart(gca,X2,Y2,[0.850 0.325 0.098],0.5); % legend([Hdl1.F_legend,Hdl2.F_legend],{'randn+sin(x)','randn+cos(x)'}); if nargin<5 width=0.4; end if ~isempty(ax) else ax=gca; end hold(ax,'on'); oriX=X; X=unique(X); sep=min(diff(X)); if isempty(sep) sep=1; end for i=1:length(X) if length(oriX)==numel(Y) tY=Y(oriX==X(i)); else tY=Y(:,i); end [f,yi]=ksdensity(tY); Hdl.F_density(i)=fill([f,-f(end:-1:1)].*sep.*width+X(i),[yi,yi(end:-1:1)],FaceColor); outliBool=isoutlier(tY,'quartiles'); outli=tY(outliBool); Hdl.F_outlier(i)=scatter(repmat(X(i),[length(outli),1]),outli,20,'filled',... 'CData',[1 1 1],'MarkerEdgeColor','none'); nY=tY(~outliBool); Hdl.F_range95(i)=plot([X(i),X(i)],[min(nY),max(nY)],'k','lineWidth',1); qt25=quantile(tY,0.25); qt75=quantile(tY,0.75); Hdl.F_quantile(i)=fill(X(i)+0.6.*sep.*width.*[-1 1 1 -1].*max(f),... [qt25,qt25,qt75,qt75],[1 1 1],... 'EdgeColor',[0 0 0]); med=median(tY); Hdl.F_medianLine(i)=plot(X(i)+0.6.*sep.*width.*[-1 1].*max(f),[med,med],'LineWidth',3,... 'Color',[0 0 0]); end Hdl.F_legend=Hdl.F_density(1); end
ggtheme violin 函數介紹
假設你已經編寫瞭上述繪圖代碼,隻需要將最後增添一行變為
X1=[1:2:7,13]; Y1=randn(100,5)+sin(X1); X2=2:2:10; Y2=randn(100,5)+cos(X2); figure Hdl1=violinChart(gca,X1,Y1,[0 0.447 0.741]); Hdl2=violinChart(gca,X2,Y2,[0.850 0.325 0.098]); legend([Hdl1.F_legend,Hdl2.F_legend],{'randn+sin(x)','randn+cos(x)'}); ggThemeViolin(gca,[Hdl1,Hdl2],'dust');
則圖像會被修飾:
而將函數最後加入‘LP’參數則變為:
ggThemeViolin(gca,[Hdl1,Hdl2],'dust','LP');
ggtheme violin 主題
主題有如下選擇:
'flat'/'flat_dark'/'camouflage'/'chalk'/
'copper'/'dust'/'earth'/'fresh'/'grape'/
'grass'/'greyscale'/'light'/'lilac'/'pale'/
'sea'/'sky'/'solarized'
'flat'
'flat_dark'
'camouflage'
'chalk'
'copper'
'dust'
'earth'
'fresh'
'grape'
'grass'
'greyscale'
'light'
'lilac'
'pale'
'sea'
'sky'
'solarized'
ggtheme violin 修飾函數代碼
註意,要使用ggThemeViolin修飾器函數,需要保證當前文件夾有themeCSS.mat文件,該文件將會一同在壓縮包內給出。
function ax=ggThemeViolin(varargin) % @author:slandarer % % 參數說明: % ----------------------------------------------------- % AxesTheme | 坐標區域風格 | 'flat'/'flat_dark'/'camouflage'/'chalk'/ % 'copper'/'dust'/'earth'/'fresh'/'grape'/ % 'grass'/'greyscale'/'light'/'lilac'/'pale' % 'sea'/'sky'/'solarized' % % HDLset | 句柄集合 % 獲取要處理的坐標區域===================================================== if strcmp(get(varargin{1},'type'),'axes' ) ax=varargin{1}; else ax=gca; end hold(ax,'on') % 獲取要處理的圖像句柄===================================================== HDLset=varargin{2}; % 獲取風格名稱============================================================= theme.AxesTheme='flat'; if length(varargin)>2 theme.AxesTheme=varargin{3}; end % 開始風格化=============================================================== ax.Box='off'; ax.YGrid='on'; ax.XGrid='on'; ax.GridLineStyle='--'; ax.LineWidth=1.2; % 主題風格化 Tm=load('themeCSS.mat'); Tm=Tm.theme; ax.Color=Tm.(theme.AxesTheme).Color; ax.TickLength=Tm.(theme.AxesTheme).TickLength; ax.GridColorMode=Tm.(theme.AxesTheme).GridColorMode; ax.GridColor=Tm.(theme.AxesTheme).GridColor; ax.GridAlpha=Tm.(theme.AxesTheme).GridAlpha; ax.XColor=Tm.(theme.AxesTheme).XColor; ax.YColor=Tm.(theme.AxesTheme).YColor; ax.TickDir=Tm.(theme.AxesTheme).TickDir; ax.ColorOrder=Tm.(theme.AxesTheme).ColorOrder; for i=1:length(HDLset) for j=1:length(HDLset(i).F_density) HDLset(i).F_density(j).FaceColor=ax.ColorOrder(mod(i-1,size(ax.ColorOrder,1))+1,:); HDLset(i).F_density(j).EdgeColor=[.1,.1,.1]; f_max=(max(HDLset(i).F_density(j).XData)-min(HDLset(i).F_density(j).XData))/2; x_mid=(max(HDLset(i).F_density(j).XData)+min(HDLset(i).F_density(j).XData))/2; HDLset(i).F_quantile(j).XData=x_mid+0.4.*f_max.*[-1 1 1 -1]; HDLset(i).F_quantile(j).FaceColor=[1 1 1].*0.95; HDLset(i).F_medianLine(j).XData=x_mid+0.4.*f_max.*[-1 1]; HDLset(i).F_medianLine(j).LineWidth=2; HDLset(i).F_medianLine(j).Color=[0.3,0.3,0.3]; HDLset(i).F_outlier(j).CData=Tm.(theme.AxesTheme).EdgeColor; end end if ~isempty(ax.Legend) ax.Legend.Box='off'; ax.Legend.FontSize=12; if mean(ax.Color)>0.6 ax.Legend.TextColor=ax.XColor; else ax.Legend.TextColor=[0.9 0.9 0.9]; end if ~isempty(regexpi(ax.Legend.Location,'out', 'once')) ax.Legend.TextColor=ax.XColor; ax.Legend.Title.FontSize=14; end ax.Legend.AutoUpdate='off'; end end
到此這篇關於基於Matlab繪制小提琴圖的示例代碼的文章就介紹到這瞭,更多相關Matlab小提琴圖內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!