#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
Прямое использование намного чище (и проще).