Столбец с перевернутой осью Y и планками, прикрепленными снизу - PullRequest
0 голосов
/ 11 декабря 2018

Код ниже создает гистограмму с инвертированной осью Y.Что мне пока не удается, так это то, что столбики не "свисают сверху", а начинаются снизуДругими словами, мне нравится, когда столбцы начинаются с максимального значения оси y (то есть с оси x) и заканчиваются значением df ['y'].Как я могу это сделать?

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(data={'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['rank'] = df['y'].rank(method='dense') - 1

fig = plt.figure()
ax = fig.add_subplot(111)
# increase space below subplot
fig.subplots_adjust(bottom=0.3)
ax.bar(df['rank'],
   df['y'],
   width=0.8,
   )
# invert y axis
ax.invert_yaxis()
# label x axis
ax.set_xticks(range(len(df)))
ax.set_xticklabels(df['x_cat'],
               fontdict={'fontsize': 14})
for tick in ax.get_xticklabels():
    tick.set_rotation(90)

output

1 Ответ

0 голосов
/ 11 декабря 2018

Вам нужно будет рассчитать новый 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()

output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...