MPAndroidChart:是否可以为给定的DataSet旋转值标签?

时间:2016-12-23 11:50:22

标签: android bar-chart mpandroidchart

在我的Android应用程序中,我有一个使用MPAndroidChart制作的条形图。我的问题是当条形图中有多个条形图时,每个条形图上方的值标签与其他值标签重叠,如下面附带的屏幕截图所示。我知道这是因为没有显示标签的空间,但我认为如果可以将值标签旋转90度(如我的屏幕截图中的XAxis标签),则可以避免这种情况。那可能吗?如果我放大,那么我可以清楚地看到所有值。我正在使用MPAndroidChart v3.0.1。

MPAndroid Chart

以下是我的代码。

        yVals1 = new ArrayList<BarEntry>();
    xVals = new ArrayList<String>();
    for (int i = 0; i < listChart.size(); i++){
        BarEntry newBEntry = new BarEntry(i,listChart.get(i).getAmount());
        xVals.add(listChart.get(i).getAltName());
        yVals1.add(newBEntry);
    }
    BarDataSet set1;
    if (bChartRepOne.getData() != null && bChartRepOne.getData().getDataSetCount() > 0) {
        set1 = (BarDataSet) bChartRepOne.getData().getDataSetByIndex(0);
        set1.setValues(yVals1);
        bChartRepOne.getData().notifyDataChanged();
        bChartRepOne.notifyDataSetChanged();
    } else {
        set1 = new BarDataSet(yVals1, chart);
        set1.setColors(ColorTemplate.MATERIAL_COLORS);
        ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
        dataSets.add(set1);
        BarData data = new BarData(dataSets);
        data.setValueTextSize(8f);

        bChartRepOne.setData(data);
    }

    XAxis xAxis = bChartRepOne.getXAxis();
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setDrawGridLines(false);
    xAxis.setLabelCount(xList.size()-1);
    xAxis.setGranularity(1f); // only intervals of 1 day
    xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            if(Math.round(value) >= xList.size()) {
                return null;
            } else {
                return xList.get(Math.round(value));
            }
        }
    });
    xAxis.setLabelRotationAngle(-90);

    YAxis leftAxis = bChartRepOne.getAxisLeft();
    leftAxis.setLabelCount(8, false);
    leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
    leftAxis.setSpaceTop(15f);
    YAxis rightAxis = bChartRepOne.getAxisRight();
    rightAxis.setEnabled(false);

    Legend l = bChartRepOne.getLegend();
    l.setEnabled(false);

    bChartRepOne.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
        @Override
        public void onValueSelected(Entry entry, Highlight highlight) {

        }

        @Override
        public void onNothingSelected() {

        }
    });

3 个答案:

答案 0 :(得分:1)

从版本3.0.1开始,没有任何方法可以在一个角度上绘制给定DataSet的值标签。在处理DataSet对象时,可以使用IDE中的自动完成功能检查这些内容。

如果您想自己尝试,则必须编写自定义渲染器并调用:

mChart.setRenderer(myCustomRenderer);

要制作自定义渲染器,您可以继承BarChartRenderer并覆盖以下方法:

drawValue(Canvas c, IValueFormatter formatter, float value, Entry entry, int dataSetIndex, float x, float y, int color) 

你可以在那里放置代码,以任意旋转渲染一个标签。

Utils内部有一个名为

的方法
drawXAxisValue(Canvas c, String text, float x, float y,
                                  Paint paint,
                                  MPPointF anchor, float angleDegrees)

包含以某个角度绘制文本的代码,因此您可以将其用作模板。

答案 1 :(得分:0)

我在条形图中旋转了值。它可能对某人有所帮助。代码是

public class MyBarChartRenderer extends BarChartRenderer {
public MyBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
    super(chart, animator, viewPortHandler);
}



@Override
public void drawValue(Canvas c, IValueFormatter formatter, float value, Entry entry, int dataSetIndex, float x, float y, int color) {

    // super.drawValue(c, formatter, value, entry, dataSetIndex, x, y, color);

    Paint paint=super.mDrawPaint;
    paint.setTextSize(25f);
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
    Utils.drawXAxisValue(c,value,x,y,paint, MPPointF.getInstance(),270);
}}

答案 2 :(得分:0)

以下是自定义渲染器在-60度旋转文本的完整代码

public class CustomBarChartRenderer extends BarChartRenderer {

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

    @Override
    public void drawValue(Canvas canvas, IValueFormatter formatter, float value, Entry entry, int dataSetIndex, float x, float y, int color) {
        mValuePaint.setColor(color);

        canvas.save();
        canvas.rotate(-60, x, y);

        canvas.drawText(formatter.getFormattedValue(value, entry, dataSetIndex, mViewPortHandler), x, y, mValuePaint);
        canvas.restore();

        /*
        Alternate solution
        Paint paint = super.mDrawPaint;
        paint.setTextSize(25f);

        //paint.setTextAlign(Paint.Align.CENTER);
        //paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL));
        Utils.drawXAxisValue(c, value + "", x, y, paint, MPPointF.getInstance(), -60);
        */
    }

}

设置渲染器使用:

barChart.setRenderer(new CustomBarChartRenderer(barChart, barChart.getAnimator(), barChart.getViewPortHandler()));