Подтвердить что ты не робот

Как добавить проценты в верхней части баров в море?

Учитывая следующий график подсчета, как разместить процентные значения поверх баров?

import seaborn as sns
sns.set(style="darkgrid")
titanic = sns.load_dataset("titanic")
ax = sns.countplot(x="class", hue="who", data=titanic)

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

Например, для "Первого" я ​​хочу, чтобы общее число первых мужчин/общее число сначала, общее число первых женщин/общее число сначала и общее число первых детей/общее число сначала поверх соответствующих баров.

Пожалуйста, дайте мне знать, если мое объяснение не ясно.

Спасибо!

4b9b3361

Ответ 1

sns.barplot явно не возвращает значения barplot способом matplotlib.pyplot.bar (см. последний параграф), но если вы ничего не построили, вы рискуете предположить, что все patches в осях являются вашими значениями, Затем вы можете использовать подсчеты, которые функция штриховки рассчитала для вас:

from matplotlib.pyplot import show
import seaborn as sns
sns.set(style="darkgrid")
titanic = sns.load_dataset("titanic")
total = float(len(titanic)) # one person per row 
#ax = sns.barplot(x="class", hue="who", data=titanic)
ax = sns.countplot(x="class", hue="who", data=titanic) # for Seaborn version 0.7 and more
for p in ax.patches:
    height = p.get_height()
    ax.text(p.get_x()+p.get_width()/2.,
            height + 3,
            '{:1.2f}'.format(height/total),
            ha="center") 
show()

производит

Countplot

Альтернативный подход заключается в том, чтобы сделать подсуммирование явно, например. с отличным pandas, и сюжет с matplotlib, а также самим стилем. (Хотя вы можете получить довольно много стилей из контекста sns даже при использовании функций построения matplotlib. Попробуйте -)

Ответ 2

С помощью решения cphlewis мне удалось поместить правильные проценты в верхнюю часть графика, поэтому классы суммируют до одного.

for index, category in enumerate(categorical):
    plt.subplot(plot_count, 1, index + 1)

    order = sorted(data[category].unique())
    ax = sns.countplot(category, data=data, hue="churn", order=order)
    ax.set_ylabel('')

    bars = ax.patches
    half = int(len(bars)/2)
    left_bars = bars[:half]
    right_bars = bars[half:]

    for left, right in zip(left_bars, right_bars):
        height_l = left.get_height()
        height_r = right.get_height()
        total = height_l + height_r

        ax.text(left.get_x() + left.get_width()/2., height_l + 40, '{0:.0%}'.format(height_l/total), ha="center")
        ax.text(right.get_x() + right.get_width()/2., height_r + 40, '{0:.0%}'.format(height_r/total), ha="center")

enter image description here

Тем не менее, решение предполагает, что есть 2 варианта (мужчина, женщина), а не 3 (мужчина, женщина, ребенок).

Так как Axes.patches упорядочены странным образом (сначала все синие столбцы, затем все зеленые столбцы, затем все красные столбцы), вам придется разделить их и соответствующим образом объединить.

Ответ 3

У меня тоже была та же проблема с добавлением процентов в верхней части столбцов в Seaborn. Я попытался реализовать решение с помощью cphlewis, но получаю процент только для первого бара, а не для остальных. Есть ли способ, чтобы решить это?