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