Отметьте метки на регулярной основе - PullRequest
2 голосов
/ 11 апреля 2020

Я хотел бы повторить следующую тепловую карту, и я довольно близок. Я новичок в python, и у меня нет правильных осей и окраски.

def fun(C_1, C_2):
    return np.multiply(C_1, C_2)

C_1 = np.linspace(-2,2,100)
C_2 = np.linspace(-2,2,100)

# filling the heatmap, value by value
fun_map = np.empty((C_1.size, C_2.size))
for i in range(C_1.size):
    for j in range(C_2.size):
        fun_map[i,j] = fun(C_1[i], C_2[j])

sns.heatmap(fun_map)

Это дает следующий график. Чего я не знаю, так это как получить правильную ось, т.е. C_1 и C_2 вместо индексов.

А также, как мне показать только 0.5 шагов, то есть -2, -1.5, etc.?

enter image description here

Буду признателен за любую помощь.

1 Ответ

3 голосов
/ 11 апреля 2020

Чтобы установить галочки на обеих осях, вы можете использовать set и указать xticklabels и yticklabels. Для того чтобы числовые метки были через равные промежутки времени, нам нужно немного поработать над последовательностями меток. Вот один из подходов:

def show_at_intervals(seq, interval, decimals=1):
    x = np.copy(seq)
    low, high = x.min(), x.max()
    ar = np.arange(low,high,interval)
    replate_at = np.searchsorted(x, ar)
    new_ticks = np.full(x.shape, '', dtype=f'U{4+decimals}')
    new_ticks[replate_at] = x[replate_at].round(decimals)
    return new_ticks

Затем просто укажите нужные последовательности на обеих осях и новые интервалы (обратите внимание, что внешний продукт может быть напрямую получен с помощью np.multiply.outer):

g = sns.heatmap(np.multiply.outer(C_1, C_2), 
                xticklabels=True, yticklabels=True)
_ = g.set(xticklabels = show_at_intervals(C_1, 0.5),
          yticklabels = show_at_intervals(C_1, 0.5))

enter image description here

Или, например, для интервала .5 на x-axis и 0.2 на y-axis:

g = sns.heatmap(np.multiply.outer(C_1, C_2))
_ = g.set(xticklabels = show_at_intervals(C_1, .5),
          yticklabels = show_at_intervals(C_2, 0.2))

enter image description here

...