fromData static method

Implementation

static SimpleBoxPlotSummary? fromData(SimpleBoxPlotData data) {
  final hasSummary =
      data.min != null &&
      data.q1 != null &&
      data.median != null &&
      data.q3 != null &&
      data.max != null;
  if (hasSummary) {
    final values = [data.min!, data.q1!, data.median!, data.q3!, data.max!];
    if (values.any((value) => !value.isFinite)) return null;
    values.sort();
    return SimpleBoxPlotSummary(
      min: values[0],
      q1: values[1],
      median: values[2],
      q3: values[3],
      max: values[4],
      mean: data.mean?.isFinite == true ? data.mean : null,
      outliers: data.outliers.where((value) => value.isFinite).toList(),
    );
  }

  final values = data.values.where((value) => value.isFinite).toList()
    ..sort();
  if (values.isEmpty) return null;
  final q1 = _quantile(values, 0.25);
  final median = _quantile(values, 0.5);
  final q3 = _quantile(values, 0.75);
  final iqr = q3 - q1;
  final lowFence = q1 - 1.5 * iqr;
  final highFence = q3 + 1.5 * iqr;
  final inliers = values
      .where((value) => value >= lowFence && value <= highFence)
      .toList();
  final outliers = values
      .where((value) => value < lowFence || value > highFence)
      .toList();
  final mean = values.fold(0.0, (sum, value) => sum + value) / values.length;
  return SimpleBoxPlotSummary(
    min: inliers.isEmpty ? values.first : inliers.first,
    q1: q1,
    median: median,
    q3: q3,
    max: inliers.isEmpty ? values.last : inliers.last,
    mean: mean,
    outliers: outliers,
  );
}