Ошибка связана с тем, что ax.get_xticklabels()
возвращает список. Элементы списка проходят через их позицию (индекс, начиная с 0), а не их значение.
В вашем словаре есть значение тика, а не его позиция.
Вы должны извлечь его положение раньше и использовать его для установки цвета. Я изменил ваш код, чтобы сделать это:
import numpy as np
import matplotlib.pyplot as plt
def colorticks(event=None):
locs, labels = plt.xticks()
colors = {0.00 :'grey',0.25:'yellow',0.50:'brown',2.00:'red'}
for k, v in colors.items():
idxs = np.where(locs == k)[0]
for pos in idxs:
labels[pos].set_color(v)
fig, ax = plt.subplots(figsize=(5,4))
ax.plot([1,2,3])
colorticks()
#following line is needed to keep the correct colors when resizing
cid = fig.canvas.mpl_connect('resize_event', colorticks)
plt.show()

Ключ locs, labels = plt.xticks()
: xticks возвращает список со значениями (locs
) и их Text объектами (labels
).
Затем numpy.where используется для поиска индексов каждого данного значения в цикле, и эти индексы используются для установки цвета объектов Text
.
EDIT
После комментария @ ImportanceOfBeingErnest приведенный выше код был обновлен, чтобы он работал при изменении размера фигуры.
Соответствующие строки обернуты в функцию, используемую в качестве обратного вызова для 'resize_event'
.