Replace Discouraged Instances of hist and histc
Old Histogram Functions (hist, histc)
Earlier versions of MATLAB® use the hist and histc
functions as the primary way to create histograms and calculate histogram bin
counts. These functions, while good for some general purposes, have limited overall
capabilities. The use of hist and histc in
new code is discouraged for these reasons (among others):
After using
histto create a histogram, modifying properties of the histogram is difficult and requires recomputing the entire histogram.The default behavior of
histis to use 10 bins, which is not suitable for many data sets.Plotting a normalized histogram requires manual computations.
histandhistcdo not have consistent behavior.
Recommended Histogram Functions
The histogram, histcounts, and discretize functions dramatically advance the capabilities of
histogram creation and calculation in MATLAB, while still promoting consistency and ease of use.
histogram, histcounts, and
discretize are the recommended histogram creation and
computation functions for new code.
Of particular note are the following changes, which stand as
improvements over hist and
histc:
histogramcan return a histogram object. You can use the object to modify properties of the histogram.Both
histogramandhistcountshave automatic binning and normalization capabilities, with several common options built-in.histcountsis the primary calculation function forhistogram. The result is that the functions have consistent behavior.discretizeprovides additional options and flexibility for determining the bin placement of each element.
Differences Requiring Code Updates
Despite the aforementioned improvements, there are several important differences between the old and now recommended functions, which might require updating your code. The tables summarize the differences between the functions and provide suggestions for updating code.
Code Updates for hist
| Difference | Old behavior with hist | New behavior with
histogram |
|---|---|---|
Input matrices |
A = randn(100,2); hist(A) |
A = randn(100,2); h1 = histogram(A(:,1),10) edges = h1.BinEdges; hold on h2 = histogram(A(:,2),edges) The
above code example uses the same bin edges for each histogram,
but in some cases it is better to set the
|
Bin specification |
|
To
convert bin centers into bin edges for use with
Note In cases where the bin centers used with
histogram(A,'BinLimits',[-3,3],'BinMethod','integers') |
Output arguments |
A = randn(100,1); [N, Centers] = hist(A) |
A = randn(100,1); h = histogram(A); N = h.Values Edges = h.BinEdges Note To calculate bin counts (without plotting a histogram),
replace |
Default number of bins |
| Both A = randn(100,1); histogram(A) histcounts(A) |
Bin limits |
| If To
reproduce the results of A = randi(5,100,1); histogram(A,10,'BinLimits',[min(A) max(A)]) |
Code Updates for histc
| Difference | Old behavior with histc | New behavior with
histcounts |
|---|---|---|
| Input matrices |
A = randn(100,10); edges = -4:4; N = histc(A,edges) |
A = randn(100,10); edges = -4:4; N = histcounts(A,edges) Use a for-loop to calculate bin counts over each column. A = randn(100,10); nbins = 10; N = zeros(nbins, size(A,2)); for k = 1:size(A,2) N(:,k) = histcounts(A(:,k),nbins); end If
performance is a problem due to a large number of columns in the
matrix, then consider continuing to use
|
| Values included in last bin |
|
A = 1:4; edges = [1 2 2.5 3] N = histcounts(A) N = histcounts(A,edges) The
last bin from N = histcounts(A,'BinMethod','integers'); |
| Output arguments |
A = randn(15,1); edges = -4:4; [N,Bin] = histc(A,edges) |
|
Convert Bin Centers to Bin Edges
The hist function accepts bin centers, whereas the histogram function accepts bin edges. To update code to use histogram, you might need to convert bin centers to bin edges to reproduce results achieved with hist.
For example, specify bin centers for use with hist. These bins have a uniform width.
A = [-9 -6 -5 -2 0 1 3 3 4 7]; centers = [-7.5 -2.5 2.5 7.5]; hist(A,centers)

To convert the bin centers into bin edges, calculate the midpoint between consecutive values in centers. This method reproduces the results of hist for both uniform and nonuniform bin widths.
d = diff(centers)/2; edges = [centers(1)-d(1), centers(1:end-1)+d, centers(end)+d(end)];
The hist function includes values falling on the right edge of each bin (the first bin includes both edges), whereas histogram includes values that fall on the left edge of each bin (and the last bin includes both edges). Shift the bin edges slightly to obtain the same bin counts as hist.
edges(2:end) = edges(2:end)+eps(edges(2:end))
edges = 1×5
-10.0000 -5.0000 0.0000 5.0000 10.0000
Now, use histogram with the bin edges.
histogram(A,edges)
