boxplot with vectors of different lengths
이전 댓글 표시
Hi MATLAB folks,
I am wondering how I can boxplot two column matrices with different lengths, e.g.
c_1=rand(1,20);
c_2=rand(1,100);
how I can do
boxplot(C);
where:
C=cell(1,2);
C{1}=c_1(:);
C{2}=c_2(:);
Is there any solution to that?
Many thanks in advance, -V
채택된 답변
추가 답변 (2개)
Matt Raum
2017년 3월 23일
I ran into the same issue -- here's a quick re-wrapping of boxplot that can be called on a cell array containing vectors of variable size:
col=@(x)reshape(x,numel(x),1);
boxplot2=@(C,varargin)boxplot(cell2mat(cellfun(col,col(C),'uni',0)),cell2mat(arrayfun(@(I)I*ones(numel(C{I}),1),col(1:numel(C)),'uni',0)),varargin{:});
boxplot2 automatically generates the necessary grouping array. All you need to pass to it is a cell array of the vectors you want box plotted.
boxplot2({randn(1,100),10+2*randn(200,1)});
댓글 수: 4
Alexandre Soares da Silva
2017년 4월 28일
Thank you so much for that wrapper. Saved my statistics homework ;)
Francesco Giuseppe Augello
2021년 3월 23일
thank you man, it was super useful
Aihong CUI
2022년 11월 29일
very useful, thank you very much
Joris Bockhofer
2023년 7월 5일
편집: Joris Bockhofer
2023년 7월 5일
You are a hero. The hero MatLab doesnt deserve....
I want to add that this will be a problem when trying to identify boxes belonging to a certain group.
To "fix" this create an array of strings that map the number of the, now numbered boxes to a legend label and add a legend in a hacky way :)
legendStrArray = string();
for i = 1:numBoxes
legendStrArray(1,end+1) = string(i) + " = " + yourListOfGroupLabels(i); %
end
legendStrArray = legendStrArray(1,2:end);
hLegend = legend(findall(gca,'Tag','Box'), legendStrArray); % finds a figure with the tag box which should be your boxplot
Joey Porter
2020년 4월 21일
5 개 추천
This is my first feedback so please forgive if I've misunderstood but I solved this issue with a simpler explanation (at least for me).
boxplot plots each columns as a separate variable (box) as long as the lengths of each column are the same.
I simply created a NaN matrix with number of rows equal to the length of my longest variable, then populated with my variable data. The NaNs are not plotted on the box plot but allows variables of unequal length to be plotted. Also to add more variables, simply increase the number of columns in your NaN array.
I hope this helps anyone returning to this thread :)
댓글 수: 3
Adam Danz
2020년 4월 21일
That's another good approach.
You can also use padarray() to pad the cell elements with NaN values.
% Create 1x3 cell array of vectors with different lengths
C = {rand(20,1), rand(15,1), rand(200,1)};
% Pad each vector with NaN values to equate lengths
maxNumEl = max(cellfun(@numel,C));
Cpad = cellfun(@(x){padarray(x(:),[maxNumEl-numel(x),0],NaN,'post')}, C);
% Convert cell array to matrix and run boxplot
Cmat = cell2mat(Cpad);
boxplot(Cmat)
Joey Porter
2020년 4월 21일
Thanks Adam.
I didn't know there was a function for padding. I'll use this next time!
Camilo Cárdenas
2022년 4월 29일
Gracias! excelente dato!
카테고리
도움말 센터 및 File Exchange에서 Data Distribution Plots에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!