это максимальная длина бара.

от Seaborn по умолчанию почти работает для меня, хотя и с некоторыми деталями. Это показано ниже:

Пожалуйста, посмотрите на «текстовую» аннотацию рядом и справа от каждого бара. Есть несколько вещей, которые я хотел бы улучшить:

Последний столбец НЕ показывает аннотацию по какой-то причине. Я не знаю, как это исправить.

Между краями стержней и верхней и нижней осями X нет места. Я хотел бы разместить там немного места.

В любом случае можно ли увеличить ширину стержней?

Я также хотел бы увеличить расстояние между «самой высокой» полосой и правой осью Y, так как я планирую добавить текст, а не только числа Толщины, соответствующие их значениям оси X. Было бы что-то вроде 105,65 (42,54%), если вы посмотрите на полосу, соответствующую категории Red0 HRA. Это будет явно толкать его «за» край правой оси Y. Есть ли способ увеличить расстояние между его пиком и максимальным значением оси X? Так, например, если бы я мог установить максимальную высоту столбцов (легко рассчитать) плюс определенную сумму.

Если бы я мог позаботиться об этих деталях, это сделало бы его идеальным!

Вот фрагмент моего кода, который имеет отношение к вопросам выше:

sns.set_style('whitegrid')
sns.set(font_scale=0.8)
thickness = []
for hra_color in df_hra_colors['hra']:
    thickness.append(grouped.get_group(hra_color).count()['hra'] * mult)
df_hra_colors['thickness'] = thickness
ax = sns.barplot(x='thickness', y='hra', data=df_hra_colors,
                 palette=df_hra_colors['hex'].tolist())
ax.set_xlabel("Thickness")
ax.set_ylabel("HRA")
ax.set_title("What an Awesome Plot!")
for p in ax.patches:
    ax.annotate("%.2f" % p.get_width(), (p.get_x() + p.get_width(), p.get_y() + 1.2),
                xytext=(5, 10), textcoords='offset points')
plt.show()

Вот минимальный, полный проверяемый пример в соответствии с запросом:

""" Minimal program for demonstration """
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

def main():
    sns.set_style('whitegrid')
    sns.set(font_scale=0.8)
    # plt.rcParams['figure.figsize'] = (10,10)
    df_hra_colors = pd.DataFrame({
        'hra': ['red', 'green', 'blue'],
        'hex': ['#cc0000', '#40ff00', '#0000ff']
    })
    thickness = [1, 2, 3]
    thick_sum = sum(thickness)
    df_hra_colors['thickness'] = thickness
    ax = sns.barplot(x='thickness', y='hra', data=df_hra_colors,
                     palette=df_hra_colors['hex'].tolist())
    plt.xlim(0, max(thickness) + 30)
    ax.set_xlabel("Thickness")
    ax.set_ylabel("HRA")
    ax.set_title("What an Awesome Plot!")
    for i, p in enumerate(ax.patches):
        ax.annotate("%.2f (%.2f)%%" % (p.get_width(), thickness[i] / thick_sum * 100.0),
                    (p.get_x() + p.get_width(), p.get_y() + 1),
                    xytext=(5, 10), textcoords='offset points')
    plt.show()

if __name__ == "__main__":
    main()

И вот как это выглядит:

Затем я изменил строку, которая добавляет 1 к p.get_y (), чтобы добавить 0.5 вместо этого, как показано ниже:

for i, p in enumerate(ax.patches):
    ax.annotate("%.2f (%.2f)%%" % (p.get_width(), thickness[i] / thick_sum * 100.0),
                (p.get_x() + p.get_width(), p.get_y() + 0.5),
                xytext=(5, 10), textcoords='offset points')

И вот что я получил:

Таким образом, аннотированный текст был скрыт из-за смещения. Используя эти знания, я мог настроить свой оригинальный скрипт так, чтобы показывать аннотированный текст в последней строке. Но это приводит к дополнительному вопросу. Как настроить код так, чтобы он был согласованным, если вы заранее не знаете количество баров?

Ваш ответ 2 отлично работает. Спасибо.

Номер 3 не работал для меня, так как я использую sns.barplot. Python не любит параметр ширины в вызове barplot.

№ 4 работает отлично. Спасибо.

Спасибо за вашу помощь с моими вопросами.

Ответы на вопрос(1)

Ваш ответ на вопрос