2014-07-15 92 views

回答

3

我編寫了一個Matlab的函數,它爲你(我)。

特點:

  • 在各箱線圖不同量的數據支持
  • 基團的任何量和每個組的箱線圖支承
  • Xlabel和boxplotlabel支持
  • 的顏色或用戶指定的顏色自動選擇

功能結果示例:

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 

簡單的例子:

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

Mathworks公司的文件交換文件可以在這裏找到: http://www.mathworks.com/matlabcentral/fileexchange/47233-multiple-boxplot-m