Box-Whisker Plot with 5 and 95 percentiles and non-symmetric distributions.
20 views (last 30 days)
Show older comments
Dear all,
I have a 1000x2 matrix, M, where each column represents the data of two variables. I would like to plot a boxplot of the two distributions of the data, by specifying the length of the whiskers:
boxplot(M,'Whisker',w)
However, I would like the upper and lower whiskers to represent the 5th and 95th percentiles respectively. In doing so, I have two problems:
- Both the distributions are highly non-symmetric, therefore, the suggestion provided here does not work, since the multiplier w is not the same for the upper and lower whiskers.
- Apparently, w can only takes on a scalar value, therefore, I cannot specify different multipliers for different distributions. Is there a way around this problem. In a follow up question of the same Q&A they suggest to use hold on, however the output is not good because of the overlapping of the figures.
It would be great if w could take the form of a 2xsize(M,2) array, in order to specify a specific multiplier for each distribution and for both the upper and lower whisker separately. However, I was not capable of editing in this way the original "boxplot" function.
Thanks in advance,
Edoardo
1 Comment
markus tripolt
on 28 Aug 2024
Hey Edoardo,
Have you got a solution for this problem in the meanwhile? I have the same problem. For censored data, the whiskers should display the 5 % and 95 % percentile of the data.
Cheers Markus
Answers (1)
the cyclist
on 28 Aug 2024
It's a bit kludgy, but here is a way to do it by directly editing the XData and YData of the whiskers and their caps.
% Set seed for reproducibility
rng default
% Sample data
N = 100;
data = [betarnd(12,1,N,1) betarnd(1,2,N,1)];
% Calculate relevant percentiles needed to position the whiskers and their caps
Q05 = prctile(data, 5);
Q25 = prctile(data, 25);
Q75 = prctile(data, 75);
Q95 = prctile(data, 95);
% Create the default box plot
figure
h = boxplot(data);
% Find the objects for the whiskers and the caps
LW = findobj(h, 'Tag', 'Lower Whisker');
LC = findobj(h, 'Tag', 'Lower Adjacent Value');
UW = findobj(h, 'Tag', 'Upper Whisker');
UC = findobj(h, 'Tag', 'Upper Adjacent Value');
% Adjust the positions of the whiskers
set(LW(1),"YData",[Q05(1) Q25(1)]) % Lower whisker, 1st dataset
set(LW(2),"YData",[Q05(2) Q25(2)]) % Lower whisker, 2nd dataset
set(UW(1),"YData",[Q75(1) Q95(1)]) % Upper whisker, 1st dataset
set(UW(2),"YData",[Q75(2) Q95(2)]) % Upper whisker, 2nd dataset
% Adjust the positions of the caps
set(UC(1),"YData",[Q95(1) Q95(1)])
set(UC(2),"YData",[Q95(2) Q95(2)])
set(LC(1),"YData",[Q05(1) Q05(1)])
set(LC(2),"YData",[Q05(2) Q05(2)])
0 Comments
See Also
Categories
Find more on Descriptive Statistics and Visualization in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!