@@ -10,7 +10,7 @@ A module for Histograms
1010let data = vec![0.3, 0.5, 6.4, 5.3, 3.6, 3.6, 3.5, 7.5, 4.0];
1111
1212// and create a histogram out of it
13- let h = Histogram::from_slice(&data, 30 );
13+ let h = Histogram::from_slice(&data, plotlib::histogram::Bins::Count(30) );
1414```
1515
1616TODO:
@@ -68,6 +68,12 @@ enum HistogramType {
6868 Density ,
6969}
7070
71+ #[ derive( Debug ) ]
72+ pub enum Bins {
73+ Count ( usize ) ,
74+ Bounds ( Vec < f64 > ) ,
75+ }
76+
7177/**
7278A one-dimensional histogram with equal binning.
7379*/
@@ -81,7 +87,7 @@ pub struct Histogram {
8187}
8288
8389impl Histogram {
84- pub fn from_slice ( v : & [ f64 ] , num_bins : usize ) -> Histogram {
90+ pub fn from_slice ( v : & [ f64 ] , bins : Bins ) -> Histogram {
8591 let mut max = v. iter ( ) . fold ( -1. / 0. , |a, & b| f64:: max ( a, b) ) ;
8692 let mut min = v. iter ( ) . fold ( 1. / 0. , |a, & b| f64:: min ( a, b) ) ;
8793
@@ -90,18 +96,22 @@ impl Histogram {
9096 max += 0.5 ;
9197 }
9298
93- let mut bins = vec ! [ 0 ; num_bins] ;
99+ let ( num_bins, bounds) = match bins {
100+ Bins :: Count ( num_bins) => {
101+ let range = max - min;
102+ let mut bounds: Vec < f64 > = ( 0 ..num_bins)
103+ . map ( |n| ( n as f64 / num_bins as f64 ) * range + min)
104+ . collect ( ) ;
105+ bounds. push ( max) ;
106+ ( num_bins, bounds)
107+ }
108+ Bins :: Bounds ( bounds) => ( bounds. len ( ) , bounds) ,
109+ } ;
94110
95- let range = max - min ;
111+ let mut bins = vec ! [ 0 ; num_bins ] ;
96112
97113 let bin_width = ( max - min) / num_bins as f64 ; // width of bin in real units
98114
99- let mut bounds: Vec < f64 > = ( 0 ..num_bins)
100- . map ( |n| ( n as f64 / num_bins as f64 ) * range + min)
101- . collect ( ) ;
102- bounds. push ( max) ;
103- let bounds = bounds;
104-
105115 for & val in v. iter ( ) {
106116 /*
107117 let mut bin = ((val - min) / bin_width) as usize;
@@ -211,15 +221,33 @@ mod tests {
211221
212222 #[ test]
213223 fn test_histogram_from_slice ( ) {
214- assert_eq ! ( Histogram :: from_slice( & [ ] , 3 ) . get_values( ) , [ 0. , 0. , 0. ] ) ;
215- assert_eq ! ( Histogram :: from_slice( & [ 0. ] , 3 ) . get_values( ) , [ 0. , 1. , 0. ] ) ;
216224 assert_eq ! (
217- Histogram :: from_slice( & [ 0. , 3. ] , 3 ) . get_values( ) ,
225+ Histogram :: from_slice( & [ ] , Bins :: Count ( 3 ) ) . get_values( ) ,
226+ [ 0. , 0. , 0. ]
227+ ) ;
228+ assert_eq ! (
229+ Histogram :: from_slice( & [ 0. ] , Bins :: Count ( 3 ) ) . get_values( ) ,
230+ [ 0. , 1. , 0. ]
231+ ) ;
232+ assert_eq ! (
233+ Histogram :: from_slice( & [ 0. , 3. ] , Bins :: Count ( 3 ) ) . get_values( ) ,
218234 [ 1. , 0. , 1. ]
219235 ) ;
220236 assert_eq ! (
221- Histogram :: from_slice( & [ 0. , 1. , 2. , 3. ] , 3 ) . get_values( ) ,
237+ Histogram :: from_slice( & [ 0. , 1. , 2. , 3. ] , Bins :: Count ( 3 ) ) . get_values( ) ,
222238 [ 2. , 1. , 1. ]
223239 ) ;
224240 }
241+
242+ #[ test]
243+ fn test_histogram_define_bin_bounds ( ) {
244+ assert_eq ! (
245+ Histogram :: from_slice( & [ 0. , 1. ] , Bins :: Count ( 3 ) ) . bin_bounds,
246+ [ 0. , 1. / 3. , 2. / 3. , 1. ]
247+ ) ;
248+ assert_eq ! (
249+ Histogram :: from_slice( & [ ] , Bins :: Bounds ( [ 0. , 1. , 1.5 , 2. , 5.6 ] . to_vec( ) ) ) . bin_bounds,
250+ [ 0. , 1. , 1.5 , 2. , 5.6 ]
251+ ) ;
252+ }
225253}
0 commit comments