protected void drawDataSet(Canvas c, IBubbleDataSet dataSet) {

    Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());

    float phaseX = mAnimator.getPhaseX();
    float phaseY = mAnimator.getPhaseY();

    BubbleEntry entryFrom = dataSet.getEntryForXIndex(mMinX);
    BubbleEntry entryTo = dataSet.getEntryForXIndex(mMaxX);

    int minx = Math.max(dataSet.getEntryIndex(entryFrom), 0);
    int maxx = Math.min(dataSet.getEntryIndex(entryTo) + 1, dataSet.getEntryCount());

    sizeBuffer[0] = 0f;
    sizeBuffer[2] = 1f;

    trans.pointValuesToPixel(sizeBuffer);

    // calcualte the full width of 1 step on the x-axis
    final float maxBubbleWidth = Math.abs(sizeBuffer[2] - sizeBuffer[0]);
    final float maxBubbleHeight =
        Math.abs(mViewPortHandler.contentBottom() - mViewPortHandler.contentTop());
    final float referenceSize = Math.min(maxBubbleHeight, maxBubbleWidth);

    for (int j = minx; j < maxx; j++) {

      final BubbleEntry entry = dataSet.getEntryForIndex(j);

      pointBuffer[0] = (float) (entry.getXIndex() - minx) * phaseX + (float) minx;
      pointBuffer[1] = (float) (entry.getVal()) * phaseY;
      trans.pointValuesToPixel(pointBuffer);

      float shapeHalf = getShapeSize(entry.getSize(), dataSet.getMaxSize(), referenceSize) / 2f;

      if (!mViewPortHandler.isInBoundsTop(pointBuffer[1] + shapeHalf)
          || !mViewPortHandler.isInBoundsBottom(pointBuffer[1] - shapeHalf)) continue;

      if (!mViewPortHandler.isInBoundsLeft(pointBuffer[0] + shapeHalf)) continue;

      if (!mViewPortHandler.isInBoundsRight(pointBuffer[0] - shapeHalf)) break;

      final int color = dataSet.getColor(entry.getXIndex());

      mRenderPaint.setColor(color);
      c.drawCircle(pointBuffer[0], pointBuffer[1], shapeHalf, mRenderPaint);
    }
  }
 private float yMax(BubbleEntry entry) {
   return entry.getVal();
 }
  @Override
  public void drawHighlighted(Canvas c, Highlight[] indices) {

    BubbleData bubbleData = mChart.getBubbleData();

    float phaseX = mAnimator.getPhaseX();
    float phaseY = mAnimator.getPhaseY();

    for (Highlight indice : indices) {

      IBubbleDataSet dataSet = bubbleData.getDataSetByIndex(indice.getDataSetIndex());

      if (dataSet == null || !dataSet.isHighlightEnabled()) continue;

      BubbleEntry entryFrom = dataSet.getEntryForXIndex(mMinX);
      BubbleEntry entryTo = dataSet.getEntryForXIndex(mMaxX);

      int minx = dataSet.getEntryIndex(entryFrom);
      int maxx = Math.min(dataSet.getEntryIndex(entryTo) + 1, dataSet.getEntryCount());

      final BubbleEntry entry = (BubbleEntry) bubbleData.getEntryForHighlight(indice);
      if (entry == null || entry.getXIndex() != indice.getXIndex()) continue;

      Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());

      sizeBuffer[0] = 0f;
      sizeBuffer[2] = 1f;

      trans.pointValuesToPixel(sizeBuffer);

      // calcualte the full width of 1 step on the x-axis
      final float maxBubbleWidth = Math.abs(sizeBuffer[2] - sizeBuffer[0]);
      final float maxBubbleHeight =
          Math.abs(mViewPortHandler.contentBottom() - mViewPortHandler.contentTop());
      final float referenceSize = Math.min(maxBubbleHeight, maxBubbleWidth);

      pointBuffer[0] = (float) (entry.getXIndex() - minx) * phaseX + (float) minx;
      pointBuffer[1] = (float) (entry.getVal()) * phaseY;
      trans.pointValuesToPixel(pointBuffer);

      float shapeHalf = getShapeSize(entry.getSize(), dataSet.getMaxSize(), referenceSize) / 2f;

      if (!mViewPortHandler.isInBoundsTop(pointBuffer[1] + shapeHalf)
          || !mViewPortHandler.isInBoundsBottom(pointBuffer[1] - shapeHalf)) continue;

      if (!mViewPortHandler.isInBoundsLeft(pointBuffer[0] + shapeHalf)) continue;

      if (!mViewPortHandler.isInBoundsRight(pointBuffer[0] - shapeHalf)) break;

      if (indice.getXIndex() < minx || indice.getXIndex() >= maxx) continue;

      final int originalColor = dataSet.getColor(entry.getXIndex());

      Color.RGBToHSV(
          Color.red(originalColor),
          Color.green(originalColor),
          Color.blue(originalColor),
          _hsvBuffer);
      _hsvBuffer[2] *= 0.5f;
      final int color = Color.HSVToColor(Color.alpha(originalColor), _hsvBuffer);

      mHighlightPaint.setColor(color);
      mHighlightPaint.setStrokeWidth(dataSet.getHighlightCircleWidth());
      c.drawCircle(pointBuffer[0], pointBuffer[1], shapeHalf, mHighlightPaint);
    }
  }