В библиотеке MPAndroidChart, как переносить метки X Axis на две строки, если они долго?

Я пытаюсь показать метку оси X, чтобы перейти к 2 строкам, когда они длинны. Как добиться этого в LineChart? См. Снимок экрана ниже. Я хочу, чтобы время переходило во вторую строчку, а не оставалось рядом с ней.

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

Ответ 1

Для таких, как я, которые хотят достичь этого, но сохраняйте оригинальную библиотеку, вот простое решение, вдохновленное модификациями @fgueli. Это относится только к одной строке разрыва (добавьте "\n" в свои метки), но вы можете легко адаптировать ее к вашим потребностям.

  • Подкласс XAxisRenderer

    public class CustomXAxisRenderer extends XAxisRenderer {
        public CustomXAxisRenderer(ViewPortHandler viewPortHandler, XAxis xAxis, Transformer trans) {
             super(viewPortHandler, xAxis, trans);
        }
    
        @Override
        protected void drawLabel(Canvas c, String formattedLabel, float x, float y, MPPointF anchor, float angleDegrees) {
            String line[] = formattedLabel.split("\n");
            Utils.drawXAxisValue(c, line[0], x, y, mAxisLabelPaint, anchor, angleDegrees);
            Utils.drawXAxisValue(c, line[1], x + mAxisLabelPaint.getTextSize(), y + mAxisLabelPaint.getTextSize(), mAxisLabelPaint, anchor, angleDegrees);
        }
    }
    

  • Установите этот рендерер на нужный график

    lineChart.setXAxisRenderer(new CustomXAxisRenderer(lineChart.getViewPortHandler(), lineChart.getXAxis(), lineChart.getTransformer(YAxis.AxisDependency.LEFT)));
    

  1. Наслаждайтесь!

Ярлыки LineChart на нескольких строках

Ответ 2

Я изменил библиотеку, чтобы разрешить многострочную метку на xAxis, используя \n

https://github.com/fabriziogueli/MPAndroidChart/tree/axis_multiline_labels

Он работает прямо сейчас, но нуждается в дальнейшем тестировании и, возможно, в разработке или настройке кода.

XAxis xAxis = mChart.getXAxis();
xAxis.setMultiLineLabel(true);

Затем вы можете использовать, например, SimpleDateFormat, как это:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy\nHH:mm a");

Возможно, вам нужно установить дополнительное нижнее смещение на ваш график:

mChart.setExtraBottomOffset(50);

Ответ 3

Это похоже на то, что вам нужно будет реализовать самостоятельно, изменив библиотеку в соответствии с вашими потребностями.

В настоящее время невозможно по умолчанию иметь несколько строк по оси x. Причина в том, что Android Canvas не может просто построить строку, например. как это "Line 1\nLine2" как две строки.

Ответ 4

Нет необходимости смещать координату x. А для многострочного сценария код должен быть

@Override
protected void drawLabel(Canvas c, String formattedLabel, float x, float y, MPPointF anchor, float angleDegrees) {
    String lines[] = formattedLabel.split("\n");
    for (int i = 0; i < lines.length; i++) {
        float vOffset = i * mAxisLabelPaint.getTextSize();
        Utils.drawXAxisValue(c, lines[i], x, y + vOffset, mAxisLabelPaint, anchor, angleDegrees);
    }
}

Ответ 5

Используйте ответ @Guillaume Jounel и затем добавьте:

XAxis xAxis = lineChart.getXAxis();    
xAxis.setLabelRotationAngle(-30f);

Ответ 6

Улучшенная версия ответа @Guillaume Jounel для поддержки нескольких новых строк, а также строк без новой строки.

    @Override
    protected void drawLabel(Canvas c, String formattedLabel, float x, float y,
                                 MPPointF anchor, float angleDegrees) {
    String line[] = formattedLabel.split("\n");
    Utils.drawXAxisValue(c, line[0], x, y, mAxisLabelPaint, anchor, angleDegrees);
        for (int i = 1; i < line.length; i++) { // we've already processed 1st line
             Utils.drawXAxisValue(c, line[i], x, y + mAxisLabelPaint.getTextSize() * i,
                 mAxisLabelPaint, anchor, angleDegrees);
        }
    }