- "findobj" documentation - https://www.mathworks.com/help/releases/R2023b/matlab/ref/findobj.html
- "prctile" documentation - https://in.mathworks.com/help/releases/R2023b/matlab/ref/prctile.html
- "legend" documentation - https://in.mathworks.com/help/releases/R2023b/matlab/ref/legend.html
How to add a legend for a boxplot that indicates how the boxplot was created (summary statistics)?
98 次查看(过去 30 天)
显示 更早的评论
Hi folks, I have a simple boxplot and I can't figure out how to make a legend like the one shown in the photograph below. Ideally, the symbols and line specs would all match the associated text.
Perhaps doing it using the annotation or note tool? Was wondering if anyone has done this before. This type of formatting is a requirement for a journal paper.
For example (see example.png) I've gotten this far:
data = [1 2 3 4 4 5 5 6 6 7 8 9 13]
figure; boxplot(data);
a = get(get(gca,'children'),'children'); % Get the handles of all the objects
legend([a(1) a(2) a(3) a(4)],{'Outliers','Median','25-75%','+/-1.5 IQR'})
But am wondering if there are alternative or better ways, and perhaps a way to show the blue bounding box? Just wanted to hear y'alls thoughts. Cheers.
0 个评论
采纳的回答
Malay Agarwal
2024-8-21
编辑:Malay Agarwal
2024-8-21
To make such a legend, you will have to use the "findobj" function to obtain handles to the different elements of the "boxplot" and then add a legend for each. Please try the following code:
% Generate some random data
rng(0); % For reproducibility
data = normrnd(5,1,100,1);
% Create a boxplot
figure;
boxplot(data, 'Colors', 'k', 'Symbol', 'ro');
% Customize the boxplot
% Use findobj to get a handle to the IQR box
hBox = findobj(gca, 'Tag', 'Box');
% Change the color of the IQR box
set(hBox, 'Color', 'blue', 'LineWidth', 2);
% Manually calculate the 9th and 91st percentiles
percentile_9 = prctile(data, 9);
percentile_91 = prctile(data, 91);
% Use hold on to plot the 9%-91% range and the mean
hold on;
% Add lines for the 9% to 91% range
p9_line = plot([0.85, 1.15], [percentile_9, percentile_9], 'g--', 'LineWidth', 2, 'DisplayName', '9% to 91% Range');
p91_line = plot([0.85, 1.15], [percentile_91, percentile_91], 'g--', 'LineWidth', 2);
% Calculate and plot the mean
mean_value = mean(data);
mean_point = scatter(1, mean_value, 100, 'filled', 'd', 'MarkerFaceColor', 'red', 'DisplayName', 'Mean');
% Capture outliers for legend
hOutliers = findobj(gca, 'Tag', 'Outliers');
% Add legend
hLegend = legend([findobj(gca, 'Tag', 'Median'), mean_point, hBox(1), p9_line, hOutliers(1)], ...
{'Median', 'Mean', '25%-75%', '9%-91%' 'Outliers'}, ...
'Location', 'northeast');
% Set labels and title
title('Boxplot with summary statistics');
ylabel('Values');
hold off;
Please refer to the following resources for more information:
Hope this helps!
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!