基於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!

推薦閱讀: