如何使用 MATLAB 绘制小提琴图

Posted slandarer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用 MATLAB 绘制小提琴图相关的知识,希望对你有一定的参考价值。

写了个matlab绘制小提琴图的函数:

  • 图中小提琴状区域为核密度曲线
  • 白色方块为25%,75%分位数
  • 中间横线为中位数
  • 白色点为离群值点
  • 竖着的黑线是去掉离群值点后点的上下限

1使用示例

基础使用,Y为矩阵:

X=1:5;
Y=randn(100,5);

Hdl1=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);

Hdl=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)'});

2完整代码

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));
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

以上是关于如何使用 MATLAB 绘制小提琴图的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 一行代码应用ggtheme主题--violinplot版(小提琴图)

MATLAB 一行代码应用ggtheme主题--violinplot版(小提琴图)

MATLAB | 全网最全边际图绘制模板(直方图小提琴图箱线图雨云图散点图... ...)

MATLAB | 全网最全边际图绘制模板(直方图小提琴图箱线图雨云图散点图... ...)

如何确定中线的小提琴图边缘的 x 值

MATLAB | 如何使用MATLAB绘制序列logo图