изменить цвет метки на основе значений в словаре matplotlib - PullRequest
1 голос
/ 17 июня 2019

У меня есть словарь, содержащий ключи в качестве меток и значения в качестве цветов для графика. Используя пример из: Измените цвет определенных тиков на графике с помощью matplotlib . Как мне поменять цвета надписей на основе ключей в словаре. Обратите внимание, что метки могут повторяться несколько раз на оси x, и они могут быть строками, например, метки = 'A', 'B', 'C', 'D'.

Вот небольшая модификация кода:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(5,4))
ax.plot([1,2,3])
colors = {0.00 :'grey',0.25:'yellow',0.50:'brown',2.00:'red'}
for k, v in colors.items():
    ax.get_xticklabels()[k].set_color(v)

plt.show()

Я ожидал, что каждая метка на графике будет связана с цветом, но я получаю простой график с этой ошибкой: Ошибка типа: индексы списка должны быть целыми или кусочками, а не плавающими. Я пытаюсь адаптировать его специально для строковых меток.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Одним из решений является проверка наличия тиковых меток в ключах вашего словаря. Чтобы сравнить точные значения, я преобразовал ключи из числа с плавающей точкой в ​​строки. Я считаю, что это не должно быть проблемой для вас.

P.S .: На основании комментария @ ImportanceOfBeingEarnest, я бы сказал, что этот ответ предполагает, что фигура остается статичной и не изменяется.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(5,4))
ax.plot([1,2,3])
colors = {'0.00' :'grey','0.25':'yellow','0.50':'brown','2.00':'red'}

fig.canvas.draw()

for xtic in ax.get_xticklabels():
    if xtic.get_text() in colors.keys(): # Change color if exist else not
        xtic.set_color(colors[xtic.get_text()])

plt.show()

enter image description here

1 голос
/ 17 июня 2019

Ошибка связана с тем, что 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()

enter image description here

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

EDIT

После комментария @ ImportanceOfBeingErnest приведенный выше код был обновлен, чтобы он работал при изменении размера фигуры.
Соответствующие строки обернуты в функцию, используемую в качестве обратного вызова для 'resize_event'.

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