skip to Main Content

I am creating a simple script which reads over a CSV file column, creates a new column with categories and then produces a piechart. Currently the piechart has percents attached to each wedge.

How do I move the percents to the legend?

Is there a way to move the autopct='%1.1f%%' parameter to the legend?

Here is an image showing the current pi chart output:

Pichart output

My python code along with the sample data are below.

import pandas as pd
import matplotlib.pyplot as plt
import os

# Setup file paths
file_name = "Software.csv"
dirname = os.getcwd()
file_path = os.getcwd() + "\" + file_name
df = pd.read_csv(file_path)

# Name output file
split_path = file_path[:-4]
output_file = split_path + "_output.csv"

def check_lines(x):
    if 'Microsoft' in x:
        return 'Microsoft'
    elif 'Google' in x:
        return 'Google'
    elif 'Adobe' in x:
        return 'Adobe'
    elif 'Mozilla' in x:
        return 'Mozilla'
    elif 'Apple' in x:
        return 'Apple'
    elif 'Amazon' in x:
        return 'Amazon'
    else:
        return 'Other'

# Create a new column series; Apply the function to it.
df['Category'] = df['Title'].apply(check_lines)

# Create output file
df.to_csv(output_file)

# -- Pi Chart Version 2 -- 
df2 = pd.read_csv(output_file)
df2val = df2.value_counts('Category')

# Create PI Chart
plot = df2val.plot.pie(y='Category', autopct='%1.1f%%', labeldistance=None, startangle=0)
plt.ylabel('')
plt.legend(title="Categories", bbox_to_anchor=(1.05,0.5), loc="center right", fontsize=10, bbox_transform=plt.gcf().transFigure)

# Save Pi Chart
plt.savefig(split_path + "_chart.png", bbox_inches="tight")
plt.show()

Sample Data:

Title
Amazon Chime
Mozilla Firefox
Adobe Photoshop
Adobe Photoshop
Adobe Photoshop
Adobe Photoshop
Adobe Reader
Adobe Reader
Adobe Reader
Adobe Reader
Adobe Reader
Adobe Reader
Adobe Reader
Apple Safari
Apple Safari
Apple Safari
Google Drive
Microsoft Word
Microsoft OneDrive
Wireshark
Notepad
Notepad
Notepad
7zip
7zip
7zip
7zip
7zip
Adobe InDesign
Adobe InDesign
Adobe InDesign
Adobe InDesign
Adobe InDesign
Adobe InDesign
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe InDesign
Adobe InDesign
Adobe InDesign
Adobe InDesign
Adobe InDesign
Adobe InDesign
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge
Adobe Bridge

2

Answers


  1. You can compute the percentages as follows and add them to the legend:

    plot = df2val.plot.pie(y='Category',  startangle=0)
    plt.ylabel('')
    percents = df2val.to_numpy() * 100 / df2val.to_numpy().sum()
    plt.legend( bbox_to_anchor=(1.35,1.1), loc='upper right',
                labels=['%s, %1.1f %%' % (l, s) for l, s in zip(df2val.index,percents)])
    

    enter image description here

    Login or Signup to reply.
  2. You can store the index and values of your df2 in string format and use it as your plt.legend() labels argument (e.g. assign the labels in a variable named legend and use it later).

    df2.plot.pie(labeldistance=None)
    plt.ylabel('')
    
    legend = ['{} ({:.2%})'.format(idx, value) for idx, value in zip(df2.index, df2.values)]
    plt.legend(legend, title="Categories", bbox_to_anchor=(1.05,0.5), loc="center right", fontsize=10, bbox_transform=plt.gcf().transFigure)
    
    plt.show()
    

    enter image description here

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search