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

 Akzeptierte Antwort

Shashank Prasanna
Shashank Prasanna am 1 Feb. 2013

19 Stimmen

BOXPLOT works with grouping variables, so you can manually append all of your data together and then create a grouping variable that lets boxplot know which belongs to first and which for second. Take a look at the example below:
>> c_1=rand(1,20);
>> c_2=rand(1,100);
>> C = [c_1 c_2];
>> grp = [zeros(1,20),ones(1,100)];
>> boxplot(C,grp)

6 Kommentare

Keqiao Li
Keqiao Li am 15 Sep. 2015
Hi Prasanna Thanks for the answer. But I was wondering if I have three or more than three different length of vectors, how to draw the box plot for those vectors. Because your answer is for two vectors. Is there any ways to do that? Thanks Li
Gabriel Earley
Gabriel Earley am 14 Nov. 2015
Bearbeitet: Gabriel Earley am 14 Nov. 2015
To do multiple box plots you just multiply your ones matrix by which ever box your on plus 1. So if I was doing the 4th box of 50 data points it would be 5*one(1,50)
Zafer CÖMERT
Zafer CÖMERT am 30 Sep. 2017
Thanks for the reply.
Adam Danz
Adam Danz am 22 Nov. 2019
Bearbeitet: Adam Danz am 22 Nov. 2019
Here's another version of Shashank Prasanna's answer that makes it easy to add more groups of data. The only change needed is in the 3rd line below: simply add your row or column variables to C as shown. That's the only change needed.
c_1=rand(1,20); % Generate group 1
c_2=rand(1,100); % Generate group 2
C = {c_1(:); c_2(:)}; % <--- Just vertically stack all of your groups here
grp = cell2mat(arrayfun(@(i){i*ones(numel(C{i}),1)},(1:numel(C))'));
boxplot(vertcat(C{:}),grp)
matteo bottoni
matteo bottoni am 4 Dez. 2020
Hi, how can I set a name for each x-coordinate and not simply a number?
Adam Danz
Adam Danz am 9 Dez. 2020
Bearbeitet: Adam Danz am 9 Dez. 2020
Set the labels property of a boxplot.
Alternatively, set xtick and xticklabel which are both axis properties.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Matt Raum
Matt Raum am 23 Mär. 2017

13 Stimmen

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 Kommentare

Thank you so much for that wrapper. Saved my statistics homework ;)
thank you man, it was super useful
Aihong CUI
Aihong CUI am 29 Nov. 2022
very useful, thank you very much
Joris Bockhofer
Joris Bockhofer am 5 Jul. 2023
Bearbeitet: Joris Bockhofer am 5 Jul. 2023
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

Melden Sie sich an, um zu kommentieren.

Joey Porter
Joey Porter am 21 Apr. 2020

5 Stimmen

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 Kommentare

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
Joey Porter am 21 Apr. 2020
Thanks Adam.
I didn't know there was a function for padding. I'll use this next time!
Camilo Cárdenas
Camilo Cárdenas am 29 Apr. 2022
Gracias! excelente dato!

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by