Могу ли я наложить график Seaborn на график Matplotlib?

#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()
  

пример графика