Ось X на графике является категоричной, поэтому она не имеет значений df.a
в реальном масштабе, а только в виде меток. Вы можете изменить, например, df.a[19] = 2
и ничего не изменится, кроме метки последнего такта бара.
Таким образом, категориальная ось означает, что координаты равны 0 для первого бара, 1 для второго и т. Д. ... 19 для последнего.
Тогда мой подход - установить вертикальную линию на xpos * 19 / .95:
plt.vlines(x = .45*19/.95, ymin = 0, ymax = 0.6, color = 'red', linewidth=5)
В общем случае вы можете добавить лямбда-функцию для вычисления преобразования:
f = lambda x: (x-df.a.values[0]) * (df.a.size-1) / (df.a.values[-1] - df.a.values[0])
plt.vlines(x = f(.45), ymin = 0, ymax = 0.6, color = 'red', linewidth=5)
Однако, поскольку df.a.values
печатается только в виде меток, он должен идти линейно от начала до конца.
Относительно проблемы с маркировкой по оси X: я просто могу сказать, что она не появляется в моей системе, код для приведенного выше графика идентичен вашему, за исключением вертикальной линии. Возможно, это было введено при выполнении одной попытки vlines за другой.