stackOffsetWiggle function Stack offsets Stacks

void stackOffsetWiggle(
  1. List<List<List<num>>> series,
  2. List<int> order
)

Shifts the baseline so as to minimize the weighted wiggle of layers.

final stack = Stack(…)..offset = stackOffsetWiggle;

This offset is recommended for streamgraphs in conjunction with the stackOrderInsideOut. See Stacked Graphs — Geometry & Aesthetics by Bryon & Wattenberg for more information.

Implementation

void stackOffsetWiggle(List<List<List<num>>> series, List<int> order) {
  int m, n;
  List<List<num>> s0;
  if (!((n = series.length) > 0) ||
      !((m = (s0 = series[order[0]]).length) > 0)) {
    return;
  }
  int j = 1;
  num y = 0;
  for (; j < m; ++j) {
    num s1 = 0, s2 = 0;
    for (var i = 0; i < n; ++i) {
      var si = series[order[i]], sij0 = si[j][1], sij1 = si[j - 1][1];
      sij0 = sij0.isNaN ? 0 : sij0;
      var s3 = (sij0 - (sij1.isNaN ? 0 : sij1)) / 2;
      for (var k = 0; k < i; ++k) {
        var sk = series[order[k]], skj0 = sk[j][1], skj1 = sk[j - 1][1];
        s3 += (skj0.isNaN ? 0 : skj0) - (skj1.isNaN ? 0 : skj1);
      }
      s1 += sij0;
      s2 += s3 * sij0;
    }
    s0[j - 1][1] += s0[j - 1][0] = y;
    if (s1 != 0) y -= s2 / s1;
  }
  s0[j - 1][1] += s0[j - 1][0] = y;
  stackOffsetNone(series, order);
}