#python #pandas #matplotlib #seaborn #heatmap
Вопрос:
Приведенный ниже код дает мне вывод тепловой карты. но я хочу добавить прямоугольники, чтобы выделить значения в диапазоне от 0,4 до 0,99 и от -0,4 до -0,99
plt.figure(figsize=(15,10))
mask = np.triu(np.ones_like(corr, dtype=np.bool))
sns.heatmap(corr,annot=True,fmt=".2f", mask=mask,cmap="YlGnBu");
Комментарии:
1. Являются ли данные общедоступными для этого примера ? Не могли бы вы, пожалуйста, дать его, чтобы написать именно тот ответ, который вы ищете?
Ответ №1:
Данные тепловой карты для категориальных переменных были взяты из данных о ценах на жилье Kaggle. Чтобы добавить прямоугольник, добавьте прямоугольник в add_patch(). Координаты указаны в левом нижнем углу, поэтому укажите x и y каждого из них в кортежах, а также укажите ширину и высоту. Мы также указываем не заполнять его.
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as patches
fig, ax = plt.subplots(figsize=(18,18))
df_house = pd.read_csv('./data/house_prices_train.csv', index_col=0)
df_house_corr = df_house.corr()
mask = np.triu(np.ones_like(df_house_corr, dtype=np.bool))
sns.heatmap(df_house_corr, annot=True, fmt=".2f", mask=mask, cmap="YlGnBu")
ax.add_patch(
patches.Rectangle(
(5, 6),
1.0,
35.0,
edgecolor='red',
fill=False,
lw=2
) )
plt.show()
Комментарии:
1. Данные были большими, поэтому изображение теперь стало больше. Координаты, которые вы хотите указать, можно задать вручную. Если мой ответ помог вам, пожалуйста, подумайте о том, чтобы принять его как правильный ответ
Ответ №2:
Итак, без данных я принял решение со значениями равномерного распределения. Скопируйте и вставьте свои данные в скрипт, и он должен работать до тех пор, пока они имеют тип массива NumPy.
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
import seaborn as sns
fig, ax = plt.subplots(figsize=(15, 10))
data_len = 17
uniform_data = np.random.rand(data_len, data_len)
# np.bool is deprecated in Numpy 1.20
mask = np.triu(np.ones_like(uniform_data, dtype=bool))
heatmap = sns.heatmap(uniform_data, annot=True, fmt='.2f', mask=mask, cmap='YlGnBu', ax=ax)
indices_tuple = np.tril_indices(n=data_len, k=-1)
# first array of indices_tuple: indices on column
# second array of indices_tuple: indices on lines
for col_index, line_index in zip(indices_tuple[0], indices_tuple[1]):
if (np.abs(uniform_data[line_index, col_index]) <= 0.99) and (np.abs(uniform_data[line_index, col_index]) >= 0.4):
rect = patches.Rectangle((line_index, col_index), 1, 1, fill=True, facecolor='red', alpha=0.5)
ax.add_patch(rect)
plt.show()
Идея состоит в том, чтобы получить индексы всех значений нижнего треугольника, чтобы предотвратить перебор ненужных значений. Последние значения проверяются, и если условие выполнено, в его положении рисуется прямоугольник.
Вы получите следующий результат:
Если я правильно понял вашу проблему, этот скрипт должен сделать свое дело.