anchor.diff:  
     /// Paints [BarChartData] into the provided canvas.
     @override
  -  void paint(Canvas canvas, Size size) {
  -    super.paint(canvas, size);
  +  void paint(Canvas canvas, Size size, PaintHolder<BarChartData> holder) {
  +    super.paint(canvas, size, holder);
  +    final data = holder.data;
  +    final targetData = holder.targetData;
       final canvasWrapper = CanvasWrapper(canvas, size);
   
       if (data.barGroups.isEmpty) {
         return;
       }
   
  -    final groupsX = _calculateGroupsX(size, data.barGroups, data.alignment);
  +    final groupsX = _calculateGroupsX(size, data.barGroups, data.alignment, holder);
       _groupBarsPosition = _calculateGroupAndBarsPosition(size, groupsX, data.barGroups);
   
  -    _drawBars(canvasWrapper, _groupBarsPosition!);
  -    drawAxisTitles(canvasWrapper);
  -    _drawTitles(canvasWrapper, _groupBarsPosition!);
  +    _drawBars(canvasWrapper, _groupBarsPosition!, holder);
  +    drawAxisTitles(canvasWrapper, holder);
  +    _drawTitles(canvasWrapper, _groupBarsPosition!, holder);
   
       for (var i = 0; i < targetData.barGroups.length; i++) {
         final barGroup = targetData.barGroups[i];
  
positive.code:             text: span,
              textAlign: TextAlign.center,
              textDirection: TextDirection.ltr,
              textScaleFactor: textScale);
          tp.layout();
          var x = groupBarPos.groupX;
          final y = drawSize.height + getTopOffsetDrawSize() + bottomTitles.margin;
  
          x -= tp.width / 2;
          canvasWrapper.save();
  
negative.code:               text: span,
                textAlign: TextAlign.center,
                textDirection: TextDirection.ltr,
                textScaleFactor: holder.textScale);
            tp.layout(maxWidth: getExtraNeededHorizontalSpace(holder));
            x -= tp.width + leftTitles.margin;
            y -= tp.height / 2;
            canvasWrapper.save();
  