Вам нужно будет рассчитать новый bottom
.(Обратите внимание, что, поскольку ось перевернута, «нижняя часть» становится визуальной верхней частью столбцов.) Нижняя часть - это значение, высота - максимальная за вычетом самого значения.
Я изменил некоторые другие аспекты вашего графика, например, если ваши значения не отсортированы, вычисление ранга и использование его для построения графика приведет к неправильной маркировке.Следовательно, лучше отсортировать информационный кадр заранее (и забыть о ранге).
Наконец, нам нужно отрегулировать «липкие края» столбцов, потому что они должны плотно прилегать к нижней части рисунка (т.е.верх оси).
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'x_cat': ['aaaaa', 'bvvvvvv', 'deeeee', 'qqqqqqq', 'rr rrrrrrrr',
'rss sdasr', 'cccccccccccc', 'aarrrrrrrrrrra'],
'y': [11.91, 35.19, 43.61, 46.12, 75.03, 81.39, 83.28, 89.20]})
df.sort_values("y", inplace=True)
fig = plt.figure()
ax = fig.add_subplot(111)
# increase space below subplot
fig.subplots_adjust(bottom=0.3)
bars = ax.bar(df['x_cat'], df['y'].max()-df['y'], bottom=df['y'], width=0.8, )
# invert y axis
ax.invert_yaxis()
ax.tick_params(axis="x", rotation=90, labelsize=14)
for bar in bars:
bar.sticky_edges.y[:] = [df['y'].values.max()]
ax.autoscale()
plt.show()
