histogram static method

List<({int count, double end, double start})> histogram(
  1. List<double> values, {
  2. int binCount = 10,
  3. double? forcedMin,
  4. double? forcedMax,
})

Compute histogram bins for values into binCount equal-width buckets.

Returns list of (binStart, binEnd, count) records.

Implementation

static List<({double start, double end, int count})> histogram(
  List<double> values, {
  int binCount = 10,
  double? forcedMin,
  double? forcedMax,
}) {
  final count = _normalizeGeneratedCount(binCount);
  if (count <= 0) return const [];

  final visibleValues = _finiteValues(values);
  if (visibleValues.isEmpty) return const [];

  final dataMin = visibleValues.reduce((a, b) => a < b ? a : b);
  final dataMax = visibleValues.reduce((a, b) => a > b ? a : b);
  final rawMin = forcedMin != null && forcedMin.isFinite
      ? forcedMin
      : dataMin;
  final rawMax = forcedMax != null && forcedMax.isFinite
      ? forcedMax
      : dataMax;
  double min = math.min(rawMin, rawMax);
  double max = math.max(rawMin, rawMax);
  if (min == max) {
    max = min + 1;
  }
  final double width = (max - min) / count;
  if (!width.isFinite || width <= 0) return const [];

  final counts = List<int>.filled(count, 0);
  for (final v in visibleValues) {
    int bin = ((v - min) / width).floor();
    if (bin >= count) bin = count - 1;
    if (bin < 0) bin = 0;
    counts[bin]++;
  }
  return List.generate(
    count,
    (i) => (
      start: min + i * width,
      end: min + (i + 1) * width,
      count: counts[i],
    ),
  );
}