Пользовательские установки для столбцов со значениями


Я использую библиотеку MPAndroidChart для создания гистограмм.

Мы можем использовать следующее, чтобы показать значения бара в верхней части бара.

mChart.setDrawValueAboveBar(false);

Или мы можем использовать это :

barDataSet.setDrawValues(true);

Для отображения значений бара внутри самого бара. Я хочу знать, можем ли мы установить пользовательскую позицию для значений. Например, ниже оси Y.

Введите описание изображения здесь

Решение

public class TextBarChartRenderer extends BarChartRenderer {

    public TextBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
        super(chart, animator, viewPortHandler);
    }

    @Override
    public void drawValues(Canvas c) {
        List<IBarDataSet> dataSets = mChart.getBarData().getDataSets();

        final float valueOffsetPlus = Utils.convertDpToPixel(22f)
        float negOffset;

        for (int i = 0; i < mChart.getBarData().getDataSetCount(); i++) {

            IBarDataSet dataSet = dataSets.get(i);
            applyValueTextStyle(dataSet);
            float valueTextHeight = Utils.calcTextHeight(mValuePaint, "8");
            negOffset = valueTextHeight + valueOffsetPlus;

            BarBuffer buffer = mBarBuffers[i];

            float left;
            float right;
            float top;
            float bottom;

            for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) {

                left = buffer.buffer[j];
                right = buffer.buffer[j + 2];
                top = buffer.buffer[j + 1];
                bottom = buffer.buffer[j + 3];

                float x = (left + right) / 2f;

                if (!mViewPortHandler.isInBoundsRight(x))
                    break;

                if (!mViewPortHandler.isInBoundsY(top) || !mViewPortHandler.isInBoundsLeft(x))
                    continue;

                BarEntry entry = dataSet.getEntryForIndex(j / 4);
                float val = entry.getY();

                if(val > 0) {
                    drawValue(c, dataSet.getValueFormatter(), val, entry, i, x,
                            (bottom + negOffset),
                            dataSet.getValueTextColor(j / 4));
                }
            }
        }

    }
}

Также пришлось добавить это, чтобы значения были видимый

mChart.setExtraOffsets(0, 0, 0, 20);
1 3

1 ответ:

В API нет метода, позволяющего изменить положение меток значений на положение ниже оси YAxis. Вероятно, вам придется расширить и модифицировать библиотеку, чтобы удовлетворить ваши необычные требования.

Один из вариантов, чтобы попытаться было бы реализовать IAxisValueFormatter на оси X для отображения y-значений вместо x-значений. Простой пример может повторно использовать существующий IndexAxisValueFormatter. Допустим, у вас есть метки для y-значений в String [], называемом yLabels. Теперь вы можете сделать следующее:

mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(yLabels));

Если это не работает, вам придется посмотреть на источник для BarChartRenderer. Существует метод под названием drawValues(), который можно переопределить для достижения нужного эффекта.

Таким образом, у вас будет что-то вроде:

public class MyBarChartRenderer extends BarChartRenderer {

    //TODO: a constructor matching the superclass

    @Override
    public void drawValues(Canvas c) {
        //TODO: copy and paste the code from the superclass and simply
        //change the offset for drawing the labels
    }
}