это максимальная длина бара.
от 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 работает отлично. Спасибо.
Спасибо за вашу помощь с моими вопросами.