I want to add a legend in the inner pie chart of a nested pie chart plot:
import matplotlib.pyplot as plt
# Make data: I have 3 groups and 7 subgroups
group_names=['groupA', 'groupB', 'groupC']
group_size=[12,11,30]
subgroup_names=['A.1', 'A.2', 'A.3', 'B.1', 'B.2', 'C.1', 'C.2', 'C.3',
'C.4', 'C.5']
subgroup_size=[4,3,5,6,5,10,5,5,4,6]
# Create colors
a, b, c=[plt.cm.Blues, plt.cm.Reds, plt.cm.Greens]
# First Ring (outside)
fig, ax = plt.subplots()
ax.axis('equal')
mypie, _ = ax.pie(group_size, radius=1.3, labels=group_names, colors=
[a(0.6), b(0.6), c(0.6)] )
plt.setp( mypie, width=0.3, edgecolor='white')
# Second Ring (Inside)
mypie2, _ = ax.pie(subgroup_size, radius=1.3-0.3,
labels=subgroup_names, labeldistance=0.7, colors=[a(0.5), a(0.4),
a(0.3), b(0.5), b(0.4), c(0.6), c(0.5), c(0.4), c(0.3), c(0.2)])
plt.setp( mypie2, width=0.4, edgecolor='white')
plt.margins(0,0)
subgroup_names_legs=['A.1:a1desc', 'A.2:a2desc', 'A.3:a3desc',
'B.1:b1desc', 'B.2:b2desc', 'C.1:c1desc', 'C.2:c2desc', 'C.3:c3desc',
'C.4:c4desc', 'C.5:c5desc']
plt.legend(subgroup_names_legs,loc='best')
# show it
plt.show()
so I get this result:
I want to reference the colors properly in the legend (for example, A1, A2 and A3 are different kinds of Blue, etc)
Also, How can I display the legend in a way that doesn't overlap the chart?
The problem is that first you assign legends using labels=subgroup_names
and then you reassign them using plt.legend(subgroup_names_legs,loc='best')
. So you are overwriting the existing values and therefore destroying the order That's why you see unmatched colors.
To avoid the legend box overlapping with the figure, you can specify its location as loc=(0.9, 0.1)
To get rid of the legends from the outer pie chart, you can grab the legend handles and labels and then exclude the first three enteries so that you only have the legends for the inner pie chart
# First Ring (outside)
fig, ax = plt.subplots()
ax.axis('equal')
mypie, _ = ax.pie(group_size, radius=1.3, labels=group_names, colors=
[a(0.6), b(0.6), c(0.6)] )
plt.setp( mypie, width=0.3, edgecolor='white')
# Second Ring (Inside)
mypie2, _ = ax.pie(subgroup_size, radius=1.3-0.3,
labels=subgroup_names, labeldistance=0.7, colors=[a(0.5), a(0.4),
a(0.3), b(0.5), b(0.4), c(0.6), c(0.5), c(0.4), c(0.3), c(0.2)])
plt.setp( mypie2, width=0.4, edgecolor='white')
plt.margins(0,0)
plt.legend(loc=(0.9, 0.1))
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[3:], subgroup_names_legs, loc=(0.9, 0.1))
plt.show()