简体   繁体   中英

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:

在此输入图像描述

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.

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM