modify method

  1. @override
AttributesGroups modify(
  1. AttributesGroups groups,
  2. Map<String, ScaleConv<dynamic, num>> scales,
  3. AlgForm form,
  4. CoordConv coord,
  5. Offset origin,
)
override

Modifies the position of mark items.

The aesthetic encodes are in the groups.

Note that the modifier should be functional, which means to return a new groups list as result, not to change the input groups.

Implementation

@override
AttributesGroups modify(
    AttributesGroups groups,
    Map<String, ScaleConv<dynamic, num>> scales,
    AlgForm form,
    CoordConv coord,
    Offset origin) {
  final xField = form.first[0];
  final band = (scales[xField] as DiscreteScaleConv).band;

  final ratio = this.ratio ?? 1 / (groups.length);
  final symmetric = this.symmetric ?? true;

  final bias = ratio * band;
  // If symmetric, negtively shifts half of the total bias.
  var accumulated = symmetric ? -bias * (groups.length - 1) / 2 : 0.0;

  final AttributesGroups rst = [];
  for (var group in groups) {
    final groupRst = <Attributes>[];
    for (var attributes in group) {
      final oldPosition = attributes.position;
      groupRst.add(attributes.withPosition(oldPosition
          .map(
            (point) => Offset(point.dx + accumulated, point.dy),
          )
          .toList()));
    }
    rst.add(groupRst);
    accumulated += bias;
  }

  return rst;
}