Задача
Проблема возникает из-за категоричности барпотов панд. Каждый столбец позиционируется с последовательным целочисленным значением, начинающимся с 0. Только метки корректируются для отображения фактического индекса кадра данных. Итак, здесь у вас есть FixedLocator
со значениями 0,1,2,3,...
и FixedFormatter
со значениями -5, -4, -3, ...
. Смена локатора сама по себе не меняет форматер, поэтому вы получаете числа -5, -4, -3, ...
, но в разных местах (один тик не отображается, поэтому график начинается здесь с -4).
A. Раствор панд
В дополнение к настройке локатора вам необходимо установить форматтер, который возвращает правильные значения в зависимости от местоположения. В случае использования индекса данных с последовательными целыми числами, как здесь используется, это можно сделать, добавив минимальный индекс к местоположению, используя FuncFormatter
. В других случаях функция для FuncFormatter
может стать более сложной.
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import (MultipleLocator, MaxNLocator,
FuncFormatter, ScalarFormatter)
df = pd.DataFrame([1, 3, 3, 5, 10, 20, 11, 7, 2, 3, 1], range(-5, 6))
ax = df.plot(kind='barh')
ax.yaxis.set_major_locator(MultipleLocator(2))
sf = ScalarFormatter()
sf.create_dummy_axis()
sf.set_locs((df.index.max(), df.index.min()))
ax.yaxis.set_major_formatter(FuncFormatter(lambda x,p: sf(x+df.index[0])))
plt.show()
B. Матплотлиб раствор
Используя matplotlib, решение потенциально проще. Поскольку столбчатые диаграммы matplotlib имеют числовой характер, они располагают столбцы в местах, указанных для первого аргумента. Здесь достаточно установить только локатор.
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import MultipleLocator, MaxNLocator
df = pd.DataFrame([1, 3, 3, 5, 10, 20, 11, 7, 2, 3, 1], range(-5, 6))
fig, ax = plt.subplots()
ax.barh(df.index, df.values[:,0])
ax.yaxis.set_major_locator(MultipleLocator(2))
plt.show()