Легенда диаграммы в порядке уменьшение, кроме одного элемента

users = ['user1', 'user2', 'user3', 'user4', 'user5', 'user6', 'user7', 'user8', 'user9', 'Другие']
sizes = [15, 30, 45, 10, 23, 55, 22, 56, 11, 99]

plt.gca().axis("equal")
pie = plt.pie(sizes, startangle=90)

porcent = 100. * np.array(sizes) / sum(sizes)
labels = ['{0} - {1:1.2f} %'.format(i, j) for i, j in zip(users, porcent)]
print(labels)
print(sizes)

sort_legend = True
if sort_legend:
    patches, labels, dummy = zip(*sorted(zip(pie[0], labels, sizes),
                                         key=lambda x: x[2],
                                         reverse=True))

plt.legend(patches, labels, bbox_to_anchor=(1, 0.5), loc="center right", fontsize=10,
           bbox_transform=plt.gcf().transFigure)
plt.subplots_adjust(left=0.0, bottom=0.1, right=0.45)

plt.show()

Как сделать, чтобы элемент "Другие" был в конце легенды, а не в любом другом месте, в зависимости от его значения

Вот как получается через этот код


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Притворитесь что соответствующее значение меньше нуля. Сортировка поместит его в конец:

# было
# key=lambda x: x[2],
# стало
key=lambda x: -1 if x[1] == labels[-1] else x[2],

Если вам не по душе придумывание значения (-1) которое меньше любого другого, то есть более общий вариант. Возвращается пара, первый элемент которой сортирует названия (весьма специфическим образом), второй - значения (как раньше):

# было
# key=lambda x: x[2],
# стало
key=lambda x: (x[1] != labels[-1], x[2]),
→ Ссылка