如何修改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
相关产品推荐
相关产品推荐

