0

I want to create a chart as shown in the image. Till now I have tried it to achieve using MPAndroidChart.

Line Chart

However, I tried so far and unable to make it.

My codes are as below:

Layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="vertical"
    tools:ignore="HardcodedText">

    <com.github.mikephil.charting.charts.LineChart
        android:id="@+id/lineChart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

Activity File:

package com.app.androidchart;
    
import android.graphics.Color;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
    
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter;
    
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
       
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawLineChart();
    }

    private void drawLineChart() {
        LineChart lineChart = findViewById(R.id.lineChart);
        List<Entry> lineEntries = getDataSet();
        LineDataSet lineDataSet = new LineDataSet(lineEntries, "Work");
        lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
        lineDataSet.setHighlightEnabled(true);
        lineDataSet.setLineWidth(2);
        lineDataSet.setColor(Color.RED);
        lineDataSet.setCircleColor(Color.YELLOW);
        lineDataSet.setCircleRadius(6);
        lineDataSet.setCircleHoleRadius(3);
        lineDataSet.setDrawCircles(false);
        lineDataSet.setDrawHighlightIndicators(true);
        lineDataSet.setHighLightColor(Color.RED);
        lineDataSet.setValueTextSize(12);
        lineDataSet.setValueTextColor(Color.DKGRAY);
        lineDataSet.setMode(LineDataSet.Mode.STEPPED);

        LineData lineData = new LineData(lineDataSet);
        lineChart.getDescription().setTextSize(12);
        lineChart.getDescription().setEnabled(false);
        lineChart.setDrawMarkers(false);
        lineChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
        lineChart.animateY(1000);
        lineChart.getXAxis().setGranularityEnabled(true);
        lineChart.getXAxis().setGranularity(1.0f);
        lineChart.setData(lineData);

        ArrayList<String> xAxisLabel = new ArrayList<>();
        xAxisLabel.add("Rest");
        xAxisLabel.add("Work");
        xAxisLabel.add("2-up");

        XAxis xAxis = lineChart.getXAxis();
        xAxis.setAxisMaximum(3);
        xAxis.setGranularity(1f);
        xAxis.setValueFormatter(new IndexAxisValueFormatter(xAxisLabel) {
            @Override
            public String[] getValues() {
                return super.getValues();
            }
        });

        YAxis yAxis = lineChart.getAxisLeft();
        yAxis.setAxisMinimum(0);
        yAxis.setAxisMaximum(24);

        lineChart.getAxisRight().setEnabled(false);

        lineChart.invalidate();

    }

    private List<Entry> getDataSet() {
        List<Entry> lineEntries = new ArrayList<>();
        lineEntries.add(new Entry(0, 4));
        lineEntries.add(new Entry(1, 3));
        lineEntries.add(new Entry(2, 6));
        lineEntries.add(new Entry(3, 8));
        lineEntries.add(new Entry(4, 2));
        lineEntries.add(new Entry(5, 3));
        lineEntries.add(new Entry(6, 1));
        return lineEntries;
    }

}

Above is the entire code to achieve as per the shared image.

I want solutions for the below things:

  • Set X-Axis at the left side
  • Set Y-Axis at the top side
  • Assign data in which the X-axis has 3 items and Y-Axis has 24 (here I didn't find any method inside the Entry class of MPAndroid Chart.)

Please suggest me some solutions.

Thanks.

1
  • 1
    Probably the moderators are downvoting. When you ask a question, you have to provide the community with some code snippets of what you have tried so that the problem is reproducible. Commented Nov 6, 2020 at 11:51

1 Answer 1

1

in the example image XAxis should be on the top with 25 labels 0 to 24, and YAxix should be on the left with 3 labels,

The ValueFormatter should be added with YAxis, not XAxix because it needs to show string values.

So the right code will be like this

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    drawLineChart();
}


private void drawLineChart() {
    LineChart lineChart = findViewById(R.id.lineChart);
    List<Entry> lineEntries = getDataSet();
    LineDataSet lineDataSet = new LineDataSet(lineEntries, "Work");
    lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
    lineDataSet.setLineWidth(2);
    lineDataSet.setDrawValues(false);
    lineDataSet.setColor(Color.CYAN);
    lineDataSet.setCircleRadius(6);
    lineDataSet.setCircleHoleRadius(3);
    lineDataSet.setDrawCircles(false);
    lineDataSet.setDrawHighlightIndicators(true);
    lineDataSet.setHighlightEnabled(true);
    lineDataSet.setHighLightColor(Color.CYAN);
    lineDataSet.setValueTextSize(12);
    lineDataSet.setValueTextColor(Color.DKGRAY);
    lineDataSet.setMode(LineDataSet.Mode.STEPPED);

    LineData lineData = new LineData(lineDataSet);
    lineChart.getDescription().setTextSize(12);
    lineChart.getDescription().setEnabled(false);
    lineChart.animateY(1000);
    lineChart.setData(lineData);

    // Setup X Axis
    XAxis xAxis = lineChart.getXAxis();
    xAxis.setPosition(XAxis.XAxisPosition.TOP);
    xAxis.setGranularityEnabled(true);
    xAxis.setGranularity(1.0f);
    xAxis.setXOffset(1f);
    xAxis.setLabelCount(25);
    xAxis.setAxisMinimum(0);
    xAxis.setAxisMaximum(24);

    // Setup Y Axis
    YAxis yAxis = lineChart.getAxisLeft();
    yAxis.setAxisMinimum(0);
    yAxis.setAxisMaximum(3);
    yAxis.setGranularity(1f);

    ArrayList<String> yAxisLabel = new ArrayList<>();
    yAxisLabel.add(" ");
    yAxisLabel.add("Rest");
    yAxisLabel.add("Work");
    yAxisLabel.add("2-up");

    lineChart.getAxisLeft().setCenterAxisLabels(true);
    lineChart.getAxisLeft().setValueFormatter(new ValueFormatter() {
        @Override
        public String getAxisLabel(float value, AxisBase axis) {
            if(value == -1 || value >= yAxisLabel.size()) return "";
            return yAxisLabel.get((int) value);
        }
    });

    lineChart.getAxisRight().setEnabled(false);
    lineChart.invalidate();
}

And this full dummy data for testing to give you the same result as your example image

private List<Entry> getDataSet() {
    List<Entry> lineEntries = new ArrayList<>();
    lineEntries.add(new Entry(0, 1));
    lineEntries.add(new Entry(1, 1));
    lineEntries.add(new Entry(2, 1));
    lineEntries.add(new Entry(3, 1));
    lineEntries.add(new Entry(4, 1));
    lineEntries.add(new Entry(5, 1));

    lineEntries.add(new Entry(6, 2));
    lineEntries.add(new Entry(7, 2));
    lineEntries.add(new Entry(8, 2));
    lineEntries.add(new Entry(9, 2));
    lineEntries.add(new Entry(10, 2));

    lineEntries.add(new Entry(11, 1));
    lineEntries.add(new Entry(12, 1));

    lineEntries.add(new Entry(13, 2));
    lineEntries.add(new Entry(14, 2));
    lineEntries.add(new Entry(15, 2));

    lineEntries.add(new Entry(16, 1));
    lineEntries.add(new Entry(17, 1));

    lineEntries.add(new Entry(18, 2));
    lineEntries.add(new Entry(19, 2));
    lineEntries.add(new Entry(20, 2));
    lineEntries.add(new Entry(21, 2));

    lineEntries.add(new Entry(22, 1));
    lineEntries.add(new Entry(23, 1));
    lineEntries.add(new Entry(24, 1));
    return lineEntries;
}

The result on my device enter image description here

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.