Как добавить текстовые значения в bar plot seaborn python?

#python #data-visualization #seaborn #visualization

#python #визуализация данных #seaborn #визуализация

Вопрос:

я хочу визуализировать с помощью seaborn и добавить текст. это мой код:

 # barplot price by body-style
fig, ax = plt.subplots(figsize = (12,8))
g = data[['body-style','price']].groupby(by = 'body- 
style').sum().reset_index().sort_values(by='price')
x = g['body-style']
y = g['price']
ok = sns.barplot(x,y, ci = None)
ax.set_title('Price By Body Style')
def autolabel(rects):
   for idx,rect in enumerate(ok):
       height = rect.get_height()
       g.text(rect.get_x()   rect.get_width()/2., 0.2*height,
             g['price'].unique().tolist()[idx],
             ha='center', va='bottom', rotation=90)
autolabel(ok)
  

но я отправляю ошибку:

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

Комментарии:

1. что означает автоматическая метка (ax.исправлено)? где я могу это записать?

2. @JohanC я все еще ошибаюсь в коде

3. я закончил пробовать и получил ошибку

Ответ №1:

Вам нужно несколько изменений:

  • Поскольку вы уже создали ax , вам нужно sns.barplot(..., ax=ax) .
  • autolabel() необходимо вызвать со списком баров в качестве аргумента. С seaborn вы получаете этот список через ax.patches .
  • for idx,rect in enumerate(ok): не следует использовать ok но rects .
  • Вы не можете использовать g.text . g является фреймом данных и не имеет .text функции. Вам нужно ax.text .
  • Использование g['price'].unique().tolist()[idx] в качестве текста для печати не имеет никакого отношения к отображаемым столбцам. Вместо этого вы могли бы использовать height .

Вот некоторый тестовый код с игрушечными данными:

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

fig, ax = plt.subplots(figsize=(12, 8))
g = data[['body-style','price']].groupby(by = 'body-style').sum().reset_index().sort_values(by='price')
x = g['body-style']
y = g['price']
# x = list('abcdefghij')
# y = np.random.randint(20, 100, len(x))

sns.barplot(x, y, ci=None, ax=ax)
ax.set_title('Price By Body Style')

def autolabel(rects):
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x()   rect.get_width() / 2., 0.2 * height,
                height,
                ha='center', va='bottom', rotation=90, color='white')

autolabel(ax.patches)
plt.show()
  

пример графика

PS: Вы можете изменить размер шрифта текста с помощью параметра на ax.text : ax.text(..., fontsize=14) .