stackOffsetWiggle function Stack offsets Stacks
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);
}