Reputation: 926
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:
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)
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
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:
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
.
labeldistance
lets you control the distance of label to the chart.
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