#python #pandas #matplotlib #seaborn
#python #панды #matplotlib #seaborn
Вопрос:
У меня есть функция, которая создает карту matplotlib. Затем я хочу наложить тепловую карту seaborn поверх этой карты, и обе карты будут точно такого же размера друг на друга, при этом можно будет видеть детали обеих карт. Возможно ли это? Пожалуйста, посмотрите мой код ниже.
def draw_map():
fig=plt.figure()
fig.set_size_inches(14.5, 8.8)
ax=fig.add_subplot(1,1,1)
#Map Outline amp; Centre Line
plt.plot([0,0],[0,88], color="black")
plt.plot([0,145],[88,88], color="black")
plt.plot([145,145],[88,0], color="black")
plt.plot([145,0],[0,0], color="black")
ly97 = [39,49]
lx97 = [72.5,72.5]
plt.plot(lx97,ly97,color="black")
seaborn.heatmap(data)
plt.ylim(0, 88)
plt.xlim(0, 145)
#Display Map
plt.show()
По какой-то причине тепловая карта seaborn кажется крошечной по сравнению с картой matplotlib. Данные в тепловой карте seaborn содержат только значения от 0 до 1, если это поможет. Заранее спасибо.
Ответ №1:
При рисовании MxN
массива в виде тепловой карты seaborn создает его с измерением x от 0
to N-1
и измерением y от 0
to M-1
. Похоже, нет способа предоставить ваши собственные измерения. Поскольку seaborn вызывает matplotlib pcolormesh()
для рисования тепловой карты, вы можете вызвать его напрямую. pcolormesh()
принимает параметры для установки размеров x и y.
В приведенном ниже примере используется стандартный «объектно-ориентированный» интерфейс для pyplot. Используются альфа-и зеленые линии, чтобы получить больший контраст между линиями и тепловой картой с цветовой картой seaborn по умолчанию.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
fig, ax = plt.subplots(figsize=(14.5, 8.8))
# Map Outline amp; Centre Line
ax.plot([0, 0], [0, 88], color="lime", lw=3)
ax.plot([0, 145], [88, 88], color="lime", lw=3)
ax.plot([145, 145], [88, 0], color="lime", lw=3)
ax.plot([145, 0], [0, 0], color="lime", lw=3)
ly97 = [39, 49]
lx97 = [72.5, 72.5]
ax.plot(lx97, ly97, color="lime", lw=3)
M = 20
N = 30
data = np.random.rand(M, N)
# sns.heatmap(data)
ax.pcolormesh(np.linspace(0, 145, N 1), np.linspace(0, 88, M 1), data, alpha=0.4,
cmap=sns.color_palette("rocket", as_cmap=True))
# ax.set_ylim(0, 88)
# ax.set_xlim(0, 145)
plt.show()