【发布时间】:2023-03-14 13:16:01
【问题描述】:
我正在实现一项功能,用于显示属性的收入/支出,还提供了 1 个月、3 个月、6 个月和 12 个月的过滤器。
因此,我必须根据选择的过滤器显示月份标签,例如,如果选择了 3 个月过滤器,则需要显示 March、Feb 和 Jan 但当前标签未显示在 XAxis 上。
这是我的代码,请纠正任何问题:
private void setChart() {
ArrayList<BarEntry> incomeEntries = getIncomeEntries();
ArrayList<BarEntry> expenseEntries = getExpenseEntries();
BarDataSet set1, set2;
set1 = new BarDataSet(incomeEntries, "Income");
set1.setColor(Color.rgb(65, 168, 121));
set1.setValueTextColor(Color.rgb(55, 70, 73));
set1.setValueTextSize(10f);
set2 = new BarDataSet(expenseEntries, "Expense");
set2.setColors(Color.rgb(241, 107, 72));
set2.setValueTextColor(Color.rgb(55, 70, 73));
set2.setValueTextSize(10f);
ArrayList<IBarDataSet> dataSets = new ArrayList<>();
dataSets.add(set1);
dataSets.add(set2);
BarData data = new BarData(dataSets);
barChart.setData(data);
barChart.getDescription().setEnabled(false);
barChart.setDrawBarShadow(false);
barChart.setDrawValueAboveBar(true);
barChart.setMaxVisibleValueCount(10);
barChart.setPinchZoom(false);
barChart.setDrawGridBackground(false);
barChart.animateY(1400, Easing.EaseInOutQuad);
barChart.animateXY(3000, 3000);
Legend l = barChart.getLegend();
l.setWordWrapEnabled(true);
l.setTextSize(14);
l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
l.setDrawInside(false);
l.setForm(Legend.LegendForm.CIRCLE);
XAxis xAxis = barChart.getXAxis();
xAxis.setGranularity(1f);
xAxis.setCenterAxisLabels(true);
xAxis.setDrawGridLines(false);
xAxis.setLabelRotationAngle(-45);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setAxisMaximum(data.getXMax() + 0.25f);
ArrayList<String> formatter = getFormattter();
Log.d(TAG,"Labels Received :"+formatter.size()); // Printing 3
barChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(formatter));
barChart.getXAxis().setLabelCount(formatter.size(),true);
Log.d(TAG,"Labels Count :"+xAxis.getLabelCount()); // Printing 3
YAxis leftAxis = barChart.getAxisLeft();
leftAxis.removeAllLimitLines();
leftAxis.setTypeface(Typeface.DEFAULT);
leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
leftAxis.setTextColor(Color.BLACK);
leftAxis.setDrawGridLines(false);
leftAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true
barChart.getAxisRight().setEnabled(false);
float maxValue = 0, minValue = 0;
for (int i = 0; i < incomeEntries.size(); i++) {
if (maxValue < incomeEntries.get(i).getY()) {
maxValue = incomeEntries.get(i).getY();
}
if (maxValue < expenseEntries.get(i).getY()) {
maxValue = expenseEntries.get(i).getY();
}
}
maxValue = maxValue + 100;
Log.e(TAG, "==================== MAX VALUE = " + maxValue);
leftAxis.setAxisMaximum(maxValue);
leftAxis.setAxisMinimum(minValue);
leftAxis.setAxisMaxValue(maxValue);
leftAxis.setStartAtZero(true);
data.setValueFormatter(new LargeValueFormatter());
//data
float groupSpace = 0.25f;
float barSpace = 0.05f; // x2 dataset
float barWidth = 0.35f; // x2 dataset
barChart.getBarData().setBarWidth(barWidth);
barChart.getXAxis().setAxisMinValue(10f);
barChart.groupBars(10, groupSpace, barSpace);
barChart.invalidate();
}
private ArrayList<String> getFormattter() {
Log.e(TAG, "GET FORMATTED VALUE");
switch (chartType) {
case AppConstants.CHART_TYPE_1_MONTH:
monthFormatter();
return oneMonthLabels;
case AppConstants.CHART_TYPE_3_MONTH:
threeMonthFormatter();
return threeMonthLabels;
case AppConstants.CHART_TYPE_6_MONTH:
sixMonthFormatter();
return sixMonthLabels;
case AppConstants.CHART_TYPE_12_MONTH:
yearFormatter();
return yearLabels;
}
return null;
}
private void threeMonthFormatter() {
Log.e(TAG, "threeMonthFormatter , label list size : " + threeMonthLabels.size());
if (null != threeMonthLabels) {
threeMonthLabels.clear();
}
Calendar calendar = Calendar.getInstance();
String month = new SimpleDateFormat("MMM").format(calendar.getTime());
threeMonthLabels.add(month);
calendar.add(Calendar.MONTH, -1);
month = new SimpleDateFormat("MMM").format(calendar.getTime());
threeMonthLabels.add(month);
calendar.add(Calendar.MONTH, -1);
month = new SimpleDateFormat("MMM").format(calendar.getTime());
threeMonthLabels.add(month);
for (int i = 0; i < threeMonthLabels.size(); i++) {
Log.e(TAG, "Label : " + threeMonthLabels.get(i));
}
}
我已经附加了截至目前已实现的屏幕。正如您所看到的每三个月 Filter ,它每 3 个月显示条形图,但没有标签,甚至 monthFormatter 创建正好 3 个月的标签。
这是另一个屏幕截图,用于显示从 Formatter 方法接收到的标签。
【问题讨论】:
-
能否贴出以下代码:new IndexAxisValueFormatter(formatter)
-
嗨@Ricardo,格式化程序实际上是 ArrayList
,它具有从 getFormatter() 方法接收的标签,类似于 ArrayList formatter = getFormattter(); barChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(formatter));这是你要求的吗? -
你的 github 仓库中有这个吗?无论如何都会在一天结束时回答这个问题。
-
@sudesh ,抱歉没有上传到 github repo 。感谢您的关注并期待您的回答。
标签: android android-layout charts bar-chart mpandroidchart