Отобразить процент цветных порций на уровне Matplotlib Python - PullRequest
0 голосов
/ 25 февраля 2019

Вот пример, который я взял из наборов образцов matplotlib:

import numpy as np
import matplotlib.pyplot as plt


N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence
fig = plt.Figure()
ax = fig.add_subplot(111)
p1 = ax.bar(ind, menMeans, width, yerr=menStd)
p2 = ax.bar(ind, womenMeans, width,
             bottom=menMeans, yerr=womenStd)

for p in ax.patches:
    width, height = p.get_width(), p.get_height()
    x, y = p.get_xy() 
    ax.annotate('{:.0%}'.format(height), (p.get_x()+.15*width, p.get_y() + height + 0.01))


plt.show()

Ссылка доступна здесь: Пример в Документах
Успешно получил следующий рисунок:
output image

Я хочу знать, как я могу показать процент оранжевой и синей полос прямо над их уровнями?

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

1 Ответ

0 голосов
/ 25 февраля 2019

Цикл значений в menMeans и womenMeans должен дать вам то, что вы хотите:

import numpy as np
import matplotlib.pyplot as plt

N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence

fig, ax = plt.subplots(1,1)
p1 = ax.bar(ind, menMeans, width, yerr=menStd)
p2 = ax.bar(ind, womenMeans, width,
             bottom=menMeans, yerr=womenStd)

for id, men in enumerate(menMeans):
    ax.text(id, men+3, str('{}\%'.format(men)))
    ax.text(id, men+womenMeans[id]+3, str('{}\%'.format(womenMeans[id])))

Если вы хотите, чтобы общий процент был нанесен поверх женских баров, а непроцент женщин, вы бы сделали:

for id, men in enumerate(menMeans):
    ax.text(id, men+3, str('{}\%'.format(men)))
    ax.text(id, men+womenMeans[id]+3, str('{}\%'.format(womenMeans[id]+men)))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...