# binning data in equally spaced intervals

265 views (last 30 days)
shobhit mehrotra on 11 Mar 2015
Commented: Rahul Kesarkar on 7 Apr 2021
I would like to bin the data in 8 equally spaced bins. I have a the data accessible in vectors [X= conc, Y= alt] this what I have so far to create the bins
binedge = linspace(min(alt),max(alt),6)
then I want to take the average alt and conc of each each bin and plot it. Thanks shobhit mehrotra on 11 Mar 2015
How would i take the average of each bin?

Josh Meyer on 27 Mar 2015
As others noted, histcounts was introduced in R2014b and provides a great deal more flexibility for problems like this.
To use 8 bins, just do:
% Assume the first column is X, second column is Y
data = [rand(100,1), rand(100,1)];
% Find the bin placement based on the X values
[N,edges,bins] = histcounts(data(:,1),8);
The third output, bins, describes the bin placement of each element. So this makes finding the average X and Y value in each bin simple.
for n = 1:8
bin_means(:,n) = mean(data(bins==n,:))';
end
bin_means =
0.0751 0.1979 0.3342 0.4658 0.5691 0.7113 0.8691 0.9676
0.5100 0.6264 0.4949 0.5172 0.5323 0.5556 0.4381 0.6514
Rahul Kesarkar on 7 Apr 2021
How would it work if i have to bin data for a particular date range?
For example range : - weekday 12/06/2017 20:00 to 13/06/2017 08:00 and repeat this for every weekday. Weekend 9/06/2017 20:00 to 12/06/2017 08:00. Sum up all the values in the bin.

Stephen23 on 11 Mar 2015
Edited: Stephen23 on 11 Mar 2015
You can use histc to get bin the data, and then accumarray to get the mean of all of the values in each bin:
>> X = 0.25:0.5:5
X =
0.25 0.75 1.25 1.75 2.25 2.75 3.25 3.75 4.25 4.75
>> [B,idx] = histc(X,0:5);
>> V = accumarray(idx(:),X,[],@mean)
V =
0.5000
1.5000
2.5000
3.5000
4.5000
If you have a newer version, then you should use histcounts instead:
[B,~,idx] = histcounts(...);
##### 2 CommentsShow 1 older commentHide 1 older comment
Stephen23 on 11 Mar 2015
Edited: Stephen23 on 11 Mar 2015
You can simply repeat the accumarray call for each of your X and Y data vectors:
meanofXvalues = accumarray(idx(:),Xvalues,[],@mean)
meanofYvalues = accumarray(idx(:),Yvalues,[],@mean)

### 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!