如何在任意范围内设置 seaborn 颜色图?

How to set a seaborn color map in an arbitrary range?

我正在为项目之间的相关性创建热图。

sns.heatmap(df_corr, fmt=".2g", cmap='vlag', cbar='True', annot = True)

我选择 vlag 是因为红色代表高值,蓝色代表低值,白色代表中间值。

Seaborn 自动将数据帧中的最高值设置为红色,将最低值设置为蓝色。

但是,由于我正在跟踪 Pearson 相关性,因此值范围在 -1 和 1 之间 - 因此我想将 1 设置为红色,-1 为蓝色,而 0 则为白色.

结果如何:

应该怎样*:

*(当然,这是通过“作弊”生成的 - 将 -1 设置为值以强制范围从 -1 到 1;我想设置此范围而不扭曲我的数据)

vmin=-1 和 vmax=1:

import numpy as np
import seaborn as sn
import matplotlib.pyplot as plt
  
data = np.random.uniform(low=-0.5, high=0.5, size=(5,5))

hm = sn.heatmap(data = data, cmap= 'vlag', annot = True, vmin=-1, vmax=1)
  
plt.show()

这是一个非正统的解决方案。您可以将数据“标准化”到范围 1 和 -1。尽管皮尔逊系数的理论范围是 [-1, 1];您的数据集中不存在强负相关。

因此,您可以创建另一个数据框,其中包含最大值为 1,最小值为 -1 的数据。然后您可以绘制此数据框以获得所需的效果。此过程提供的优势是该技术可以推广到几乎所有数据帧(尽管未验证)。

这是代码-

import pandas as pd 
import numpy as np 
from sklearn.preprocessing import MinMaxScaler

# Setting the initial scale of the data
scale_minimum = -1
scale_maximum = 1
scale_range = scale_maximum-scale_minimum

# Applying the scaling 
df_minimun, df_maximum = df.min(), df.max() # Getting the range of the current dataframe
df_range = df_maximum - df_minimun # The range of the data

df = (df - df_minimun)/(df_range) # Scaling between 0 and 1
df_scaled = df*(scale_range) + scale_minimum # Scaling between  1 and -1
 

希望这能解决您的问题。