MPAndroidChart 配置问题。 Xaxis,条形背景
Problems with MPAndroidChart configuration. Xaxis, bar background
亲爱的 Whosebug 社区!我非常感谢使用过 MPAndroidChart 一段时间或者只了解这个库的人的帮助。
这个 post 可能有点长,但是如果你知道一些提示或技巧,或者你已经使用过这个库 - 请阅读一下,也许你可以节省我的时间很多时间并帮助解决至少一个问题.
所以,长话短说。
我想要达到的目标
以及我现在所拥有的。
先别笑
所以我遇到了三个问题:
- 将条形图的背景设置为可绘制项目。我有三个可绘制的渐变背景,没有形状或笔触,只有普通渐变,我想将其设置为我的条形背景。
- 条之间的距离。我没有像第一张图片那样成功设置条形之间的距离。我不知道如何在一个 DataSet 中正确地使条形彼此靠近并在 DataSet 之间设置此 space。
- X 轴。我知道很多人都很难设置 x 轴标签。我正在使用 IndexAxisValueFormatter 并向它传递一个字符串列表,我想将它们设置为我的标签。
例如,我有 5 个数据集,每个数据集有 3 个柱状图。我应该如何正确配置我的条形图?
提前谢谢你,可爱的 Whosebug 社区!
2) 要在数据集之间设置space,请使用groupBars
方法。它允许设置:
- space 同一数据集中的柱之间
space 数据集之间
mChart = (BarChart) findViewById(R.id.chart);
final ArrayList<BarEntry> bar1List = new ArrayList<>();
final ArrayList<BarEntry> bar2List = new ArrayList<>();
final ArrayList<BarEntry> bar3List = new ArrayList<>();
final ArrayList<String> xLabels = new ArrayList<>();
for (int i = 0; i < 3; i++) {
bar1List.add(new BarEntry(i, (float) randInt()));
bar2List.add(new BarEntry(i, (float) randInt()));
bar3List.add(new BarEntry(i, (float) randInt()));
xLabels.add("entry " + i);
}
// set color for bars
BarDataSet bar1Set = new BarDataSet(bar1List, "Bar 1");
bar1Set1.setColor(Color.rgb(255, 0, 0));
BarDataSet bar2Set = new BarDataSet(bar2List, "Bar 2");
bar2Set.setColor(Color.rgb(0, 255, 0));
BarDataSet bar3Set = new BarDataSet(bar3List, "Bar 3");
bar3Set.setColor(Color.rgb(0, 0, 255));
// for 3 bars in a dataset, this must equals "1" :
// (barWidth + barSpace) * 3 + groupSpace = 1
// space between data sets
final float groupSpace = 0.25f;
// space between bars in same data set
final float barSpace = 0.05f;
// width of bar
final float barWidth = 0.2f;
BarData barData = new BarData(bar1Set, bar2Set, bar3Set);
barData.setBarWidth(barWidth);
// make this BarData object grouped
barData.groupBars(0, groupSpace, barSpace); // start at x = 0
mChart.setData(barData);
3) 要将字符串列表显示为 x-axis 标签,请创建 IAxisValueFormatter
并将其设置为 x-axis 的 ValueFormatter
。
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setDrawAxisLine(false);
xAxis.setCenterAxisLabels(true);
xAxis.setGranularity(1f);
xAxis.setTextSize(12);
xAxis.setAxisMinimum(0);
xAxis.setAxisMaximum(barData.getXMax() + 1);
// xLabels is populated in code above in (2)
// show user-defined string
IAxisValueFormatter xAxisFormatter = new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
if (value >= 0 && value <= xLabels.size() - 1) {
return xLabels.get((int) value);
}
// to avoid IndexOutOfBoundsException on xLabels, if (value < 0 || value > xLabels.size() - 1)
return "";
}
};
xAxis.setValueFormatter(xAxisFormatter);
您可以通过下面的示例来实现您想要做的事情:
float barWidth;
float barSpace;
float groupSpace;
// (barWidth * 2) + (barSpace * 2) + groupSpace should be equal to one
barWidth = 0.25f;
barSpace = 0.05f;
groupSpace = 0.4f;
int groupCount = 7;
ArrayList<String> xVals = new ArrayList<String>();
xVals.add("Jan");
xVals.add("Feb");
xVals.add("Mar");
xVals.add("Apr");
xVals.add("May");
xVals.add("Jun");
xVals.add("Jul");
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
ArrayList<BarEntry> yVals2 = new ArrayList<BarEntry>();
yVals1.add(new BarEntry(0, (float) 2));
yVals2.add(new BarEntry(0, (float) 3));
yVals1.add(new BarEntry(1, (float) 1));
yVals2.add(new BarEntry(1, (float) 2));
yVals1.add(new BarEntry(2, (float) 3));
yVals2.add(new BarEntry(2, (float) 4));
yVals1.add(new BarEntry(3, (float) 6));
yVals2.add(new BarEntry(3, (float) 5));
yVals1.add(new BarEntry(4, (float) 4));
yVals2.add(new BarEntry(4, (float) 3));
yVals1.add(new BarEntry(5, (float) 2));
yVals2.add(new BarEntry(5, (float) 6));
yVals1.add(new BarEntry(6, (float) 5));
yVals2.add(new BarEntry(6, (float) 7));
BarDataSet set1, set2;
set1 = new BarDataSet(yVals1, "A");
set1.setColor(getColor("defaultGreen"));
set1.setValueTextColor(getColor("primaryDark"));
set1.setValueTextSize(defaultValueTextSize);
set2 = new BarDataSet(yVals2, "B");
set2.setColor(getColor("defaultOrange"));
set2.setValueTextColor(getColor("primaryDark"));
set2.setValueTextSize(defaultValueTextSize);
BarData data = new BarData(set1, set2);
barChart.setData(data);
barChart.getDescription().setText("No. of Contracts signed in 6 months");
barChart.getDescription().setTextSize(12);
barChart.setDrawMarkers(true);
barChart.setMarker(markerView(context));
barChart.getAxisLeft().addLimitLine(lowerLimitLine(2,"Minimum",2,12,getColor("defaultOrange"),getColor("defaultOrange")));
barChart.getAxisLeft().addLimitLine(upperLimitLine(6,"Target",2,12,getColor("defaultGreen"),getColor("defaultGreen")));
barChart.getBarData().setBarWidth(barWidth);
barChart.getXAxis().setAxisMinimum( 0 );
barChart.getXAxis().setAxisMaximum(0 +
barChart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);
barChart.groupBars(0, groupSpace, barSpace);
barChart.animateY(1000);
barChart.getData().setHighlightEnabled(true);
barChart.invalidate();
//X-axis
XAxis xAxis = barChart.getXAxis();
xAxis.setGranularity(1f);
xAxis.setGranularityEnabled(true);
xAxis.setCenterAxisLabels(true);
xAxis.setDrawGridLines(false);
xAxis.setAxisMaximum(groupCount);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setValueFormatter(new IndexAxisValueFormatter(xVals));
//Y-axis
barChart.getAxisRight().setEnabled(false);
YAxis leftAxis = barChart.getAxisLeft();
leftAxis.setDrawGridLines(true);
// leftAxis.setSpaceTop(35f);
leftAxis.setAxisMinimum(0f);
barChart.getXAxis().setGranularityEnabled(true);
barChart.getXAxis().setGranularity(1.0f);
barChart.getXAxis().setLabelCount(set1.getEntryCount());
亲爱的 Whosebug 社区!我非常感谢使用过 MPAndroidChart 一段时间或者只了解这个库的人的帮助。
这个 post 可能有点长,但是如果你知道一些提示或技巧,或者你已经使用过这个库 - 请阅读一下,也许你可以节省我的时间很多时间并帮助解决至少一个问题.
所以,长话短说。 我想要达到的目标
以及我现在所拥有的。
先别笑
所以我遇到了三个问题:
- 将条形图的背景设置为可绘制项目。我有三个可绘制的渐变背景,没有形状或笔触,只有普通渐变,我想将其设置为我的条形背景。
- 条之间的距离。我没有像第一张图片那样成功设置条形之间的距离。我不知道如何在一个 DataSet 中正确地使条形彼此靠近并在 DataSet 之间设置此 space。
- X 轴。我知道很多人都很难设置 x 轴标签。我正在使用 IndexAxisValueFormatter 并向它传递一个字符串列表,我想将它们设置为我的标签。
例如,我有 5 个数据集,每个数据集有 3 个柱状图。我应该如何正确配置我的条形图?
提前谢谢你,可爱的 Whosebug 社区!
2) 要在数据集之间设置space,请使用groupBars
方法。它允许设置:
- space 同一数据集中的柱之间
space 数据集之间
mChart = (BarChart) findViewById(R.id.chart); final ArrayList<BarEntry> bar1List = new ArrayList<>(); final ArrayList<BarEntry> bar2List = new ArrayList<>(); final ArrayList<BarEntry> bar3List = new ArrayList<>(); final ArrayList<String> xLabels = new ArrayList<>(); for (int i = 0; i < 3; i++) { bar1List.add(new BarEntry(i, (float) randInt())); bar2List.add(new BarEntry(i, (float) randInt())); bar3List.add(new BarEntry(i, (float) randInt())); xLabels.add("entry " + i); } // set color for bars BarDataSet bar1Set = new BarDataSet(bar1List, "Bar 1"); bar1Set1.setColor(Color.rgb(255, 0, 0)); BarDataSet bar2Set = new BarDataSet(bar2List, "Bar 2"); bar2Set.setColor(Color.rgb(0, 255, 0)); BarDataSet bar3Set = new BarDataSet(bar3List, "Bar 3"); bar3Set.setColor(Color.rgb(0, 0, 255)); // for 3 bars in a dataset, this must equals "1" : // (barWidth + barSpace) * 3 + groupSpace = 1 // space between data sets final float groupSpace = 0.25f; // space between bars in same data set final float barSpace = 0.05f; // width of bar final float barWidth = 0.2f; BarData barData = new BarData(bar1Set, bar2Set, bar3Set); barData.setBarWidth(barWidth); // make this BarData object grouped barData.groupBars(0, groupSpace, barSpace); // start at x = 0 mChart.setData(barData);
3) 要将字符串列表显示为 x-axis 标签,请创建 IAxisValueFormatter
并将其设置为 x-axis 的 ValueFormatter
。
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setDrawAxisLine(false);
xAxis.setCenterAxisLabels(true);
xAxis.setGranularity(1f);
xAxis.setTextSize(12);
xAxis.setAxisMinimum(0);
xAxis.setAxisMaximum(barData.getXMax() + 1);
// xLabels is populated in code above in (2)
// show user-defined string
IAxisValueFormatter xAxisFormatter = new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
if (value >= 0 && value <= xLabels.size() - 1) {
return xLabels.get((int) value);
}
// to avoid IndexOutOfBoundsException on xLabels, if (value < 0 || value > xLabels.size() - 1)
return "";
}
};
xAxis.setValueFormatter(xAxisFormatter);
您可以通过下面的示例来实现您想要做的事情:
float barWidth;
float barSpace;
float groupSpace;
// (barWidth * 2) + (barSpace * 2) + groupSpace should be equal to one
barWidth = 0.25f;
barSpace = 0.05f;
groupSpace = 0.4f;
int groupCount = 7;
ArrayList<String> xVals = new ArrayList<String>();
xVals.add("Jan");
xVals.add("Feb");
xVals.add("Mar");
xVals.add("Apr");
xVals.add("May");
xVals.add("Jun");
xVals.add("Jul");
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
ArrayList<BarEntry> yVals2 = new ArrayList<BarEntry>();
yVals1.add(new BarEntry(0, (float) 2));
yVals2.add(new BarEntry(0, (float) 3));
yVals1.add(new BarEntry(1, (float) 1));
yVals2.add(new BarEntry(1, (float) 2));
yVals1.add(new BarEntry(2, (float) 3));
yVals2.add(new BarEntry(2, (float) 4));
yVals1.add(new BarEntry(3, (float) 6));
yVals2.add(new BarEntry(3, (float) 5));
yVals1.add(new BarEntry(4, (float) 4));
yVals2.add(new BarEntry(4, (float) 3));
yVals1.add(new BarEntry(5, (float) 2));
yVals2.add(new BarEntry(5, (float) 6));
yVals1.add(new BarEntry(6, (float) 5));
yVals2.add(new BarEntry(6, (float) 7));
BarDataSet set1, set2;
set1 = new BarDataSet(yVals1, "A");
set1.setColor(getColor("defaultGreen"));
set1.setValueTextColor(getColor("primaryDark"));
set1.setValueTextSize(defaultValueTextSize);
set2 = new BarDataSet(yVals2, "B");
set2.setColor(getColor("defaultOrange"));
set2.setValueTextColor(getColor("primaryDark"));
set2.setValueTextSize(defaultValueTextSize);
BarData data = new BarData(set1, set2);
barChart.setData(data);
barChart.getDescription().setText("No. of Contracts signed in 6 months");
barChart.getDescription().setTextSize(12);
barChart.setDrawMarkers(true);
barChart.setMarker(markerView(context));
barChart.getAxisLeft().addLimitLine(lowerLimitLine(2,"Minimum",2,12,getColor("defaultOrange"),getColor("defaultOrange")));
barChart.getAxisLeft().addLimitLine(upperLimitLine(6,"Target",2,12,getColor("defaultGreen"),getColor("defaultGreen")));
barChart.getBarData().setBarWidth(barWidth);
barChart.getXAxis().setAxisMinimum( 0 );
barChart.getXAxis().setAxisMaximum(0 +
barChart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);
barChart.groupBars(0, groupSpace, barSpace);
barChart.animateY(1000);
barChart.getData().setHighlightEnabled(true);
barChart.invalidate();
//X-axis
XAxis xAxis = barChart.getXAxis();
xAxis.setGranularity(1f);
xAxis.setGranularityEnabled(true);
xAxis.setCenterAxisLabels(true);
xAxis.setDrawGridLines(false);
xAxis.setAxisMaximum(groupCount);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setValueFormatter(new IndexAxisValueFormatter(xVals));
//Y-axis
barChart.getAxisRight().setEnabled(false);
YAxis leftAxis = barChart.getAxisLeft();
leftAxis.setDrawGridLines(true);
// leftAxis.setSpaceTop(35f);
leftAxis.setAxisMinimum(0f);
barChart.getXAxis().setGranularityEnabled(true);
barChart.getXAxis().setGranularity(1.0f);
barChart.getXAxis().setLabelCount(set1.getEntryCount());