如何在 Python 热图中添加矩形补丁?
How to add rectangle patches in Python 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");
分类变量的热图数据取自 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()
好吧,在没有数据的情况下,我用均匀分布的值做出了解决方案。将您的数据复制粘贴到脚本中,只要它们是类似 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()
想法是获取下三角所有值的索引,以防止循环不必要的值。检查后面的值,如果满足条件,则在其位置绘制一个矩形。
您得到以下结果:
如果我正确理解了你的问题,这个脚本应该可以解决问题。
下面的代码给出了热图输出。但我想添加矩形补丁以突出显示 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");
分类变量的热图数据取自 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()
好吧,在没有数据的情况下,我用均匀分布的值做出了解决方案。将您的数据复制粘贴到脚本中,只要它们是类似 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()
想法是获取下三角所有值的索引,以防止循环不必要的值。检查后面的值,如果满足条件,则在其位置绘制一个矩形。
您得到以下结果:
如果我正确理解了你的问题,这个脚本应该可以解决问题。