сортировать столбцы в порядке возрастания без использования фреймов данных - PullRequest
1 голос
/ 03 августа 2020

У меня есть два списка, и я строю график с помощью matplotlib. В настоящее время столбцы организованы так же, как и списки. Я хочу автоматически установить их в порядке возрастания / убывания. Как мне это сделать?

industries = ['Manufacturing', 'Food', 'Eco']
counts = [12,78,1]

plt.figure(figsize=(16,6))
bars = plt.bar(industries, counts, width=0.2, bottom=None, align='center', data=None)
plt.xlim(-0.9, len(industries) - 1 + 0.9)
for i in range(len(counts)):
    percentage = ((counts[i]/(total))*100)
    plt.annotate(percentage, xy=(industries[i], counts[i] + 10), ha='center')
plt.show()

Edit:

Я понял, что столбцы построены на основе алфавитного порядка. Даже если данные отсортированы. Как это исправить?

Ответы [ 2 ]

1 голос
/ 03 августа 2020
  • Два списка необходимо объединить с zip, а затем отсортировать по счетчикам.
  • Переберите list из tuples, чтобы добавить полосы в отсортированном порядке в reverse заказ, с аннотацией.
industries = ['Manufacturing', 'Food', 'Eco']
counts = [12, 78, 1]
tot = sum(counts)

# combine the two lists with zip and then reverse sort them
data = sorted(zip(industries, counts), key=lambda v: v[1], reverse=True)

plt.figure(figsize=(16, 6))
for (i, c) in data:  # unpack and plot each tuple in sorted order
    bars = plt.bar(i, c, width=0.2, bottom=None, align='center', data=None, color='g')
    plt.annotate(f'{(c/tot)*100:0.02f}%\n', xy=(i, c), va='center', ha='center')
plt.xlim(-0.9, len(industries) - 1 + 0.9)

plt.show()

введите описание изображения здесь

0 голосов
/ 03 августа 2020

Сначала отсортируйте списки по мере необходимости, zip вставив их, отсортируя, а затем « распаковать » их:

industries = ['Manufacturing', 'Food', 'Eco']
counts = [12,78,1]

sorted_counts, sorted_industries = zip(*sorted(zip(counts, industries), reverse=True))

Или установите reversed=False по возрастанию.

Затем строите вот так

x_locations = range(len(industries))
plt.bar(x_locations, sorted_counts, , tick_label=sorted_industries, ...)

Если вы посмотрите docs , вы увидите, что первый параметр - это не метки столбцов, а координаты x. Самый простой способ равномерно распределить их - использовать range. Затем вы можете изменить метки с помощью аргумента tick_labels.

Просто обратите внимание, когда я пытаюсь использовать plt.bar(sorted_industries, sorted_counts), он рисует их в ожидаемом порядке, а не в алфавитном порядке. С какой версией matplotlib вы пытаетесь это сделать?

...