///|
/// Draw box-and-whisker plots for one or more value series.
pub fn Figure::boxplot(
  self : Figure,
  data : Array[Array[Double]],
  horizontal~ : Bool = false,
  color~ : String = "",
  label~ : String = "",
) -> Array[@boxplot.BoxStats] raise @core.DataError {
  self.axes().boxplot(data, horizontal~, color~, label~)
}

///|
/// Draw box-and-whisker plots for one or more value series.
pub fn Axes::boxplot(
  self : Axes,
  data : Array[Array[Double]],
  horizontal~ : Bool = false,
  color~ : String = "",
  label~ : String = "",
) -> Array[@boxplot.BoxStats] raise @core.DataError {
  if data.length() == 0 {
    raise @core.DataError::InvalidBoxPlot(
      message="boxplot requires at least one series",
    )
  }
  let stats = Array(capacity=data.length())
  for values in data {
    stats.push(@boxplot.box_stats(values))
  }
  let resolved_color = self.resolve_color(color)
  let start = self.state.val.artists.length()
  self.push_artist(
    Artist::BoxPlot(stats.copy(), horizontal, @core.style(resolved_color)),
  )
  self.add_auto_legend(label, resolved_color, LegendKind::Patch)
  self.add_container(ContainerKind::BoxPlot, start, label)
  stats
}