MPAndroid图表库,标签位置混乱

时间:2018-07-25 19:41:28

标签: java android mpandroidchart

我正在尝试使用MPAndroid图表库在分组的条形图上放置标签,但是现在已经有一段时间了。我正在使用axis.setValueFormatter()函数设置标签。这是我的setValueFormatter函数:

    public class MyAxisValueFormatter implements IAxisValueFormatter
    {
        private String [] m;
        public MyAxisValueFormatter(String[] arr)
        {
            this.m = arr;
        }

        @Override
        public String getFormattedValue(float value, AxisBase axis) {
         //   Log.i("deep",Integer.toString((int)value));
            return m[(int) value];
        }

        @Override
        public int getDecimalDigits() {
            return 0;
        }
    }

这是我设置图表的方式,机器是一个包含标签的arrayList:

    float barWidth = 0.50f;//0.45
    String[] mac = new String[machines.size()];

    for(int i=0;i<machines.size();++i)
    {
       mac[i] = machines.get(i);
    }

    BarChart chart1 = (BarChart) findViewById(R.id.chart1);
    BarDataSet bds2 = new BarDataSet(barEntries, "Target"); 
    BarDataSet bds1 = new BarDataSet(barEntries1,"Prepared");
    bds1.setColor(Color.parseColor("#F44336"));
    BarData ddata1 = new BarData(bds1,bds2);
    chart1.setScaleEnabled(true);
    chart1.setPinchZoom(true);
    chart1.setData(ddata1);
    XAxis xa1 = chart1.getXAxis();
    xa1.setValueFormatter(new MyAxisValueFormatter(mac));

    xa1.setCenterAxisLabels(true);
    chart1.setTouchEnabled(true);
    chart1.setDragEnabled(true);
    chart1.setScaleEnabled(true);
    float groupSpace = 0.0f;//0.08
    float barSpace = 0.0f; // //0.02   x2 dataset
    chart1.fitScreen();
    ddata1.setBarWidth(barWidth);
    xa1.setLabelCount(machines.size()+1,true);
    chart1.groupBars( 0.0f,groupSpace, barSpace);
    chart1.setFitBars(true); // make the x-axis fit exactly all bars
    chart1.setVisibility(View.VISIBLE);
    xa1.setGranularity(1f);
    xa1.setAxisMinimum(0);
    xa1.setGranularityEnabled(true);
    xa1.setCenterAxisLabels(true);
    chart1.invalidate();

这是我的图表的屏幕截图,其中带有xa1.setLabelCount(machines.size(),true);

scrot of chart with label count as machines.size()

您可以看到缺少ANNE-LOSE标签。

这是我填充barEntries和计算机arraylist的方式。 xa和xa1初始化为零。

 barEntries.add(new BarEntry(xa++, Float.parseFloat(s)));
 barEntries1.add(new BarEntry(xa1++, Float.parseFloat(s)));
 machines.add(s);

现在我面临两个问题

1)标签数应为5,但仅显示4。我确信机器的大小是五。

2)如果增加标签数量,标签的位置就会混乱。由于setValueFormatter()函数使用标签的实际位置,因此我的第一个标签位于0.0上,第二个标签位于0.95上,这两个标签都被强制转换为0,而我得到了重复的标签。

因此,我想了解库如何定位这些标签。我在日志中的MyAxisValueFormatter类中打印了“值”变量的值。根据文档:

//“值”代表标签在轴(x或y)上的位置

documentation link

(更新的日志):

   07-26 11:08:23.560 19737-19737/com.example.quickstart I/flag: -0.5
07-26 11:08:23.561 19737-19737/com.example.quickstart I/flag: 0.5
    1.5
    2.5
    3.5
    4.5
07-26 11:08:23.571 19737-19737/com.example.quickstart I/flag: 0.0
07-26 11:08:23.572 19737-19737/com.example.quickstart I/flag: 0.95
    1.9
    2.85
    3.8
    4.75
07-26 11:08:23.576 19737-19737/com.example.quickstart I/flag: 0.0
    0.95
    1.9
07-26 11:08:23.577 19737-19737/com.example.quickstart I/flag: 2.85
    3.8
    4.75
07-26 11:08:23.578 19737-19737/com.example.quickstart I/flag: 0.0
    0.95
    1.9
07-26 11:08:23.579 19737-19737/com.example.quickstart I/flag: 2.85
    3.8
07-26 11:08:23.599 19737-19737/com.example.quickstart I/flag: 0.0
07-26 11:08:23.600 19737-19737/com.example.quickstart I/flag: 0.95
    1.9
    2.85
    3.8
    4.75
07-26 11:08:23.602 19737-19737/com.example.quickstart I/flag: 0.0
    0.95
    1.9
07-26 11:08:23.603 19737-19737/com.example.quickstart I/flag: 2.85
    3.8

下面是各种arrayLists的正确值。

以下是屏障的值:

0000004548,0000002784,0000004331,0000002166,0000005569

barentries1:

000000000002041,000000000002041,000000000001887,000000000000798,
000000000004947

机器:

TEMP-3,TEMP-1,BENTLER-1,DEMAN,ANNE-LOSE

将xa1.setLabelCount(machines.size(),true)更改为xa1.setLabelCount(machines.size()+ 1,true)后,我得到以下结果:

scrot of chart with label count as machines.size()

第一个值重复两次,但是现在我得到了所需数量的标签(五个标签),只是错误的标签数量。我还更新了标签的实际数量以及相应的屏障和日志值。请注意,我是从实时来源获取数据,因此数据一直在变化,这是我正在发布的新数据。

如果有人了解图表库的工作方式,请解释。预先感谢。

0 个答案:

没有答案