Съезжают метки на столбчатой диаграмме

Строю столбчатую диаграмму (барплот) вот таким кодом:

plt.figure(figsize=(10, 5))
metki = [ '1. Показатель первой характеристики',    '2. Показатель второй характеристики',  '3. Показатель третьей характеристики',
          '4. Показатель четвертой характеристики', '5. Показатель пятой характеристики',   '6. Показатель шестой характеристики',  '7. Показатель седьмой характеристики',
          '8. Показатель восьмой характеристики',   '9. Показатель девятой характеристики', '10. Показатель десятой характеристики',
          '11. Показатель одиннаддцатой характеристики',    '12. Показатель двенадцатой характеристики']
x=[1,2,3,4,5,6,7,8,9,10,11,12]
y=[16,3,4,11,16,0,23,1,21,7,14,19]
b = sns.color_palette("ch:start=.2,rot=-.3")
ax = sns.barplot(x=x,
                 y=y,
                 palette=["teal", "crimson"])
def without_hue(plot):
    for p in plot.patches:
        percentage = '{:.1f}%'.format(100 * p.get_height()/30)
        x = p.get_x() + p.get_width() / 2 - 0.05
        y = p.get_y() + p.get_height() +0.5
        ax.annotate(percentage, (x, y), size = 12)
kwargs = {'alpha': 0.9, 'linestyle': '-', 'linewidth': 0.5, 'edgecolor': 'black'}
ax = sns.barplot(x=x, y=y,  palette=b, **kwargs)
plt.xticks(x, metki, rotation=90)

without_hue(ax)
[![plt.tight_layout()][1]][1]
plt.show()

Но у меня почему-то съезжают метки по оси Х: они должны находиться ровно под каждым столбцом, а уезжают куда-то вправо... Очевидно, я допускаю какую-то грубую ошибку, но ломаю голову все утро и не могу понять. Помогите, пожалуйста!

(А еще, если кто-то подскажет, как сделать, чтоб весь текст помещался на графике- тому большое спасибо! Увеличение размера фигуры не помогает)

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


Ответы (2 шт):

Автор решения: strawdog
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 5))
metki = [ '1. Показатель первой характеристики',    '2. Показатель второй характеристики',  '3. Показатель третьей характеристики',
          '4. Показатель четвертой характеристики', '5. Показатель пятой характеристики',   '6. Показатель шестой характеристики',  '7. Показатель седьмой характеристики',
          '8. Показатель восьмой характеристики',   '9. Показатель девятой характеристики', '10. Показатель десятой характеристики',
          '11. Показатель одиннаддцатой характеристики',    '12. Показатель двенадцатой характеристики']
#x=[1,2,3,4,5,6,7,8,9,10,11,12]
x=[0, 1,2,3,4,5,6,7,8,9,10,11]
y=[16,3,4,11,16,0,23,1,21,7,14,19]
b = sns.color_palette("ch:start=.2,rot=-.3")
ax = sns.barplot(x=x,
                 y=y,
                 palette=["teal", "crimson"])
def without_hue(plot):
    for p in plot.patches:
        percentage = '{:.1f}%'.format(100 * p.get_height()/30)
        x = p.get_x() + p.get_width() / 2 - 0.05
        y = p.get_y() + p.get_height() +0.5
        ax.annotate(percentage, (x, y), size = 12)
kwargs = {'alpha': 0.9, 'linestyle': '-', 'linewidth': 0.5, 'edgecolor': 'black'}
ax = sns.barplot(x=x, y=y,  palette=b, **kwargs)
#plt.xticks(x, metki, rotation=60) #<--- убираем
ax.set_ylim(ax.get_ylim()[0],ax.get_ylim()[1]+ax.get_ylim()[1]/5)
print(ax.get_ylim())
without_hue(ax)
ax.set_xticklabels(metki, rotation=40, ha="right") # <-- добавляем и выставляем ha (hirozintal alignment)
plt.tight_layout()
plt.show()

Получаем:

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

→ Ссылка
Автор решения: CrazyElf

Горизонтальный вариант для разнообразия:

import matplotlib.pylab as plt
import seaborn as sns
import pandas as pd

plt.figure(figsize=(10, 5))
metki = [ '1. Показатель первой характеристики',    '2. Показатель второй характеристики',  '3. Показатель третьей характеристики',
          '4. Показатель четвертой характеристики', '5. Показатель пятой характеристики',   '6. Показатель шестой характеристики',  '7. Показатель седьмой характеристики',
          '8. Показатель восьмой характеристики',   '9. Показатель девятой характеристики', '10. Показатель десятой характеристики',
          '11. Показатель одиннаддцатой характеристики',    '12. Показатель двенадцатой характеристики']
x=[1,2,3,4,5,6,7,8,9,10,11,12]
y=[16,3,4,11,16,0,23,1,21,7,14,19]

df = pd.DataFrame({'m': metki, 'x': x, 'y': y})

def without_hue(plot):
    for p in plot.patches:
        percentage = '{:.1f}%'.format(100 * p.get_width()/30)
        x = p.get_x() + p.get_width() + 0.2
        y = p.get_y()  +0.5
        ax.annotate(percentage, (x, y), size = 12)

plt.figure(figsize=(10, 7))
b = sns.color_palette("ch:start=.2,rot=-.3")
kwargs = {'alpha': 0.9, 'linestyle': '-', 'linewidth': 0.5, 'edgecolor': 'black'}
ax = sns.barplot(x='y', y='m', data=df, palette=b, **kwargs);
without_hue(ax)
plt.show()

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

→ Ссылка