Alaa Ali
Alaa Ali

Reputation: 926

Improve labeling on pie chart in subplot

I'm plotting a figure with three subplots:

fig = plt.figure(fignum)
ax11 = plt.subplot2grid((2,2), (0,0))
ax12 = plt.subplot2grid((2,2), (0,1))
ax13 = plt.subplot2grid((2,2), (1,0), colspan=2)
ax13.axis('off')

I'm using Pandas for my data and I want to plot a bar chart, a pie chart, and a table. I'm doing this:

d = pd.Series(data,index)

#plotting the first subplot
d.plot(kind='bar',ax=ax11)

#plotting the second one and adjusting size of labels and percentages
(wedges, texts, autotexts) = ax12.pie(d,labels=d.index,autopct='%1.1f%%')
ax12.axis('equal')
for t in texts:
        t.set_size(7)
for t in autotexts:
        t.set_size(7)

#plotting the third axes, the table
ax13.table(cellText=table,colLabels=columns,loc='bottom')

This is how it turns out:

enter image description here

How can I make the pie chart look better by not having the labels overlap? I've tried adding a legend but it covers up the chart and I don't even know if it's ending up in the location I'm specifying:

ax12.legend(index,loc='lower right',fontsize=7)

enter image description here

Is there a way to move the legend down into that empty space under the pie chart? I'll remove the labels from the pie chart itself once the legend looks good.

Upvotes: 5

Views: 3903

Answers (1)

snake_charmer
snake_charmer

Reputation: 3013

bbox_to_anchor lets you position the legend on the figure's canvas.

see: http://matplotlib.org/users/legend_guide.html

import matplotlib.pyplot as plt
import pandas 

fig = plt.figure()
ax11 = plt.subplot2grid((2,2), (0,0))
ax11.bar([1,2,3,4,3,2,1],[1,2,3,4,3,2,1])
ax11.set_xticklabels(["local user","whetever works","L'ours tourne","en rond","dans sa cage",2,1], rotation="vertical")

ax12 = plt.subplot2grid((2,2), (0,1))
ax12.pie( [10,20,30,5,5,6,4,10,10], labels = ["bewarfefvl","easdfgvagfvd","asasdfve.sd","rgdegaf","adfewga","qargw","qaerghrttw","errrrd","ejjjjd"],autopct='%1.1f%%')
ax12.axis('equal')
ax12.legend(loc='lower right',fontsize=7, bbox_to_anchor = (0.75, -01.0) )


ax13 = plt.subplot2grid((2,2), (1,0), colspan=2)
ax13.axis('off')

plt.show()

Although you could skip the legend and improve the readability of your pie-chart by adjusting it. I can think of three ways of doing it but it is by no mean an exhaustive list:

  1. When passing a list as argument, you can influence the relative position of each slice in the chart, in order to avoid clusters of small slices, by swapping the order of values in the list. There is likely a way to achieve this in pandas.

  2. labeldistance lets you control the distance of label to the chart.

  3. Passing a second array as explode argument, lets you offset each slice's position.

A simple example below:

ax12 = plt.subplot2grid((2,2), (0,1))
labels = ["bewarfefvl","easdfgvagfvd","asasdfve.sd",
              "rgdegaf","adfewga","qargw","qaerghrttw","errrrd","ejjjjd"]
ax12.pie( [10,20,30,5,5,6,4,10,10], [0,0,0.0,0.1,0.3,.5,0,0,0], 
                          labels = labels, labeldistance=1.2)

Upvotes: 1

Related Questions