Как показать процент на каждом участке?

При попытке построить следующий код я получил 4 графика, но процент отображается только на последнем графике.

fig, axes =plt.subplots(12,2,figsize=(12,50))
plt.subplots_adjust(wspace=0.9, hspace=0.9)
i=0
total = len(data['work_year']) 

for fea_name in fea:
     ax= axes[i//2, i%2]
     i += 1
     sns.countplot(x=fea_name, data=data, ax=ax,palette='icefire' )
     ax.set_title(f'Countplot of {fea_name}')

for i in range(len(fea), 12 * 2):
    fig.delaxes(axes[i//2, i%2])

for p in ax.patches:
        percentage = '{:.1f}%'.format(100 * p.get_height() / total)
        x = p.get_x() + p.get_width()/3
        y = p.get_y() + p.get_height()+50
        ax.annotate(percentage, (x, y))

plt.tight_layout()
plt.show()

Показаны проценты только на одном графике

Перед строкой for p in ax.patches: ты забыл for ax in axes.flat:.

JohanC 03.04.2024 23:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

fig, axes =plt.subplots(12,2,figsize=(12,50))
plt.subplots_adjust(wspace=0.9, hspace=0.9)
i=0
total = len(data['work_year']) 

for fea_name in fea:
     ax= axes[i//2, i%2]
     i += 1
     sns.countplot(x=fea_name, data=data, ax=ax,palette='icefire' )
     ax.set_title(f'Countplot of {fea_name}')
    #  ax.tick_params(axis='x', rotation=45)

for i in range(len(fea), 12 * 2):
    fig.delaxes(axes[i//2, i%2])
for ax in axes.flat:
    for p in ax.patches:
        percentage = '{:.1f}%'.format(100 * p.get_height() / total)
        x = p.get_x() + p.get_width()/3
        y = p.get_y() + p.get_height()+50
        ax.annotate(percentage, (x, y))

plt.tight_layout()
plt.show()
Ответ принят как подходящий

Вы можете немного упростить свой код с помощью ax.bar_label().

(Последняя версия Seaborn требует, чтобы hue= был равен столбцу x= при использовании палитры.)

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

# first, create some reproducible test data
data = pd.DataFrame({'feature1': np.random.choice([*'abc'], 200),
                     'feature2': np.random.choice([*'defg'], 200),
                     'feature3': np.random.choice([*'hij'], 200),
                     'feature4': np.random.choice([*'klmno'], 200)})
fea = ['feature1', 'feature2', 'feature3', 'feature4']

fig, axes = plt.subplots(2, 2, figsize=(12, 12))

total = len(data)

for fea_name, ax in zip(fea, axes.flat):
    sns.countplot(x=fea_name, data=data, ax=ax, hue=fea_name, palette='icefire')
    ax.set_title(f'Countplot of {fea_name}')
    for c in ax.containers:
        ax.bar_label(c, fmt=lambda x: f'{x / total:.1%}')

plt.tight_layout()
plt.show()

Когда я попытался запустить этот код, он показал мне ошибку «неподдерживаемый тип(ы) операнда для%: «функция» и «float».

Manish Patel 04.04.2024 13:09

Я тестировал seaborn 0.13.2 и matplotlib 3.8.3.

JohanC 04.04.2024 14:17

Другие вопросы по теме

Группа временных рядов Pandas по временному интервалу на коробчатом графике морского побережья
Как преобразуются отрицательные границы шкалы ошибок, когда перед построением линейного графика Сиборна применяется масштабирование логарифмической оси?
Вручную установите значения, показанные в легенде для непрерывной переменной диаграммы рассеяния seaborn/matplotlib
Получение точек графика для оценки плотности ядра в seaborn
Как сделать черные рамки вокруг определенных маркеров в парном сюжете Seaborn
Как выровнять график KDE с полосовым графиком в Seaborn?
Почему в легенде sns.barplot показаны не все значения?
Как настроить размер маркеров на диаграмме рассеяния морского побережья
Дискретная тепловая карта, изменение непрозрачности ячеек в зависимости от переменной (морского происхождения?)
Seaborn Scatterplot использует несколько разных маркеров вместо точек