下面是我用来在一个图中绘制多个箱形图的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
答案 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])