Размещение процента роста в верхней части гистограммы в Matplotlib - PullRequest
0 голосов
/ 13 марта 2019

У меня есть гистограмма данных из 8 отдельных зданий, данные разделены по годам, я пытаюсь поместить рост каждого здания за последний год в верхней части гистограммы .

У меня есть это написано в настоящее время:

n_groups = 8

numbers_2017 = (122,96,42,23,23,22,0,0)

numbers_2018 = (284,224,122,52,41,24,3,1)


fig, ax = plt.subplots(figsize=(15, 10))

index = np.arange(n_groups)
bar_width = 0.35


events2017 = plt.bar(index, numbers_2017, bar_width,
                 alpha=0.7,
                 color='#fec615',
                 label='2017')

events2018 = plt.bar(index + bar_width, numbers_2018, bar_width,
                 alpha=0.7,
                 color='#044a05',
                 label='2018')

labels = ("8 specific buildings passed as strings")

labels = [ '\n'.join(wrap(l, 15)) for l in labels ]

plt.ylabel('Total Number of Events', fontsize=18, fontweight='bold', color = 'white')

plt.title('Number of Events per Building By Year\n', fontsize=20, fontweight='bold', color = 'white')

plt.xticks(index + bar_width / 2)

plt.yticks(color = 'white', fontsize=12)

ax.set_xticklabels((labels),fontsize=12, fontweight='bold', color = 'white')

plt.legend(loc='best', fontsize='xx-large')

plt.tight_layout()
plt.show()

Рассматривая подобные вопросы, многие из них разделяют общее количество по всем столбцам, тогда как я просто пытаюсь получить положительный (или отрицательный) процент роста, который будет помещен поверх самого последнего года, в данном случае 2018 года. ,

Я нашел этот превосходный пример онлайн , однако он делает именно то, что я объяснил ранее, делит проценты по всему графику:

totals = []

# find the values and append to list
for i in ax.patches:
    totals.append(i.get_height())

# set individual bar lables using above list
total = sum(totals)

# set individual bar lables using above list
for i in ax.patches:
    # get_x pulls left or right; get_height pushes up or down
    ax.text(i.get_x()-.03, i.get_height()+.5, \
            str(round((i.get_height()/total)*100, 1))+'%', fontsize=15,
                color='dimgrey')

Пожалуйста, дайте мне знать, если я смогу перечислить какие-либо примеры или изображения, которые могут помочь, и если это обман, пожалуйста, не стесняйтесь, присылайте мне оригинал (СООТВЕТСТВУЮЩИЙ), и я могу закрыть этот вопрос, спасибо!

1 Ответ

1 голос
/ 13 марта 2019

Я думаю, что вы дали ответ самостоятельно со второй частью кода, который вы дали.Единственное, что вам нужно было сделать, это заменить ax на объект, который вы хотели, текст выше, который в данном случае был events2018.

totals = []

for start, end in zip(events2017.patches, events2018.patches):
    if start.get_height() != 0:
        totals.append( (end.get_height() - start.get_height())/start.get_height() * 100)
    else:
        totals.append("NaN")

# set individual bar lables using above list
for ind, i in enumerate(events2018.patches):
    # get_x pulls left or right; get_height pushes up or down
    if totals[ind] != "NaN":
        plt.text(i.get_x(), i.get_height()+.5, \
            str(round((totals[ind]), 1))+'%', fontsize=15,
                color='dimgrey')
    else: 
        plt.text(i.get_x(), i.get_height()+.5, \
                 totals[ind], fontsize=15, color='dimgrey')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...