MPAndroid Linechart with single data entry

Viewed 1259

I'm using MPAndroidChart-v2.1.6 and I'm facing the following problem.

When I have a single data entry, it starts displaying the value from 0 index at X axis. This is how it looks like.enter image description here

I want it to aligned in center, when i have only single data entry, like this.. enter image description here

I have tried setMinimum() and setMaximum() property for that particular condition but nothing positive happened to me.when I have more than one entry, it works well.

Here is my code,

ArrayList<LineDataSet> lines = new ArrayList<>();
        LineDataSet linedataset1 = new LineDataSet(group1, "Text1");
        linedataset1.setDrawFilled(false);
        linedataset1.setValueFormatter(new MyDataSetFormatter());
        linedataset1.setFillAlpha(110);
        linedataset1.setLineWidth(1f);
        linedataset1.setColor(Color.rgb(67, 91, 153));
        linedataset1.setCircleColor(Color.rgb(67, 91, 153));
        LineDataSet linedataset2 = new LineDataSet(group2, "Text2");
        linedataset2.setDrawFilled(false);
        linedataset2.setValueFormatter(new MyDataSetFormatter());
        linedataset2.setFillAlpha(110);
        linedataset2.setLineWidth(1f);
        linedataset2.setColor(Color.rgb(254, 252, 59));
        linedataset2.setCircleColor(Color.rgb(254, 252, 59));
        LineDataSet linedataset3 = new LineDataSet(group3, "Text3");
        linedataset3.setDrawFilled(false);
        linedataset3.setValueFormatter(new MyDataSetFormatter());
        linedataset3.setFillAlpha(110);
        linedataset3.setLineWidth(1f);
        linedataset3.setColor(Color.rgb(68, 185, 102));
        linedataset3.setCircleColor(Color.rgb(68, 185, 102));
        LineDataSet linedataset4 = new LineDataSet(group4, "text4");
        linedataset4.setDrawFilled(false);
        linedataset4.setValueFormatter(new MyDataSetFormatter());
        linedataset4.setFillAlpha(110);
        linedataset4.setLineWidth(1f);
        linedataset4.setColor(Color.rgb(145, 92, 96));
        linedataset4.setCircleColor(Color.rgb(145, 92, 96));
        lines.add(linedataset1);
        lines.add(linedataset2);
        lines.add(linedataset3);
        lines.add(linedataset4);
        leftYAxis = lineChart.getAxisLeft();
        rightYAxis = lineChart.getAxisRight();
        rightYAxis.setDrawLabels(false);
        rightYAxis.setAxisMaxValue(105);
        leftYAxis.setAxisMaxValue(105);

        lineChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
        lineChart.getXAxis().setLabelRotationAngle(-70);

        lineChart.getXAxis().setDrawGridLines(false);
        lineChart.getAxisLeft().setDrawGridLines(false);
        lineChart.getAxisRight().setDrawGridLines(false);
        lineChart.getAxisRight().setEnabled(false);
        lineChart.setBackgroundColor(Color.WHITE);
        lineChart.setDrawGridBackground(false);

        lineChart.setData(new LineData(newLabels, lines));
        lineChart.setPinchZoom(false);
        lineChart.animateY(1000);
        lineChart.setDescription(null);

        XAxis xAxis = lineChart.getXAxis();
        xAxis.setAvoidFirstLastClipping(true);

        //lineChart.setBackgroundColor(Color.rgb(255, 255, 255));
        lineChart.setTouchEnabled(false);
        lineChart.invalidate();

Thanks in advance,

2 Answers

Declare line chart entries separately outside the class

  private ArrayList<Entry> dataValuesDaily(){
    ArrayList<Entry> dataVals = new ArrayList<>();
    dataVals.add(new Entry(1,10));
    dataVals.add(new Entry(11,2));
    dataVals.add(new Entry(21,16));
    dataVals.add(new Entry(30,4));
    return dataVals;
   }

And then in the class

 //TODO:: LINE GRAPH
    LineDataSet lineDataSet1 = new LineDataSet(dataValuesDaily(), "Data Set 1");
    lineDataSet1.setMode(LineDataSet.Mode.CUBIC_BEZIER);
    ArrayList<ILineDataSet> dataSets = new ArrayList<>();
    dataSets.add(lineDataSet1);

    //customization
    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);
    XAxis topXAxis = mLineGraph.getXAxis();
    topXAxis.setEnabled(false);
    XAxis xAxis = mLineGraph.getXAxis();
    xAxis.setEnabled(true);
    xAxis.setDrawGridLines(false);
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

    lineDataSet1.setLineWidth(4f);
    lineDataSet1.setCircleRadius(3f);
    lineDataSet1.setDrawValues(false);
    lineDataSet1.setCircleHoleColor(getResources().getColor(R.color.pie_color_4));
    lineDataSet1.setCircleColor(getResources().getColor(R.color.pie_color_4));


    LineData data = new LineData(dataSets);
    mLineGraph.setData(data);
    mLineGraph.animateX(2000);
    mLineGraph.invalidate();
    mLineGraph.getLegend().setEnabled(false);
    mLineGraph.getDescription().setEnabled(false);

To set the X axis limits to specific values you can call setAxisMinimum and setAxisMaximum. For example:

XAxis xAxis = lineChart.getXAxis();
xAxis.setAxisMinimum(10);
xAxis.setAxisMaximum(30);

If you want to do this automatically using your LineDataSet you can query the min and max values of the X data

float xMin = dataSet.getXMin() - 5;
float xMax = dataSet.getXMax() + 5;
xAxis.setAxisMinimum(xMin);
xAxis.setAxisMaximum(xMax);

which will center the data even when there is only one point.

Related