【问题标题】:Grouped boxplots in Matlab: a Generic functionMatlab中的分组箱线图:通用函数
【发布时间】:2014-07-15 11:49:17
【问题描述】:

在 SO 中看到这篇很棒的帖子后:

Most efficient way of drawing grouped boxplot matlab

我想知道是否可以创建一个这样但更通用的函数,因为在我的应用程序中,我需要在不同情况下对不同算法进行多次分析,调整绘图代码将非常乏味每个案例。

我想要一些通用的这种情节:

【问题讨论】:

    标签: matlab boxplot


    【解决方案1】:

    我编写了一个 Matlab 函数来为你(我)做这件事。

    特点:

    • 在每个箱线图中支持的数据量不同
    • 支持任意数量的组和每组的箱线图
    • 支持 Xlabel 和 boxplotlabel
    • 自动选择颜色或用户指定的颜色

    函数结果示例:

    代码:

    function multiple_boxplot(data,xlab,Mlab,colors)
    
    % data is a cell matrix of MxL where in each element there is a array of N
    % length. M is how many data for the same group, L, how many groups.
    %
    % Optional:
    % xlab is a cell array of strings of length L with the names of each
    % group
    %
    % Mlab is a cell array of strings of length M
    %
    % colors is a Mx4 matrix with normalized RGBA colors for each M.
    
    % check that data is ok.
    if ~iscell(data)
        error('Input data is not even a cell array!');
    end
    
    % Get sizes
    M=size(data,2);
    L=size(data,1);
    if nargin>=4
        if size(colors,2)~=M
            error('Wrong amount of colors!');
        end
    end
    if nargin>=2
        if length(xlab)~=L
            error('Wrong amount of X labels given');
        end
    end
    
    % Calculate the positions of the boxes
    positions=1:0.25:M*L*0.25+1+0.25*L;
    positions(1:M+1:end)=[];
    
    % Extract data and label it in the group correctly
    x=[];
    group=[];
    for ii=1:L
        for jj=1:M
            aux=data{ii,jj};
            x=vertcat(x,aux(:));
            group=vertcat(group,ones(size(aux(:)))*jj+(ii-1)*M);
        end
    end
    % Plot it
    boxplot(x,group, 'positions', positions);
    
    % Set the Xlabels
    aux=reshape(positions,M,[]);
    labelpos = sum(aux,1)./M;
    
    set(gca,'xtick',labelpos)
    if nargin>=2
        set(gca,'xticklabel',xlab);
    else
        idx=1:L;
        set(gca,'xticklabel',strsplit(num2str(idx),' '));
    end
    
    
    % Get some colors
    if nargin>=4
        cmap=colors;
    else
        cmap = hsv(M);
        cmap=vertcat(cmap,ones(1,M)*0.5);
    end
    color=repmat(cmap, 1, L);
    
    % Apply colors
    h = findobj(gca,'Tag','Box');
    for jj=1:length(h)
       patch(get(h(jj),'XData'),get(h(jj),'YData'),color(1:3,jj)','FaceAlpha',color(4,jj));
    end
    
    if nargin>=3
        legend(fliplr(Mlab));
    end
    end
    

    简单示例:

    clear;clc;
    % Create example data
    A=rand(100,10);
    B=rand(200,10);
    C=rand(150,10);
    
    % prepare data
    data=cell(10,3);
    for ii=1:size(data,1)
        Ac{ii}=A(:,ii);
        Bc{ii}=B(:,ii);
        Cc{ii}=C(:,ii);
    end
    data=vertcat(Ac,Bc,Cc);
    
    xlab={'Hey','this','works','pretty','nicely.','And','it','has','colors','!!!!'};
    col=[102,255,255, 200; 
        51,153,255, 200;
        0, 0, 255, 200];
    col=col/255;
    
    multiple_boxplot(data',xlab,{'A', 'B', 'C'},col')
    title('Here it is!')
    

    Mathworks 文件交换文件可以在这里找到: http://www.mathworks.com/matlabcentral/fileexchange/47233-multiple-boxplot-m

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2019-04-29
      • 1970-01-01
      • 2021-08-28
      • 2016-09-14
      • 2013-05-11
      • 2018-04-15
      相关资源
      最近更新 更多