MATLAB Answers

0

Histogram with values above the bars

Asked by Tiago Dias on 5 Dec 2018
Latest activity Commented on by Luna
on 9 Dec 2018
Hello,
I got data with values form 90 to 100, and i can have decimal values like 90.4 95.3. My goal is to create an histogram with binedges (i tihnk is the proper name) with 90-91, 91-92, 92-93, etc.
A = randi([90 100],50,1);
B = rand(50,1);
C = A + B;
histogram(B(:,1),'BinWidth',1);
And I would to know how to place the on top of each bar, how many values from 90 to 91, 91 to 92, etc
Thanks for your time

  0 Comments

Sign in to comment.

2 Answers

Answer by Steven Lord
on 5 Dec 2018
 Accepted Answer

I would not depend upon the tick locations as Luna's solution does. Use the data stored in the histogram object itself instead.
Generate some sample data and create the histogram.
data = 10*rand(1,100);
x = histogram(data,'BinWidth',1);
Retrieve the locations of the edges and the heights of the bars.
E = x.BinEdges;
y = x.BinCounts;
Find the X coordinates of the center of the bars. This takes the left edge of each bar and adds half the distance to the next bar edge.
xloc = E(1:end-1)+diff(E)/2;
Put the labels 1 unit above the top of the bar center.
text(xloc, y+1, string(y))

  3 Comments

Luna
on 7 Dec 2018
Right, it works fine except string. Needed mxn char array.
text(xloc, y+1, num2str(y'))
That would depend which release you're using. I tried it in release R2018b and it works. I don't remember offhand when the text function started accepting string arrays.
Luna
on 9 Dec 2018
Ah OK, you are right. Mine is 2018a.

Sign in to comment.


Answer by Luna
on 5 Dec 2018

Hello Tiago,
Try this for getting labels on the top of the bars of your histogram.
data = 10*rand(1,100);
x = histogram(data,'BinWidth',1);
labels = num2str(x.BinCounts');
xt = get(gca, 'XTick');
xVals = xt - ([0 diff(xt)]/2);
xVals(1) = [];
text(xVals, x.BinCounts, labels, 'HorizontalAlignment','center', 'VerticalAlignment','bottom')
But first check your data to plot histogram there is something wrong about it:
A = randi([90 100,100,1]); % look randi function and its inputs
B = rand(50,1);
C = A + B; % check A and B have the same sizes to add

  2 Comments

yeah you are right, just edit my code. will try your answer
Luna
on 5 Dec 2018
Put 'BinWidth' as 0.1 with this data. Otherwise it does not seem OK
Don't forget to accept the answer if it works :)

Sign in to comment.