17

I am using MPAndroidChart library. I want customize legends in MPAndroidChart. In MPAndroidChart library i tried to set the position of legends. by given code legend.setPosition(LegendPosition.BELOW_CHART_CENTER) but unable to do it. I have to set legends as shown in following image

help will be appreciate enter image description here

Philipp Jahoda
  • 50,880
  • 24
  • 180
  • 187
Zia
  • 2,365
  • 2
  • 17
  • 14

5 Answers5

11

In your case I would recommend that you disable the Legend that is drawn by the chart and instead come up with your own implementation.

chart.getLegend().setEnabled(false)

In the case shown above you will probably need a ListView that takes data from the charts Legend object and displays it.

When you have a look at the Legend class you will notice that it has member variables for colors and labels.

You can retrieve those arrays (getColors(), getLegendLabels()) and use them to be displayed in the ListView.

Philipp Jahoda
  • 50,880
  • 24
  • 180
  • 187
9

Please look for the given answer MPAndroidChart - Legend labels are being cut off. I have already provided the answer according to your problem. Look for given code which will definitely help you. You will have to implement customized legends with their legends colours and labels by following the steps below:

Step 1

Legend legend = mChart.getLegend();

Step 2

int colorcodes[] = legend.Colors();

Steps 3

for (int i = 0; i <  legend.Colors().length-1; i++) {
 .....
 .....
 }

Steps 4

Then you will have to take one layout horizontal or vertical and get legends color codes and legends label and according to legends length create layout and label. Code sample is given below:

        LinearLayout.LayoutParams parms_left_layout = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        parms_left_layout.weight = 1F;
        LinearLayout left_layout = new LinearLayout(context);
        left_layout.setOrientation(LinearLayout.HORIZONTAL);
        left_layout.setGravity(Gravity.CENTER);
        left_layout.setLayoutParams(parms_left_layout);

        LinearLayout.LayoutParams parms_legen_layout = new LinearLayout.LayoutParams(
                20, 20);
        parms_legen_layout.setMargins(0, 0, 20, 0);
        LinearLayout legend_layout = new LinearLayout(context);
        legend_layout.setLayoutParams(parms_legen_layout);
        legend_layout.setOrientation(LinearLayout.HORIZONTAL);
        legend_layout.setBackgroundColor(colorcodes[i]);
        left_layout.addView(legend_layout);

        TextView txt_unit = new TextView(context);
        txt_unit.setText(legend.getLabel(i));
       left_layout.addView(txt_unit);

        LinearLayout.LayoutParams parms_middle_layout = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        parms_middle_layout.weight = 1F;
        LinearLayout middle_layout = new LinearLayout(this);
        middle_layout.setOrientation(LinearLayout.HORIZONTAL);
        middle_layout.setGravity(Gravity.CENTER);
        middle_layout.setLayoutParams(parms_middle_layout);

        TextView txt_leads = new TextView(this);
        txt_leads.setText("450");
        middle_layout.addView(txt_leads);

        LinearLayout.LayoutParams parms_right_layout = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        parms_right_layout.weight = 1F;
        LinearLayout right_layout = new LinearLayout(this);
        right_layout.setOrientation(LinearLayout.HORIZONTAL);
        right_layout.setGravity(Gravity.CENTER);
        right_layout.setLayoutParams(parms_right_layout);

        TextView txt_leads_percentage = new TextView(this);
        txt_leads_percentage.setText(munit_percentage_list.get(i) + "");
        right_layout.addView(txt_leads_percentage);

        childlayout.addView(left_layout);
        childlayout.addView(middle_layout);
        childlayout.addView(right_layout);

And after this add your (child layout which you have created at runtime ) to the main layout.

Community
  • 1
  • 1
Amandeep Rohila
  • 3,558
  • 2
  • 28
  • 34
  • 1
    Also you have disable bydefault Legend chart.getLegend().setEnabled(false) – Amandeep Rohila Mar 19 '15 at 13:30
  • 1
    You can do this to with a gridview, and the adapter receive the label name and the linedataset color – rafaelasguerra Mar 20 '15 at 14:22
  • @Aman Rohila how to hide the horizontal line in Bar Chart of MPAndroidChart. I tried like this xAxis.setDrawAxisLine(false); xAxis.setDrawGridLines(false); xAxis.setGridColor(Color.parseColor("#00000000")); xAxis.setAxisLineColor(Color.parseColor("#00000000")); And yAxis.setDrawAxisLine(false); yAxis.setDrawGridLines(false); yAxis.setGridColor(Color.parseColor("#00000000")); yAxis.setAxisLineColor(Color.parseColor("#00000000")); Still I am getting horizontal line. – Karthikeyan Ve Jul 22 '15 at 09:20
  • **legend.Colors() deprecated** https://github.com/PhilJay/MPAndroidChart/issues/3934#issuecomment-386039451 – itabdullah Jan 03 '20 at 16:34
7

for setting custom Legends:

public void setLegends(){

Legend l = holder.pieChart.getLegend();

l.getEntries();

l.setPosition(Legend.LegendPosition.BELOW_CHART_CENTER);

l.setYEntrySpace(10f);

l.setWordWrapEnabled(true);

LegendEntry l1=new LegendEntry("Male",Legend.LegendForm.CIRCLE,10f,2f,null,Color.YELLOW);
LegendEntry l2=new LegendEntry("Female", Legend.LegendForm.CIRCLE,10f,2f,null,Color.RED);

l.setCustom(new LegendEntry[]{l1,l2});

l.setEnabled(true);

}
geisterfurz007
  • 5,292
  • 5
  • 33
  • 54
Rahul Singh
  • 320
  • 4
  • 7
  • While this code may solve the question, [including an explanation](//meta.stackexchange.com/q/114762) of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please [edit] your answer to add explanations and give an indication of what limitations and assumptions apply. – double-beep Apr 22 '19 at 09:09
2

Follow below code for custom legend. Create table_row_legend.xml in layout resource

    <TableRow xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:weightSum="3">
        <LinearLayout
            android:id="@+id/tv_color_container"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_weight="0.30"
            android:orientation="horizontal"
            android:gravity="right"
            android:padding="5dp">

            <LinearLayout
                android:id="@+id/tv_color"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_gravity="center"

                android:orientation="horizontal"
              />
        </LinearLayout>

        <TextView
            android:id="@+id/tv_label"
            android:layout_width="0dp"
            android:layout_gravity="top"
            android:layout_weight="1.35"

            android:gravity="left|top"
            android:padding="3dp"
            android:singleLine="true"

            android:textColor="#2b2b2b"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tv_amt"
            android:layout_width="0dp"
            android:layout_weight="1.35"
            android:gravity="left|top"
            android:padding="3dp"

            android:textColor="#2b2b2b"
            android:textSize="16sp" />
    </TableRow>

Create new LinearLayout below your Pie chart and wrap parent layout with scroll layout with static height to pie chart

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:background="#ffffff"
        android:layout_height="match_parent">

        <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="10dp"
            android:paddingBottom="10dp"
            android:layout_marginBottom="10dp"
            android:layout_centerInParent="true"
           >
      <com.github.mikephil.charting.charts.PieChart
                android:id="@+id/chart1"
                android:layout_width="match_parent"
                android:layout_height="400dp"
                android:layout_below="@+id/tv_info"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="10dp"

                android:background="#ffffff"
                android:clickable="true" />

            <TableLayout
                android:id="@+id/child_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/chart1"
                android:orientation="vertical" />
        </RelativeLayout>

    </ScrollView>

Make changes in your activity class as follows

public void setCustomLegend(){
        int colorcodes[] = l.getColors();
        Context context = DistributorGraphActivity.this;
        for (int i = 0; i < l.getColors().length - 1; i++) {
            LayoutInflater inflater = getLayoutInflater();
            TableRow tr = (TableRow)          inflater.inflate(R.layout.table_row_legend,
                    childlayout, false);
            childlayout.addView(tr);
            LinearLayout linearLayoutColorContainer=(LinearLayout) tr.getChildAt(0);
            LinearLayout linearLayoutColor= (LinearLayout)           linearLayoutColorContainer.getChildAt(0);
            TextView tvLabel = (TextView) tr.getChildAt(1);
            TextView tvAmt = (TextView) tr.getChildAt(2);
            linearLayoutColor.setBackgroundColor(colorcodes[i]);
            tvLabel.setText(l.getLabel(i));
            tvAmt.setText(arrListDealerGraph.get(i).getAmt());
        }
        mChart.getLegend().setWordWrapEnabled(true);
        mChart.getLegend().setEnabled(false);
}
Android
  • 1,420
  • 4
  • 13
  • 23
Amol Suryawanshi
  • 2,108
  • 21
  • 29
-3

For Kotlin the command is:

mChart.legend.isEnabled = false
hellow
  • 12,430
  • 7
  • 56
  • 79