折れ線グラフグラフを作成したいのですが、xAxisで値の文字列を表示するのに問題があります。ライブラリGithubを MPAndroidChart からLineChartに使用しました。文字列値を追加する方法と実際に私が聞きたい多くの質問に私を助けてください
private void drawLineChartLine(){
private float[] yDataL = {40, 60, 70, 80};
private String[] xDataL = {"Week 1", "Week 1" , "Week 3" , "Week 4"};
ArrayList<Entry> yEntrys = new ArrayList<>();
final ArrayList<String> xEntrys = new ArrayList<>();
for(int i = 0; i < yDataL.length; i++){
yEntrys.add(new Entry(yDataL[i] ,i));
}
for(int i = 1; i < xDataL.length; i++){
xEntrys.add(xDataL[i]);
}
//create the data set
LineDataSet lineDataset = new LineDataSet(yEntrys, "assa");
XAxis xAxis = lineChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return xEntrys.get((int) value);
}
});
LineData lineData = new LineData(lineDataset);
lineChart.setData(lineData);
lineChart.invalidate();
}
エラーが発生しました
無効なインデックス40、サイズは6です
コードで
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return xEntrys.get((int) value);
}
});
public class IndexAxisValueFormatter extends ValueFormatter
{
private String[] mValues = new String[] {};
private int mValueCount = 0;
/**
* An empty constructor.
* Use `setValues` to set the axis labels.
*/
public IndexAxisValueFormatter() {
}
/**
* Constructor that specifies axis labels.
*
* @param values The values string array
*/
public IndexAxisValueFormatter(String[] values) {
if (values != null)
setValues(values);
}
/**
* Constructor that specifies axis labels.
*
* @param values The values string array
*/
public IndexAxisValueFormatter(Collection<String> values) {
if (values != null)
setValues(values.toArray(new String[values.size()]));
}
@Override
public String getFormattedValue(float value, AxisBase axisBase) {
int index = Math.round(value);
if (index < 0 || index >= mValueCount || index != (int)value)
return "";
return mValues[index];
}
public String[] getValues()
{
return mValues;
}
public void setValues(String[] values)
{
if (values == null)
values = new String[] {};
this.mValues = values;
this.mValueCount = values.length;
}
}
棒グラフを表示しようとしているメソッドに以下のコードを追加します。
final String[] weekdays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // Your List / array with String Values For X-axis Labels
// Set the value formatter
XAxis xAxis = chart.getXAxis();
xAxis.setValueFormatter(new IndexAxisValueFormatter(weekdays));
解決しました!ハッピーコーディング。
ここでは、動的な文字列ラベル(XAxis)を簡単に作成できます。
XAxis xAxis = lineChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setValueFormatter(new IndexAxisValueFormatter(getAreaCount));
public ArrayList<String> getAreaCount() {
ArrayList<String> label = new ArrayList<>();
for (int i = 0; i < areaList.size(); i++)
label.add(areaList.get(i).getTopicName());
return label;
}
新しいアップデートv3.1.0によると、IAxisValueFormatterメソッドは減価償却されます。
したがって、com.github.mikephil.charting.formatter.IndexAxisValueFormatterを使用すると、x軸に月のリストを表示できます。
private List<Entry> getIncomeEntries() {
ArrayList<Entry> incomeEntries = new ArrayList<>();
incomeEntries.add(new Entry(1, 11300));
incomeEntries.add(new Entry(2, 1390));
incomeEntries.add(new Entry(3, 1190));
incomeEntries.add(new Entry(4, 7200));
incomeEntries.add(new Entry(5, 4790));
incomeEntries.add(new Entry(6, 4500));
incomeEntries.add(new Entry(7, 8000));
incomeEntries.add(new Entry(8, 7034));
incomeEntries.add(new Entry(9, 4307));
incomeEntries.add(new Entry(10, 8762));
incomeEntries.add(new Entry(11, 4355));
incomeEntries.add(new Entry(12, 6000));
return incomeEntries.subList(0, 12);
}
Oncreateメソッド内
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
List<String> xAxisValues = new ArrayList<>(Arrays.asList("Jan", "Feb", "March", "April", "May", "June","July", "August", "September", "October", "November", "Decemeber"));
List<Entry> incomeEntries = getIncomeEntries();
dataSets = new ArrayList<>();
LineDataSet set1;
set1 = new LineDataSet(incomeEntries, "Income");
set1.setColor(Color.rgb(65, 168, 121));
set1.setValueTextColor(Color.rgb(55, 70, 73));
set1.setValueTextSize(10f);
set1.setMode(LineDataSet.Mode.CUBIC_BEZIER);
dataSets.add(set1);
//customization
LineChart mLineGraph = findByViewId(R.id.line_chart);
mLineGraph.setTouchEnabled(true);
mLineGraph.setDragEnabled(true);
mLineGraph.setScaleEnabled(false);
mLineGraph.setPinchZoom(false);
mLineGraph.setDrawGridBackground(false);
mLineGraph.setExtraLeftOffset(15);
mLineGraph.setExtraRightOffset(15);
//to hide background lines
mLineGraph.getXAxis().setDrawGridLines(false);
mLineGraph.getAxisLeft().setDrawGridLines(false);
mLineGraph.getAxisRight().setDrawGridLines(false);
//to hide right Y and top X border
YAxis rightYAxis = mLineGraph.getAxisRight();
rightYAxis.setEnabled(false);
YAxis leftYAxis = mLineGraph.getAxisLeft();
leftYAxis.setEnabled(false);
XAxis topXAxis = mLineGraph.getXAxis();
topXAxis.setEnabled(false);
XAxis xAxis = mLineGraph.getXAxis();
xAxis.setGranularity(1f);
xAxis.setCenterAxisLabels(true);
xAxis.setEnabled(true);
xAxis.setDrawGridLines(false);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
set1.setLineWidth(4f);
set1.setCircleRadius(3f);
set1.setDrawValues(false);
set1.setCircleHoleColor(getResources().getColor(R.color.pie_color_4));
set1.setCircleColor(getResources().getColor(R.color.pie_color_4));
//String setter in x-Axis
mLineGraph.getXAxis().setValueFormatter(new com.github.mikephil.charting.formatter.IndexAxisValueFormatter(xAxisValues));
LineData data = new LineData(dataSets);
mLineGraph.setData(data);
mLineGraph.animateX(2000);
mLineGraph.invalidate();
mLineGraph.getLegend().setEnabled(false);
mLineGraph.getDescription().setEnabled(false);
値をインデックスとして使用しようとしているため、範囲外のArrayList
インデックスにアクセスしています。あなたはそれを返すために値のインデックスを見つける必要があります。
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
for (int i = 0 ; i < yEntrys.size(); ++i) {
if (yEntrys.get(i).equals(value)) {
return xEntrys.get(i);
}
}
return null;
}
});
簡単な実装
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(true);
xAxis.setGranularity(1f);
xAxis.setGranularityEnabled(true);
final String xVal[]={"Val1","Val2","Val3"};
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return xVal[(int) value-1]; // xVal is a string array
}
});
chart.xAxis.valueFormatter = IndexAxisValueFormatter(list_of_labels)
上記の方法は非推奨のようです。
xAxis.setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
// return the string va
return your_string_basedon_value_as_index;
}
});