Mpandroidchart: How to set string value xAxis in LineChart

Created on 22 Sep 2016  路  12Comments  路  Source: PhilJay/MPAndroidChart

image
like this
Thanks!

Most helpful comment

  xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return xVal[(int) value]; // xVal is a string array
        }

        @Override
        public int getDecimalDigits() {
            return 0;
        }
    });

All 12 comments

  xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return xVal[(int) value]; // xVal is a string array
        }

        @Override
        public int getDecimalDigits() {
            return 0;
        }
    });

@xiaolongonly work for me, Thanks~

@xiaolongonly Can you please put the code for how you set string values for X Axis in LineChart?
thanks.

Can you please put the code for how you set string values for X Axis in BarChart?

xAxis.setLabelRotationAngle(0f);

xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return strings[(int)value % strings.length];
}
});

@xcqwan can you please tell me that how did you put that word 'values' on y axis?

@afreakyelf Do something like this,

`

    Random random = new Random();
    for (int i=0; i < 10; i++) {
        float nv = random.nextFloat();
        yValues.add(new Entry(i, nv));  // Y axis values
    }

   final ArrayList<String> xAxes = new ArrayList<>();
    for (int i=0; i < 10; i++) {
        xAxes.add(i, String.valueOf(i) + "_" + i); //Dynamic x-axis labels
    }

    LineChart lineChart = (LineChart) chartView.findViewById(R.id.line_chart);
    lineChart.getXAxis().setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            int index = (int) value;
            return xAxes.get(index);
        }
    });

`

setValueFormatter (com.github.mikephil.charting.formatter.ValueFormatter)
in AxisBase聽cannot be applied to
(anonymous com.github.mikephil.charting.formatter.IAxisValueFormatter)
聽I met this question when using above code, can anybody help me please?

@IKnowWhoo
If you are using version 3.1.0, the setValueFormatter method no longer supports _IAxisValueFormatter_ arg. You sould create a class that extends _ValueFormatter_ and override it's _getFormattedValue(float value)_ method to return your desired label.

Follow the strategy proposed by @Yasir-Ghunaim, keeping in mind what I mentioned above as codes for the steps are outdated and some resource links are broken.

After you have finished following the steps, the formatter should look like this:

public class FooFormatter extends ValueFormatter {
    private long referenceTimestamp; // minimum timestamp in your data set
    private DateFormat mDataFormat;
    private Date mDate;

    public FooFormatter(long referenceTimestamp) {
        this.referenceTimestamp = referenceTimestamp;
        this.mDataFormat = new SimpleDateFormat("yyyy-MM-dd");
        this.mDate = new Date();    
    }

    @Override
    public String getFormattedValue(float value) {
        // convertedTimestamp = originalTimestamp - referenceTimestamp
        long convertedTimestamp = (long) value;

        // Retrieve original timestamp
        long originalTimestamp = referenceTimestamp + convertedTimestamp;

        // Convert timestamp to hour:minute
        return getDateString(originalTimestamp);
    }

    private String getDateString(long timestamp) {
        try {
            mDate.setTime(timestamp);
            return mDataFormat.format(mDate);
        } catch(Exception ex) {
            return "xx";
        }
    }
}

@dlmontano

I am trying to do the same with an horizontalBarChart with discrete String values.

E.g. Week 1, Month 2, 3rd Year etc.
The formatter I found does nothing with the x-Axis.

Do you have an idea?

@Daedra22
Suppose you have to show month list in x-Axis\

    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);
}

In oncreate Methd

  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);

thank u

Was this page helpful?
0 / 5 - 0 ratings