Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Normalize histogram of normally distributed data

Asked by Bernoulli Lizard on 12 Mar 2013

How can I normalize a histogram of normally distributed points? I have tried using histnorm from the file exchange and a few other suggestions in the help forums, but the height of my bins are on the order of 10^4.

I am using normrand to distribute data points, but the height of the histogram (or height of the pdf when I use histfit) always depends upon the number of data points and the number of bins I use.

Thanks

0 Comments

Bernoulli Lizard

Products

No products are associated with this question.

2 Answers

Answer by Honglei Chen on 12 Mar 2013

You just need to normalize it toward the number of points

x = randn(1024,1)
[n,b] = hist(x)
bar(b,n/sum(n))

2 Comments

Bernoulli Lizard on 13 Mar 2013

No, because then the height still depends upon the number of bins

Honglei Chen on 13 Mar 2013

Then what is your rule of normalization, normalize towards what?

Honglei Chen
Answer by Tom Lane on 14 Mar 2013

I would normalize it to area 1. The usual histogram has area equal to binwidth*sum(n), so divide by that. Probably binwidth=b(2)-b(1).

6 Comments

Peter on 27 Jun 2013

No, it is not. The histogram does not match the PDF. Also, it changes if I change the number of bins.

Here is the code that I am using:

% random positions FOR THE Z-AXIS
wz = 5.8118*10^-06;
PDF = @(z) 1 - exp( -beta*exp(-4*z.^2/wz^2) );
PDF_discrete = PDF(-span*wz:sizeZ:span*wz);
[~ , draw_samples] = histc(rand(numpart , 1), [0 cumsum(PDF_discrete)./sum(PDF_discrete)]);
position(:,3) = draw_samples .*sizeZ -(span*wz);
% Plot histogram of numbers distributed according to the PDF:
numbin = 1000;
[counts,bins] = hist(x,numbin);
binwidth = bins(2)-bins(1);
sum(counts/(binwidth*numpart*numbin))
bar(bins, counts/sum(counts) )
% Plot the PDF
cbl = @(z) 1 - exp( -beta*exp(-4*z.^2/wz^2) );
ezplot(cbl, [-3*wz, 3*wz]);
Image Analyst on 27 Jun 2013

We can't run this - it says span is undefined. The histogram is a quantized PDF. You won't get the true PDF unless you have an infinite number of infinitely thin histogram bins. So of course the histogram changes as you change the bin width - you have a finite number of samples that are counted. And you can't get infinitely thin, infinitely many bins with digitized, discrete data because that's just how a computer works.

Peter Perkins on 27 Jun 2013

You want to compare a histogram to a PDF. Tom's suggestion is the correct one. The histogram integrates to binwidth*numObservations, the PDF to 1. The easiest thing to do is to scale your PDF by multiplying by binwidth*numObservations, but you can also call hist, get the bin counts, normalize them by dividing by binwidth*numObservations, and call bar.

If your PDF is a fit to the data, I'd recommend plotting the data and fitting the model using the dfittool GUI, which makes the plot your looking for (as well as many others) automatically.

Hope this helps.

Tom Lane

Contact us