MPAndroidChart のBarChart
を使用して2つのデータセットを比較するにはどうすればよいですか。
コードを編集し、githubのサンプルプロジェクトから取得します。どうすれば100f and 110f
1つのXaxis
ラベルの値Whole Number
Score score1 = new Score(100f, 0, "Whole Number");
mRealm.copyToRealm(score1);
Score score2 = new Score(110f, 0, "Whole Number");
mRealm.copyToRealm(score2);
はい、それは非常に簡単に行うことができます。
必要なのは、複数のBarChart
を持つBarDataSets
で、各セット(この場合)は1つの性別(男性または女性)を表します。
サンプルコード(realm.ioなし)
List<String> xValues = ...; // "Denmark", "Finland", ...
XAxis xAxis = chart.getXAxis();
xAxis.setValueFormatter(new MyValueFormatter(xValues));
// create 2 datasets
BarDataSet set1 = new BarDataSet(valuesMen, "Men");
set1.setColor(Color.BLUE);
BarDataSet set2 = new BarDataSet(valuesWomen, "Women");
set2.setColor(Color.RED);
BarData data = new BarData(set1, set2);
chart.setData(data);
chart.groupBars(...); // available since release v3.0.0
chart.invalidate(); // refresh
さらに支援が必要な場合は、ウィキで利用可能なグループ化されたBarChart
の- 詳細なチュートリアル を参照してください。
互いにBarChart
の値を「スタック」したい場合は、スタックバーチャートを作成する必要があります。 Android Stacked Bars Chart
BarDataコンストラクターが更新されているため、次のコードを使用する必要があります。
BarChart barChart = (BarChart) view.findViewById(R.id.chart);
barChart.setDrawBarShadow(false);
barChart.setDrawValueAboveBar(true);
barChart.setDescription("");
barChart.setMaxVisibleValueCount(50);
barChart.setPinchZoom(false);
barChart.setDrawGridBackground(false);
XAxis xl = barChart.getXAxis();
xl.setGranularity(1f);
xl.setCenterAxisLabels(true);
xl.setValueFormatter(new AxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return String.valueOf((int) value);
}
@Override
public int getDecimalDigits() {
return 0;
}
});
YAxis leftAxis = barChart.getAxisLeft();
leftAxis.setValueFormatter(new AxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return String.valueOf((int) value);
}
@Override
public int getDecimalDigits() {
return 0;
}
});
leftAxis.setDrawGridLines(false);
leftAxis.setSpaceTop(30f);
leftAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true
barChart.getAxisRight().setEnabled(false);
//data
float groupSpace = 0.04f;
float barSpace = 0.02f; // x2 dataset
float barWidth = 0.46f; // x2 dataset
// (0.46 + 0.02) * 2 + 0.04 = 1.00 -> interval per "group"
int startYear = 1980;
int endYear = 1985;
List<BarEntry> yVals1 = new ArrayList<BarEntry>();
List<BarEntry> yVals2 = new ArrayList<BarEntry>();
for (int i = startYear; i < endYear; i++) {
yVals1.add(new BarEntry(i, 0.4f));
}
for (int i = startYear; i < endYear; i++) {
yVals2.add(new BarEntry(i, 0.7f));
}
BarDataSet set1, set2;
if (barChart.getData() != null && barChart.getData().getDataSetCount() > 0) {
set1 = (BarDataSet)barChart.getData().getDataSetByIndex(0);
set2 = (BarDataSet)barChart.getData().getDataSetByIndex(1);
set1.setValues(yVals1);
set2.setValues(yVals2);
barChart.getData().notifyDataChanged();
barChart.notifyDataSetChanged();
} else {
// create 2 datasets with different types
set1 = new BarDataSet(yVals1, "Company A");
set1.setColor(Color.rgb(104, 241, 175));
set2 = new BarDataSet(yVals2, "Company B");
set2.setColor(Color.rgb(164, 228, 251));
ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
dataSets.add(set1);
dataSets.add(set2);
BarData data = new BarData(dataSets);
barChart.setData(data);
}
barChart.getBarData().setBarWidth(barWidth);
barChart.getXAxis().setAxisMinValue(startYear);
barChart.groupBars(startYear, groupSpace, barSpace);
barChart.invalidate();
私が試した答えのほとんどは、ラベルの位置がずれていたり、中心がずれていたり、画面スペースからバーが隠れたりするなどの問題があります。それで、少しの試行の後、私は適切な作業場所を持っています。
最後の4行が最も重要です。
ArrayList<BarEntry> barEntries = new ArrayList<>();
ArrayList<BarEntry> barEntries1 = new ArrayList<>();
ArrayList<BarEntry> barEntries2 = new ArrayList<>();
ArrayList<BarEntry> barEntries3 = new ArrayList<>();
barEntries.add(new BarEntry(1,989.21f));
barEntries.add(new BarEntry(2,420.22f));
barEntries.add(new BarEntry(3,758));
barEntries.add(new BarEntry(4,3078.97f));
barEntries.add(new BarEntry(5,14586.96f));
barEntries.add(new BarEntry(6,400.4f));
barEntries.add(new BarEntry(7,5888.58f));
barEntries1.add(new BarEntry(1,950));
barEntries1.add(new BarEntry(2,791));
barEntries1.add(new BarEntry(3,630));
barEntries1.add(new BarEntry(4,782));
barEntries1.add(new BarEntry(5,2714.54f));
barEntries1.add(new BarEntry(6,500));
barEntries1.add(new BarEntry(7,2173.36f));
barEntries2.add(new BarEntry(1,900));
barEntries2.add(new BarEntry(2,691));
barEntries2.add(new BarEntry(3,1030));
barEntries2.add(new BarEntry(4,382));
barEntries2.add(new BarEntry(5,2714f));
barEntries2.add(new BarEntry(6,5000));
barEntries2.add(new BarEntry(7,1173f));
barEntries3.add(new BarEntry(1,200));
barEntries3.add(new BarEntry(2,991));
barEntries3.add(new BarEntry(3,1830));
barEntries3.add(new BarEntry(4,3082));
barEntries3.add(new BarEntry(5,214));
barEntries3.add(new BarEntry(6,5600));
barEntries3.add(new BarEntry(7,9173));
BarDataSet barDataSet = new BarDataSet(barEntries,"DATA SET 1");
barDataSet.setColor(Color.parseColor("#F44336"));
BarDataSet barDataSet1 = new BarDataSet(barEntries1,"DATA SET 2");
barDataSet1.setColors(Color.parseColor("#9C27B0"));
BarDataSet barDataSet2 = new BarDataSet(barEntries2,"DATA SET 3");
barDataSet1.setColors(Color.parseColor("#e241f4"));
BarDataSet barDataSet3 = new BarDataSet(barEntries3,"DATA SET 4");
barDataSet1.setColors(Color.parseColor("#42f46e"));
String[] months = new String[] {"TYPE 1", "TYPE 2", "TYPE 3", "TYPE 4"};
BarData data = new BarData(barDataSet,barDataSet1,barDataSet2,barDataSet3);
barChart.setData(data);
XAxis xAxis = barChart.getXAxis();
xAxis.setValueFormatter(new IndexAxisValueFormatter(months));
barChart.getAxisLeft().setAxisMinimum(0);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setGranularity(1);
xAxis.setCenterAxisLabels(true);
xAxis.setGranularityEnabled(true);
float barSpace = 0.02f;
float groupSpace = 0.3f;
int groupCount = 4;
//IMPORTANT *****
data.setBarWidth(0.15f);
barChart.getXAxis().setAxisMinimum(0);
barChart.getXAxis().setAxisMaximum(0 + barChart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);
barChart.groupBars(0, groupSpace, barSpace); // perform the "explicit" grouping
//***** IMPORTANT
私が得た最終結果は次のとおりです。
Step1棒グラフの最初のグループ数を割ります。 5つのグループを表示する以下のサンプルコードのように。すべてのグループには5つのバーがあります。
xaxis0 = new ArrayList<>();
for (int i = 0; i < cData.size(); i++) {
String str = cData.get(i).get("count");
str = str.replaceAll("\\[", "").replaceAll("\\]", "");
String[] finalString = str.split(",");
if (i == 0) {
for (int k = 0; k < finalString.length; k++) {
int data22 = Integer.parseInt(finalString[k]);
BarEntry v1e1 = new BarEntry(data22, position);
valueSet1.add(v1e1);
}
}
if (i == 1) {
for (int k = 0; k < finalString.length; k++) {
int data22 = Integer.parseInt(finalString[k] + "");
BarEntry v1e1 = new BarEntry(data22, position);
valueSet2.add(v1e1);
}
}
if (i == 2) {
for (int k = 0; k < finalString.length; k++) {
int data22 = Integer.parseInt(finalString[k] + "");
BarEntry v1e1 = new BarEntry(data22, position);
valueSet3.add(v1e1);
}
}
if (i == 3) {
for (int k = 0; k < finalString.length; k++) {
int data22 = Integer.parseInt(finalString[k] + "");
BarEntry v1e1 = new BarEntry(data22, position);
valueSet4.add(v1e1);
}
}
if (i == 4) {
for (int k = 0; k < finalString.length; k++) {
int data22 = Integer.parseInt(finalString[k] + "");
BarEntry v1e1 = new BarEntry(data22, position);
valueSet5.add(v1e1);
}
}
xaxis0.add(i, xdata.get(i).get("date"));
ステップ2上記のコードでは、5つのグループのバーエントリがすべての値セットのループでデータをロードしています。この値セットの前に初期化し、
ステップ3そして、その5セットを以下のようにBardatasetにロードします
`BarDataSet barDataSet1 = new BarDataSet(valueSet1、" Set1 "); barDataSet1.setColors(whitecolors); barDataSet1.setValueTextColor(Color.WHITE);
BarDataSet barDataSet2 = new BarDataSet(valueSet2、 "Set2"); barDataSet2.setColors(whitecolors); barDataSet2.setValueTextColor(Color.WHITE);
BarDataSet barDataSet3 = new BarDataSet(valueSet3、 "Set3"); barDataSet3.setColors(whitecolors);
barDataSet3.setValueTextColor(Color.WHITE); BarDataSet barDataSet4 = new BarDataSet(valueSet4、 "Set4");
barDataSet4.setColors(whitecolors); barDataSet4.setValueTextColor(Color.WHITE);
BarDataSet barDataSet5 = new BarDataSet(valueSet5、 "Set5"); barDataSet5.setColors(whitecolors);
barDataSet5.setValueTextColor(Color.WHITE); dataSets = new ArrayList <>(); dataSets.add(barDataSet1); dataSets.add(barDataSet2); dataSets.add(barDataSet3); dataSets.add(barDataSet4); dataSets.add(barDataSet5); `
次のコードのように、最後のステップでこのデータをBardataに添付する必要があります
BarData data11 = new BarData(xaxis0、dataSets); data11.setGroupSpace(100f);
holder.chart.setData(data11);
XAxis xAxis = holder.chart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(true);
xAxis.setGridColor(context.getResources()。getColor(R.color.white));
xAxis.isDrawLabelsEnabled();
xAxis.setAxisLineColor(context.getResources()。getColor(R.color.accentColor)); xAxis.setTextColor(context.getResources()。getColor(R.color.white));
xAxis.isAdjustXLabelsEnabled();
xAxis.setAdjustXLabels(true);
holder.chart.setDescription("");
holder.chart.animateXY(2000, 2000);
holder.chart.getAxisLeft().setTextColor(context.getResources().getColor(R.color.white));
holder.chart.getAxisRight().setTextColor(context.getResources().getColor(R.color.white));
holder.chart.setDrawGridBackground(false);
holder.chart.getAxisRight().setEnabled(false);
holder.chart.setDrawValueAboveBar(true);
holder.chart.getAxisLeft().setEnabled(false);
holder.chart.setSoundEffectsEnabled(true);
holder.chart.getXAxis().setDrawGridLines(false);
holder.chart.setTransitionGroup(true);
YAxis yAxis = holder.chart.getAxisLeft();
yAxis.setDrawGridLines(false);
yAxis.setLabelCount(5);
yAxis = holder.chart.getAxisRight();
yAxis.setDrawGridLines(false);
yAxis.setTextColor(context.getResources().getColor(R.color.white));
Legend l = holder.chart.getLegend();
l.setEnabled(false);
Paint p = holder.chart.getPaint(Chart.Paint_INFO);
p.setTextSize(10);
p.setColor(context.getResources().getColor(R.color.white));
p.setTypeface(gotham);
holder.chart.invalidate();
l.setPosition(Legend.LegendPosition.BELOW_CHART_CENTER);
l.setTextSize(200);
yAxis.setValueFormatter(new LargeValueFormatter());
# Thats it if you have doubt about this code ask me any time .......