Search code examples
javaandroidpie-chartmpandroidchart

is it possible to draw a two layer Pie Chart?


Hi i am trying to implement a chart like the following. Please see the image and help me find a suitable solution for this. Here i am using MPAndroidChart Library.

enter image description here

Right now my pie chart is look like below image.

enter image description here

I am using below xml

<com.github.mikephil.charting.charts.PieChart
    android:id="@+id/chart1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

And in java, i have manage angle like that.

mChart.setMaxAngle(270f); // HALF CHART
mChart.setRotationAngle(135f);

I still have not been able to create the inner line of the pie chart. I want the graph that I already mention on top. How can I draw that line?


Solution

  • First you need to add MPAndroidChart library in you project. Here is the basic code I have written, you need to make changes according to your use.

    MainActivity.java

    package com.devdwl.stackdemo;
    
    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    import com.github.mikephil.charting.charts.PieChart;
    import com.github.mikephil.charting.data.PieData;
    import com.github.mikephil.charting.data.PieDataSet;
    import com.github.mikephil.charting.data.PieEntry;
    import com.github.mikephil.charting.formatter.PercentFormatter;
    import com.github.mikephil.charting.utils.ColorTemplate;
    import com.github.mikephil.charting.utils.MPPointF;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        PieChart mChartOuter, mChartInner;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            mChartOuter = (PieChart) findViewById(R.id.mChartOuter);
            mChartInner = (PieChart) findViewById(R.id.mChartInner);
    
            mChartOuter.getDescription().setEnabled(false);
            mChartInner.getDescription().setEnabled(false);
    
    
            mChartOuter.setCenterTextSize(10f);
            mChartInner.setCenterTextSize(10f);
    
            mChartOuter.setHoleRadius(75f);
            mChartInner.setHoleRadius(75f);
    
            mChartOuter.setTransparentCircleRadius(50f);
            mChartInner.setTransparentCircleRadius(50f);
    
            mChartOuter.getLegend().setEnabled(false);
            mChartInner.getLegend().setEnabled(false);
    
            setData();
    
        }
    
        private void setData() {
    
            ArrayList<PieEntry> entries = new ArrayList<PieEntry>();
    
            for (int i = 0; i < 5; i++) {
                entries.add(new PieEntry((float) ((Math.random() * (float) 5) + (float) 5 / 5), i));
            }
    
            PieDataSet dataSet = new PieDataSet(entries, "Election Results");
    
            dataSet.setDrawIcons(false);
    
            dataSet.setSliceSpace(3f);
            dataSet.setIconsOffset(new MPPointF(0, 40));
            dataSet.setSelectionShift(5f);
    
            ArrayList<Integer> colors = new ArrayList<Integer>();
    
            for (int c : ColorTemplate.VORDIPLOM_COLORS)
                colors.add(c);
    
            for (int c : ColorTemplate.JOYFUL_COLORS)
                colors.add(c);
    
            for (int c : ColorTemplate.COLORFUL_COLORS)
                colors.add(c);
    
            for (int c : ColorTemplate.LIBERTY_COLORS)
                colors.add(c);
    
            for (int c : ColorTemplate.PASTEL_COLORS)
                colors.add(c);
    
            colors.add(ColorTemplate.getHoloBlue());
    
            dataSet.setColors(colors);
    
            PieData data = new PieData(dataSet);
            data.setValueFormatter(new PercentFormatter());
            data.setValueTextSize(11f);
            data.setValueTextColor(Color.WHITE);
            mChartOuter.setData(data);
            mChartInner.setData(data);
    
            mChartOuter.highlightValues(null);
            mChartInner.highlightValues(null);
    
            mChartOuter.invalidate();
            mChartInner.invalidate();
        }
    
    }
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/constraint_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    
        <com.github.mikephil.charting.charts.PieChart
            android:id="@+id/mChartOuter"
            android:layout_width="600dp"
            android:layout_height="600dp"
            android:layout_centerInParent="true" />
    
    
        <com.github.mikephil.charting.charts.PieChart
            android:id="@+id/mChartInner"
            android:layout_width="300dp"
            android:layout_height="300dp"
            android:layout_centerInParent="true" />
    
    </RelativeLayout>
    

    Result

    Good Luck.