我正在尝试使用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)上的位置
(更新的日志):
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()
第一个值重复两次,但是现在我得到了所需数量的标签(五个标签),只是错误的标签数量。我还更新了标签的实际数量以及相应的屏障和日志值。请注意,我是从实时来源获取数据,因此数据一直在变化,这是我正在发布的新数据。
如果有人了解图表库的工作方式,请解释。预先感谢。