MATLAB中长度不等的多个箱线图

时间:2018-07-17 14:25:34

标签: matlab matlab-figure boxplot

下面是我用来在一个图中绘制多个箱形图的MATLAB代码。但是,这仅在数据长度相等时才有效(在此示例中,n1,n2,n3,n4,n5,n6 = 10)。如何更改此设置,使其适用于长度不等的数据集?例如:n1 = 10,n2 = 10,n3 = 15,n4 = 15,n5 = 5,n6 = 5?

clc 
clear 
n1=10;n2=10;n3=10;n4=10;n5=10;n6=10;
x=[rand(1,n1) rand(1,n2) rand(1,n3) rand(1,n4) rand(1,n5) rand(1,n6)]; 
n=10 ; xx=([1:6])'; % example 
r=repmat(xx,1,n)'; 
g=r(:)'; 


positions = [1 2 3 4 5 6 ]; 
h=boxplot(x,g, 'positions', positions); 
set(h,'linewidth',2) 

set(gca,'xtick',[mean(positions(1:2)) mean(positions(3:4)) mean(positions(5:6)) ]) 
set(gca,'xticklabel',{'exp1','exp2','exp3'},'Fontsize',28) 

color = ['c', 'y', 'c', 'y','c', 'y']; 
h = findobj(gca,'Tag','Box'); 
for j=1:length(h) 
patch(get(h(j),'XData'),get(h(j),'YData'),color(j),'FaceAlpha',.5); 
end 

2 个答案:

答案 0 :(得分:0)

您的代码有几个问题,导致代码失败。检查我的代码,您可以在下面替换为我的代码。不必指定n1,n2等,而是将所有n值放入数组中。请注意,如果您将set中的元素数从6更改为ns,则功能将不起作用,但是我的代码将自动运行。将来,我建议对您的代码进行泛化以减少对此类事情的依赖,并定义更少的变量。

ns=[20,7,16,5,6,7]; %rather than specifying all your n variables individually, put them in an array
x=rand(1,sum(ns(:))); %allocates membory for x
ns=[0,ns]; %used for easier indexing in for loop
for(i=2:length(ns))
    g((1+sum(ns(1:(i-1)))):(ns(i)+sum(ns(1:(i-1)))))=repmat(i-1,1,ns(i)); % populates g array
end
positions=1:(length(ns)-1);
h=boxplot(x,g,'positions',positions)

或者,如果您觉得更有意义,则可以替换

ns=[0,ns]; %used for easier indexing in for loop
for(i=2:length(ns))
    g((1+sum(ns(1:(i-1)))):(ns(i)+sum(ns(1:(i-1)))))=repmat(i-1,1,ns(i)); % populates g array
end

使用

g=[];
for(i=1:length(ns))
    g=[g repmat(i,1,ns(i))];
end

尽管这通常是不好的做法,因为g的大小随每个循环而变化,因此如果您的ns太大,Matlab可能会发出警告。

答案 1 :(得分:0)

clearvars
n1=10;n2=10;n3=15;n4=15;n5=5;n6=5;
A=zeros(n1,1);A=num2str(A);A(1:end)='1';
B=zeros(n1,1);B=num2str(B);B(1:end)='2';
C=zeros(n1,1);C=num2str(C);C(1:end)='3';
D=zeros(n1,1);D=num2str(D);D(1:end)='4';
E=zeros(n1,1);E=num2str(E);E(1:end)='5';
F=zeros(n1,1);F=num2str(F);F(1:end)='6';
x=[rand(1,n1) rand(1,n2) rand(1,n3) rand(1,n4) rand(1,n5)   rand(1,n6)];
boxplot([x(1,1:n1)';x(1,n1+1:n1+n2)';x(1,n1+n2+1:n1+n2+n3)';x(1,n1+n2+n3+1:n1+n2+n3+n4)';...
x(1,n1+n2+n3+n4+1:n1+n2+n3+n4+n5)';x(1,n1+n2+n3+n4+n5+1:n1+n2+n3+n4+n5+n6)'],[A;B;C;D;E;F])