Сложенная гистограмма в matplotlib - как кодировать с большим количеством категорий? - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь создать гистограмму с накоплением в matplotlib, но у меня есть большое количество категорий в каждом баре (около 120). Как бы я go о кодировании этого в автоматическом режиме, без необходимости определять каждую категорию вручную? Решения, которые я видел в Интернете, выбирают ручную версию, как видно из кода, вставленного ниже (см. Ссылку на оригинальный источник): https://www.weirdgeek.com/2018/11/plotting-stacked-bar-graph/

Переменные бронзы, серебра и золота это то, что я имею в виду, когда я говорю определение категорий вручную. Этого я бы хотел избежать.

countries = ['Norway', 'Germany', 'Canada', 'United States', 'Netherlands']
bronzes = np.array([10,7,10,6,6])
silvers = np.array([14,10,8,8,6])
golds = np.array([14,14,11,9,8])
ind = [country for country in countries]

plt.bar(ind, golds, width=0.6, label='golds', color='gold', bottom=silvers+bronzes)
plt.bar(ind, silvers, width=0.6, label='silvers', color='silver', bottom=bronzes)
plt.bar(ind, bronzes, width=0.6, label='bronzes', color='#CD7F32')

plt.xticks(ind, countries)
plt.ylabel("Medals")
plt.xlabel("Countries")
plt.legend(loc="upper right")
plt.title("2018 Winter Olympics Top Scorers")
plt.show()

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Может быть что-то подобное, используя pandas сюжет:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

countries = ['Norway', 'Germany', 'Canada', 'United States', 'Netherlands']
bronzes = np.array([10,7,10,6,6])
silvers = np.array([14,10,8,8,6])
golds = np.array([14,14,11,9,8])

df = pd.DataFrame({'golds':golds, 'silvers':silvers, 'bronzes':bronzes}, index = countries)

df.plot.bar(stacked=True, color=['gold','silver', '#CD7F32'], title='2018 Winter Olympics Top Scorers')

Вывод:

enter image description here

0 голосов
/ 10 апреля 2020

Часто используемым тактиком c является использование переменной numpy для нижней части. Он инициализируется с нуля и увеличивается с помощью numpy волхвов c.

Запись всего как for l oop имеет то преимущество, что общие параметры должны быть только написано один раз, и нужно менять только в одном месте. (В этом примере можно указать только общую ширину, но также можно задать цвет кромки, стиль заливки, прозрачность и т. Д. c.)

bottom = 0
for medal, label, color in zip ([bronzes, silvers, golds],
                                ['bronzes', 'silvers', 'golds'],
                                ['#CD7F32', 'silver', 'gold']):
    plt.bar(ind, medal, width=0.6, label=label, color=color, bottom=bottom)
    bottom += medal

Без al oop этот пример будет следующим , Когда будет много других категорий, будет сложнее поддерживать.

bottom = 0
plt.bar(ind, bronzes, width=0.6, label='bronzes', color='#CD7F32')
bottom += bronzes
plt.bar(ind, silvers, width=0.6, label='silvers', color='silver', bottom=bottom)
bottom += silvers
plt.bar(ind, golds, width=0.6, label='golds', color='gold', bottom=bottom)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...