Тепловая карта Seaborn с изменяющимися размерами ячеек

#python #matplotlib #seaborn

#python #matplotlib #seaborn

Вопрос:

У меня есть тепловая карта с тиками, которые имеют неравные дельты между собой: введите описание изображения здесь

Например, на прикрепленном изображении дельты находятся в диапазоне от 0,015 до 0,13. Текущий масштаб не показывает реальный сценарий, поскольку все размеры ячеек равны.

Есть ли способ разместить тики в их реалистичных положениях, чтобы размеры ячеек также менялись соответствующим образом? В качестве альтернативы, существует ли другой способ генерирования этой цифры таким образом, чтобы она обеспечивала реалистичное представление значений тиков?

Комментарии:

1. тепловые карты ожидают категориальные данные, IIRC

Ответ №1:

Как упоминалось в комментариях, тепловая карта Seaborn использует категориальные метки. Однако базовой структурой является a pcolormesh , которая может иметь разные размеры для каждой ячейки.

Также в комментариях упоминается, что обновление частных атрибутов pcolormesh не рекомендуется. Более того, тепловая карта может быть создана непосредственно при вызове pcolormesh .

Обратите внимание, что если есть N ячеек, будет N 1 границ. Приведенный ниже пример кода предполагает, что у вас есть x-позиции для центров ячеек. Затем он вычисляет границы посередине между последовательными ячейками. Повторяется первое и последнее расстояние.

Метки и метки для осей x и y могут быть установлены из заданных значений x. Пример кода предполагает, что исходные значения указывают центры ячеек.

 import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

sns.set()
N = 10
xs = np.random.uniform(0.015, 0.13, 10).cumsum().round(3)  # some random x values
values = np.random.rand(N, N)  # a random matrix

# set bounds in the middle of successive cells, add extra bounds at start and end
bounds = (xs[:-1]   xs[1:]) / 2
bounds = np.concatenate([[2 * bounds[0] - bounds[1]], bounds, [2 * bounds[-1] - bounds[-2]]])

fig, ax = plt.subplots()
ax.pcolormesh(bounds, bounds, values)

ax.set_xticks(xs)
ax.set_xticklabels(xs, rotation=90)
ax.set_yticks(xs)
ax.set_yticklabels(xs, rotation=0)
plt.tight_layout()
plt.show()
  

пример тепловой карты

PS: В случае, если тики означают границы, код можно упростить. Требуется одна дополнительная граница, например, ноль в начале. `

 bounds = np.concatenate([[0], xs])
ax.tick_params(bottom=True, left=True)
  

пример с отметками между ячейками

Комментарии:

1. Я бы не рекомендовал напрямую изменять частные атрибуты исполнителей matplotlib. Почему бы просто не использовать plt.pcolormesh напрямую?

2. Большое спасибо за замечание. Я обновил ответ. plt.pcolormesh Прямое использование намного чище (и проще).