ИМХО Я думаю, что вы можете добиться своего результирующего сюжета намного проще.Почему вы рассчитываете отдельные массивы X и Y;Морской рожок создан для работы с пандами.Почему вы рассчитываете свои позиции текста?Они уже там:
Предположим, у вас есть фрейм данных
df = pd.DataFrame([14336, 6812, 4265, 3857, 2960, 1986, 1730, 1233, 1128, 841], index=[19, 35, 29, 10, 5, 9, 45, 72, 3, 18])
Затем вы можете построить его непосредственно с помощью
ax=sns.barplot(x=df.index, y=0, data=df, order=df.index)
И распечатать значения поверхбары, как у вас, просто были бы
for i, y in enumerate(df[0]):
ax.text(i, 1.01*y, str(y), ha='center')
Однако я бы использовал постоянный разрыв между барами и значениями, а не тот, который масштабируется с высотой бара ...
edit:
Мое мнение о лучшей альтернативе для вычисления отдельных X и Y, как в вопросе:
Вы можете извлечь подсерии из кадра данных.Предположим, ваш исходный фрейм данных называется df
:
s = df[df.is_attributed==1].app.value_counts()
И команда plot немного меняется на
ax = sns.barplot(x=s.index, y=s, order=s.index)
... и, конечно, текстовый цикл:
for i, y in enumerate(s):
ax.text(i, 1.01*y, str(y), ha='center')