Method: Histogram#number_of_bins
- Defined in:
- lib/histogram.rb
#number_of_bins(methd = DEFAULT_BIN_METHOD, quartile_method = DEFAULT_QUARTILE_METHOD) ⇒ Object
returns(integer) takes :scott|:sturges|:fd|:middle
middle is the median between the other three values
Note: always returns 1 if all values are the same.
inspired by Richard Cotton’s matlab implementation and the histogram page on wikipedia
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/histogram.rb', line 97 def number_of_bins(methd=DEFAULT_BIN_METHOD, quartile_method=DEFAULT_QUARTILE_METHOD) return 1 if self.to_a.uniq.size == 1 if methd == :middle [:scott, :sturges, :fd].map {|v| number_of_bins(v) }.sort[1] else nbins = case methd when :scott range = (self.max - self.min).to_f (mean, stddev) = Histogram.sample_stats(self) if stddev == 0.0 1 else range / ( 3.5*stddev*(self.size**(-1.0/3)) ) end when :sturges 1 + Math::log2(self.size) when :fd 2 * Histogram.iqrange(self, :method => quartile_method) * (self.size**(-1.0/3)) end if nbins > self.size || nbins.to_f.nan? || nbins <= 0 nbins = 1 end nbins.ceil.to_i end end |