Я пытаюсь комментировать тепловую карту. В документах matplotlib представлен пример , в котором предлагается создать вспомогательную функцию для форматирования аннотаций. Я чувствую, что должен быть более простой способ делать то, что я хочу. Я могу комментировать внутри полей тепловой карты, но эти тексты меняют положение при редактировании экстента тепловой карты . Мой вопрос заключается в том, как использовать extent
в ax.imshow(...)
, а также ax.text(...)
, чтобы комментировать правильные позиции. Ниже приведен пример:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
def get_manhattan_distance_matrix(coordinates):
shape = (coordinates.shape[0], 1, coordinates.shape[1])
ct = coordinates.reshape(shape)
displacement = coordinates - ct
return np.sum(np.abs(displacement), axis=-1)
x = np.arange(11)[::-1]
y = x.copy()
coordinates = np.array([x, y]).T
distance_matrix = get_manhattan_distance_matrix(coordinates)
# print("\n .. {} COORDINATES:\n{}\n".format(coordinates.shape, coordinates))
# print("\n .. {} DISTANCE MATRIX:\n{}\n".format(distance_matrix.shape, distance_matrix))
norm = Normalize(vmin=np.min(distance_matrix), vmax=np.max(distance_matrix))
Здесь можно изменить значение extent
.
extent = (np.min(x), np.max(x), np.min(y), np.max(y))
# extent = None
В соответствии с документами matplotlib , по умолчанию extent
- None
.
fig, ax = plt.subplots()
handle = ax.imshow(distance_matrix, cmap='plasma', norm=norm, interpolation='nearest', origin='upper', extent=extent)
kws = dict(ha='center', va='center', color='gray', weight='semibold', fontsize=5)
for i in range(len(distance_matrix)):
for j in range(len(distance_matrix[i])):
if i == j:
ax.text(j, i, '', **kws)
else:
ax.text(j, i, distance_matrix[i, j], **kws)
plt.show()
plt.close(fig)
. Можно сгенерировать две цифры, изменив extent
- просто раскомментируйте закомментированную строку и закомментируйте некомментированную строку. Ниже приведены две цифры:
Это можно увидеть, установив extent
, расположение пикселей меняется, что, в свою очередь, меняет положение маркеров ax.text(...)
. Есть ли простое решение, чтобы это исправить - установить произвольный extent
и по-прежнему центрировать текстовые маркеры в каждом поле?