Label bars of a histogram
Show older comments
Hi,
I construct a histogram with Matlab's "bar" function. The bins are constructed as follows:
n = 8;
binranges = linspace(min(values), max(values),n+1);
"values" are just some measured values which I want to plot as bars. Now I want to label all the bins accordingly with their ranges. So if for instance binranges gives me the following:
binranges =
Columns 1 through 8
0.7175 0.7447 0.7718 0.7990 0.8262 0.8533 0.8805 0.9077
Column 9
0.9348
I would like to have the bars labeled as "0.7175-0.7447", "0.7447-0.7718" and so on.. For including a dash I guess I need to convert everything to strings as well, which I then could use as an input to the following statement:
set(gca, 'XTickLabel',...)
How do I do that most efficiently? Many thanks
Accepted Answer
More Answers (2)
A number of ways, but here is one:
label = arrayfun(@(x,y) sprintf('%g - %g',x,y), ...
binranges(1:end-1), binranges(2:end), ...
'UniformOutput', false);
Then, set the axes properties.
set(gca,'XTick',(binranges(1:end-1)+binranges(2:end))/2,...
'XTickLabel',label,...
'XTickLabelRotation',30)
8 Comments
MiauMiau
on 9 Dec 2016
If you don't create the string as either cell array or column vector of strings they'll all be run together as a single string. It's the (mandatory) reason I arranged the binranges as a column vector for the example; that causes num2str to build the column output array.
MiauMiau
on 10 Dec 2016
MiauMiau
on 10 Dec 2016
dpb
on 10 Dec 2016
"... ranges do not start from 0 nor do they go to infinity"
Ah, but they do! Perhaps the data don't, but the first/last bin are actually unbounded on left/right, respectively...
MiauMiau
on 10 Dec 2016
a a
on 29 Aug 2017
Thanks!! I've tried for hours until I found your solution
Steven Lord
on 9 Dec 2016
% Create some sample data
values = [0.7175 0.9348];
n = 8;
binranges = linspace(min(values), max(values),n+1);
x = values(1)+(values(2)-values(1))*rand(1, 100);
% Create a categorical array from the data
% Use binranges to define categories
C = discretize(x, binranges, 'categorical');
% Create the categorical histogram
histogram(C)
The format of the categories / tick labels are different than what you suggested but in my opinion the meaning of those labels should be clear. If you have a hard requirement to use the specific format you described you could use Jiro's arrayfun call to create a list of category names then pass that into discretize after the 'categorical' flag.
Categories
Find more on Data Distribution Plots in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!