@Override
  protected void postPaintRow(AbstractGraphRow row, Graphics2D g2d) {
    if (row.size() >= 3) {
      CubicSpline cs = new CubicSpline(row);
      long minX = row.getMinX();
      long maxX = row.getMaxX();

      double step = (double) (maxX - minX) / splineLinesCount;

      double currentX = minX;

      while (currentX <= maxX) {
        x = chartRect.x + (int) ((currentX - minXVal) * dxForDVal);
        int yHeight = (int) ((cs.interpolate(currentX) - minYVal) * dyForDVal);
        y = chartRect.y + chartRect.height - yHeight;

        // prevent out of range
        if (y < chartRect.y) {
          y = chartRect.y;
        }
        if (y > chartRect.y + chartRect.height) {
          y = chartRect.y + chartRect.height;
        }

        currentX += step;

        if (prevX >= 0) {
          g2d.drawLine(prevX, prevY, x, y);
        }

        prevX = x;
        prevY = y;
      }
    }
  }