Clear Filters
Clear Filters

Adjusting the spacing between the bars of different groups within a category using boxchart.

72 views (last 30 days)
I am using boxchart to plot data as in the example: openExample('graphics/UseCombinationOfGroupingVariablesExample')
How do I reduce the spacing between the groups (blue and red) so that they touch each other for every category? This is required for me as I have six groups. The spacing between the goups makes it difficult to differentiate between boxes of different categories. I want the boxes of each category to be clubbed together. Any suggestions would be highly appreciated.

Answers (1)

Austin M. Weber
Austin M. Weber on 22 May 2024 at 2:57
If you set the BoxWidth name-value pair to 1 then the boxcharts will all touch each other:
load temperature_data % A random data table that I have attached similar to the one in the prompt
b = boxchart(data.Month, data.TemperatureF,...
'BoxWidth',1); % <-- This line makes the boxcharts touch
Unfortunately, this doesn't add space between the monthly categories. There really isn't an easy way to do that as far as I can tell. I belive you would have to adjust the positions of the individual patch objects in order to accomplish that, which would be very tedious.
My recommendation is to use the groupedBoxchart function from the Matlab Central File Exchange (click here). This function is really simple to use, and it does an excellent job at using colored bands to help distinguish the groupings for each category. For example:
b2 = groupedBoxchart(data.Month, data.Year, data.TemperatureF, "MarkerStyle", '.');
ylabel('Temperature (\circF)')
ylim([20 100])
L = legend(categorical(unique(data.Year)),'Location','north');
L.NumColumns = 3;
Austin M. Weber
Austin M. Weber on 23 May 2024 at 13:59
Edited: Austin M. Weber on 23 May 2024 at 14:56
@Sudhee, I have thought of another solution but it is a little ugly. It involves adding synthetic "empty" categories to your table in order to add spaces between the x-axis categories. Here is one way to do it:
load temperature_data
% Adjust the category order so that the "empty" categories fit in-between
% the original categories.
new_category_order = {'Jun','Empty1','Jul','Empty2','Aug','Empty3','Sep','Empty4','Oct'};
data.Month = categorical(data.Month,new_category_order);
% Create your boxchart figure and set BowWidth=1 so that the boxes are
% "clubbed together", as you say.
% Set the "empty" categories to invisible characters so that they do not
% show up as x-axis labels
xt = xticks;
xt([2 4 6 8]) = categorical(" "); % Invisible character (ATL+255), not a space!
% Optional plot details
ylabel('Temperature (\circF)'), ylim([20 100])
L.NumColumns = 3;
set(gca,'TickDir','none') % disables the additional x-tick marks from showing (at the expense of also removes the y-axis ticks...)
set(gca,'YGrid','on') % add horizontal gridlines to replace the missing y-tick marks

Sign in to comment.




Community Treasure Hunt

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

Start Hunting!