Построение двух тепловых карт рядом в Matplotlib

#python #matplotlib #subplot

#python #matplotlib #подзаголовок

Вопрос:

У меня есть функция, которая отображает тепловую карту для корреляционной матрицы фрейма данных. Функция выглядит следующим образом:

 def corr_heatmap(data):
    columns = data.columns
    corr_matrix = data.corr()

    fig, ax = plt.subplots(figsize=(7, 7))
    mat = ax.matshow(corr_matrix, cmap='coolwarm')

    ax.set_xticks(range(len(columns)))
    ax.set_yticks(range(len(columns)))
    ax.set_xticklabels(columns)
    ax.set_yticklabels(columns)
    plt.setp(ax.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor')
    plt.colorbar(mat, fraction=0.045, pad=0.05)
    fig.tight_layout()
    plt.show()

    return mat
  

и при запуске с фреймом данных выдает что-то вроде этого:

введите описание изображения здесь

Что я хочу сделать, так это построить две из этих тепловых карт рядом, но у меня возникли некоторые проблемы с этим. То, что я сделал до сих пор, — это попытка присвоить каждую тепловую карту объекту AxesImage и использовать подзаголовки для их построения.

 mat1 = corr_heatmap(corr_mat1)
mat2 = corr_heatmap(corr_mat2)

fig = plt.figure(figsize=(15, 15))
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax1.plot(ma1)
ax2.plot(ma2)
  

но это дает мне следующую ошибку:

 TypeError: float() argument must be a string or a number, not 'AxesImage'
  

Кто-нибудь случайно не знает способ, которым я мог бы построить два изображения тепловой карты рядом? Спасибо.

Редактировать

На случай, если кому-то интересно, как будет выглядеть окончательный код для того, что я хотел сделать:

 def corr_heatmaps(data1, data2, method='pearson'):

    # Basic Configuration
    fig, axes = plt.subplots(ncols=2, figsize=(12, 12))
    ax1, ax2 = axes
    corr_matrix1 = data1.corr(method=method)
    corr_matrix2 = data2.corr(method=method)
    columns1 = corr_matrix1.columns
    columns2 = corr_matrix2.columns

    # Heat maps.
    im1 = ax1.matshow(corr_matrix1, cmap='coolwarm')
    im2 = ax2.matshow(corr_matrix2, cmap='coolwarm')

    # Formatting for heat map 1.
    ax1.set_xticks(range(len(columns1)))
    ax1.set_yticks(range(len(columns1)))
    ax1.set_xticklabels(columns1)
    ax1.set_yticklabels(columns1)
    ax1.set_title(data1.name, y=-0.1)
    plt.setp(ax1.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor')
    plt.colorbar(im1, fraction=0.045, pad=0.05, ax=ax1)

    # Formatting for heat map 2.
    ax2.set_xticks(range(len(columns2)))
    ax2.set_yticks(range(len(columns2)))
    ax2.set_xticklabels(columns2)
    ax2.set_yticklabels(columns2)
    ax2.set_title(data2.name, y=-0.1)
    plt.setp(ax2.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor')
    plt.colorbar(im2, fraction=0.045, pad=0.05, ax=ax2)

    fig.tight_layout()
  

Это может (при запуске с двумя фреймами данных Pandas) выводить что-то вроде следующего изображения:

введите описание изображения здесь

Ответ №1:

Что вам нужно, так это plt.subplots функция. Вместо того, чтобы вручную добавлять Axes объекты в a Figure , вы можете инициализировать a Figure вместе с рядом Axes . Тогда это так же просто, как вызов matshow каждого Axes :

 import numpy as np
import pandas as pd

from matplotlib import pyplot as plt

df = pd.DataFrame(np.random.rand(10, 10))

fig, axes = plt.subplots(ncols=2, figsize=(8, 4))

ax1, ax2 = axes

im1 = ax1.matshow(df.corr())
im2 = ax2.matshow(df.corr())

fig.colorbar(im1, ax=ax1)
fig.colorbar(im2, ax=ax2)
  

введите описание изображения здесь

Вы можете выполнить все остальное форматирование позже.

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

1. привет @ gmds, вы знаете, как я могу использовать одну и ту же цветовую панель для обеих тепловых карт?

2. @NimrodMorag Вы должны задать новый вопрос.

3. Эй, куда добавить опцию аннотации?

Ответ №2:

Пожалуйста, следуйте приведенному ниже примеру, измените график на matshow, выполните настройку оси в соответствии с вашими потребностями.

 import numpy as np 
import matplotlib.pyplot as plt 

def f(t): 
    return np.exp(-t) * np.cos(2*np.pi*t) 

t1 = np.arange(0.0, 3.0, 0.01) 

ax1 = plt.subplot(121) 
ax1.plot(t1, f(t1), 'k') 

ax2 = plt.subplot(122) 
ax2.plot(t1, f(t1), 'r') 
plt.show() 
  

Вывод:

Вывод

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

1. Спасибо за ответ, Ранджит. К сожалению, это не то, чего я пытаюсь достичь. Я уже знаком с тем, как создавать простые подзаголовки с помощью Matplotlib. Причина, по которой я опубликовал вопрос, заключается в том, что я хотел использовать пользовательскую функцию, которую я создал, для вывода двух тепловых карт рядом.