@@ -62,15 +62,22 @@ impl style::Bar for Style {
6262 }
6363}
6464
65+ #[ derive( Debug ) ]
66+ enum HistogramType {
67+ Count ,
68+ Density ,
69+ }
70+
6571/**
6672A one-dimensional histogram with equal binning.
6773*/
6874#[ derive( Debug ) ]
6975pub struct Histogram {
7076 pub bin_bounds : Vec < f64 > , // will have N_bins + 1 entries
71- pub bin_counts : Vec < u32 > , // will have N_bins entries
77+ pub bin_counts : Vec < f64 > , // will have N_bins entries
7278 pub bin_densities : Vec < f64 > , // will have N_bins entries
7379 style : Style ,
80+ h_type : HistogramType ,
7481}
7582
7683impl Histogram {
@@ -117,9 +124,10 @@ impl Histogram {
117124
118125 Histogram {
119126 bin_bounds : bounds,
120- bin_counts : bins,
127+ bin_counts : bins. iter ( ) . map ( | & x| f64 :: from ( x ) ) . collect ( ) ,
121128 bin_densities : density_per_bin,
122129 style : Style :: new ( ) ,
130+ h_type : HistogramType :: Count ,
123131 }
124132 }
125133
@@ -135,18 +143,36 @@ impl Histogram {
135143 }
136144
137145 fn y_range ( & self ) -> ( f64 , f64 ) {
138- let max = * self . bin_counts . iter ( ) . max ( ) . unwrap ( ) ;
139- ( 0. , f64:: from ( max) )
146+ let max = self
147+ . get_values ( )
148+ . iter ( )
149+ . fold ( -1. / 0. , |a, & b| f64:: max ( a, b) ) ;
150+ ( 0. , max)
140151 }
141152
142153 pub fn style ( mut self , style : & Style ) -> Self {
143154 self . style . overlay ( style) ;
144155 self
145156 }
146157
158+ /**
159+ Set the histogram to display as normalised densities
160+ */
161+ pub fn density ( mut self ) -> Self {
162+ self . h_type = HistogramType :: Density ;
163+ self
164+ }
165+
147166 pub fn get_style ( & self ) -> & Style {
148167 & self . style
149168 }
169+
170+ pub fn get_values ( & self ) -> & [ f64 ] {
171+ match self . h_type {
172+ HistogramType :: Count => & self . bin_counts ,
173+ HistogramType :: Density => & self . bin_densities ,
174+ }
175+ }
150176}
151177
152178impl ContinuousRepresentation for Histogram {
@@ -185,14 +211,14 @@ mod tests {
185211
186212 #[ test]
187213 fn test_histogram_from_slice ( ) {
188- assert_eq ! ( Histogram :: from_slice( & [ ] , 3 ) . bin_densities , [ 0. , 0. , 0. ] ) ;
189- assert_eq ! ( Histogram :: from_slice( & [ 0. ] , 3 ) . bin_densities , [ 0. , 3 ., 0. ] ) ;
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. ] ) ;
190216 assert_eq ! (
191- Histogram :: from_slice( & [ 0. , 3. ] , 3 ) . bin_densities ,
217+ Histogram :: from_slice( & [ 0. , 3. ] , 3 ) . get_values ( ) ,
192218 [ 1. , 0. , 1. ]
193219 ) ;
194220 assert_eq ! (
195- Histogram :: from_slice( & [ 0. , 1. , 2. , 3. ] , 3 ) . bin_densities ,
221+ Histogram :: from_slice( & [ 0. , 1. , 2. , 3. ] , 3 ) . get_values ( ) ,
196222 [ 2. , 1. , 1. ]
197223 ) ;
198224 }
0 commit comments