You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改MPAndroidChart中LineChart的条目标签单位

MPAndroidChart折线图数值单位修改问题

使用com.github.mikephil.charting.charts.LineChart展示体重数据,期望将数值格式改为208.45L或208.45K,但无法替换原有Kg单位,相关代码如下:

entries.add(new Entry(i, 208f));

private void setUpChart() {
    mBinding.flChartHolder.removeAllViews();
    mBinding.barChart.setData(null);
    mBinding.barChart.invalidate();
    mBinding.barChart.setDescription(null);

    mBinding.barChart.setGridBackgroundColor(R.color.white);
    mBinding.barChart.getLegend().setEnabled(false);
    mBinding.barChart.setScaleEnabled(false);

    mBinding.barChart.setData(generateLineData());

    YAxis rightAxis = mBinding.barChart.getAxisRight();
    rightAxis.setDrawLabels(false);
    rightAxis.setDrawGridLines(false);
    rightAxis.setXOffset(8f);
    rightAxis.setAxisLineColor(Color.TRANSPARENT);
    rightAxis.setGranularity(0f);


    XAxis xAxis = mBinding.barChart.getXAxis();

    xAxis.setDrawLabels(true);
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setDrawGridLines(false);
    xAxis.setYOffset(4f);
    xAxis.setAxisLineColor(Color.TRANSPARENT);
    xAxis.setGranularity(0f);
    xAxis.setTextColor(ContextCompat.getColor(this, R.color.colorGreen));
    xAxis.setGranularityEnabled(true);
    xAxis.setTextSize(10f);

    YAxis leftAxis = mBinding.barChart.getAxisLeft();
    leftAxis.setXOffset(4f);
    leftAxis.setAxisLineColor(Color.TRANSPARENT);
    leftAxis.setGranularity(0f);
    leftAxis.setDrawZeroLine(false);
    leftAxis.setTextColor(ContextCompat.getColor(this, R.color.dinner_color));
    leftAxis.setGranularityEnabled(true);
    if (mResult.getGraph() != null && mResult.getGraph().size() > 0) {
        leftAxis.setAxisMinimum((float) (startValue - (float) 60));
        leftAxis.setAxisMaximum((float) (startValue + (float) 60));
    }
    leftAxis.setLabelCount((int) leftAxis.getAxisMaximum() / 20, true);
    leftAxis.setTextSize(10f);

    xAxis.setLabelCount(mResult.getGraph().size(), true);
    xAxis.setValueFormatter(new ValueFormatter() {
        @Override
        public String getFormattedValue(float value) {
            Logger.e("valus---" + value);
            int index = (int) value;
            return getStringFromDate(index);
        }
    });


    mBinding.barChart.invalidate();
    mBinding.flChartHolder.addView(mBinding.barChart);
}

private LineData generateLineData() {

    LineData d = new LineData();

    ArrayList<Entry> entries = new ArrayList<>();
    for (int i = 0; i < mResult.getGraph().size(); i++) {

        if (mUserData.getCurrentUnitMeasure() != IMERIAL_UNIT) {
            entries.add(new Entry(i, toLbs(Float.valueOf(String.valueOf(mResult.getGraph().get(i).getWeightKg())))));
        } else {
            entries.add(new Entry(i, Float.valueOf(String.valueOf(mResult.getGraph().get(i).getWeightKg()))));
        }
    }

    entries.add(new Entry(0, 0f));

    LineDataSet set = new LineDataSet(entries, "rttrtrt");
    set.notifyDataSetChanged();
    set.setDrawIcons(false);
    set.setColors(ContextCompat.getColor(this, R.color.colorGreen));

    set.setDrawCircles(true);
    set.setLabel("test");
    set.setCircleColor(ContextCompat.getColor(this, R.color.colorGreen));
    set.setCircleRadius(3.5f);
    set.setCircleHoleRadius(0f);
    set.setLineWidth(1.5f);
    set.setValueTextColor(ContextCompat.getColor(this, R.color.colorGreen));
    set.setDrawHorizontalHighlightIndicator(true);
    set.setValueTextSize(12f);
    set.setDrawHorizontalHighlightIndicator(false);
    set.setDrawVerticalHighlightIndicator(false);

    set.setValueFormatter(new ValueFormatter() {

        @Override
        public String getPointLabel(Entry entry) {

            DecimalFormat df = new DecimalFormat("#.00");
            Float weight2DecimalsAtEnd = Float.valueOf(df.format(entry.getY()));

            Log.d("weight2DecimalsAtEnd", weight2DecimalsAtEnd.toString());

            if (mUserData.getCurrentUnitMeasure() != IMERIAL_UNIT) {
                return weight2DecimalsAtEnd + "L";
            } else {
                return weight2DecimalsAtEnd + "K";
            }
        }
    });

    d.addDataSet(set);

    return d;
}

解决方案

1. 替换ValueFormatter的重写方法

当前重写的getPointLabel是MPAndroidChart旧版本方法,新版本需使用getFormattedValue来格式化数据点文本:

set.setValueFormatter(new ValueFormatter() {
    @Override
    public String getFormattedValue(float value) {
        DecimalFormat df = new DecimalFormat("#.00");
        String formattedWeight = df.format(value);
        if (mUserData.getCurrentUnitMeasure() != IMERIAL_UNIT) {
            return formattedWeight + "L";
        } else {
            return formattedWeight + "K";
        }
    }
});

说明:该方法直接控制数据点上显示的文本,替换后即可正确输出X.XXL或X.XXK格式。

2. 给Y轴刻度添加单位(可选)

如果左侧Y轴的刻度也需要显示对应单位,给左侧Y轴设置同样的格式化器:

YAxis leftAxis = mBinding.barChart.getAxisLeft();
leftAxis.setValueFormatter(new ValueFormatter() {
    @Override
    public String getFormattedValue(float value) {
        DecimalFormat df = new DecimalFormat("#.00");
        String formattedValue = df.format(value);
        if (mUserData.getCurrentUnitMeasure() != IMERIAL_UNIT) {
            return formattedValue + "L";
        } else {
            return formattedValue + "K";
        }
    }
});

3. 修复精度丢失问题

移除代码中Float.valueOf(df.format(entry.getY()))的转换操作,直接使用格式化后的字符串,避免因浮点数转换导致的精度丢失。

4. 清理无效数据点

删除entries.add(new Entry(0, 0f));,该代码会添加一个无意义的0值数据点,干扰正常图表展示。

内容的提问来源于stack exchange,提问作者Kunal Kalwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:15:32