2014-07-15 3 views
2

Après avoir vu ce grand poste en SO:boxplots Groupé dans Matlab: une fonction générique

Most efficient way of drawing grouped boxplot matlab

Je me demandais s'il est possible de créer une fonction comme ça, mais un peu plus générique, comme dans mon application J'ai besoin de faire plusieurs analyses de différents algorithmes dans différentes situations et il serait très fastidieux de régler le code de traçage pour chaque cas.

Je voudrais quelque chose de générique pour ce genre de parcelles:

enter image description here

Répondre

3

Je fonction Matlab codé qui fait que pour vous (me).

Caractéristiques:

  • Dans chaque boxplot quantité différente de données prises en charge
  • Toute quantité de groupes et boxplot par groupe soutenu
  • XLabel et boxplotlabel soutenu
  • Choix automatique des couleurs ou des couleurs spécifiées par l'utilisateur

Exemple de résultat de la fonction:

enter image description here

CODE:

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 

Exemple simple:

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!') 

enter image description here

fichier d'échange de fichiers Mathworks se trouve ici: http://www.mathworks.com/matlabcentral/fileexchange/47233-multiple-boxplot-m