如何在 pandas 中使用 seaborn 规范化数据着色?

How to normalize coloring of data with seaborn in pandas?

我得到的数据如图 1 所示,因为我的值为 0,其余的要大得多(值在 0 到 100 之间)。我想获取如图2所示的数据。如何解决这个问题?

这是最小的可重现代码。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import colors
index = pd.MultiIndex.from_product([[2019, 2020], [1, 2]],
                                   names=['year', 'visit'])
columns = pd.MultiIndex.from_product([['Group1', 'Group2', 'Group3'], ['value1', 'value2']],
                                     names=['subject', 'type'])

data = np.round(np.random.randn(4, 6), 1)
data[:, ::2] *= 20
data += 50

rdata = pd.DataFrame(data, index=index, columns=columns)

cc = sns.light_palette("red", as_cmap=True)
cc.set_bad('white')

def my_gradient(s, cmap):
    return [f'background-color: {colors.rgb2hex(x)}'
            for x in cmap(s.replace(np.inf, np.nan))]
       

styler = rdata.style
red = styler.apply(
        my_gradient,
        cmap=cc, 
        subset=rdata.columns.get_loc_level('value1', level=1)[0],
        axis=0)

styler

图片1

图2

您可以使用以下等式 (x-min)/(max-min) 对数据进行归一化。因此,要将其应用于您的数据框,您可以使用如下内容:

result = pd.DataFrame()
for i,row in df.iterrows():
    hold = {}
    for h in df:
        hold[h] = (row[h]-df[h].min())/(df[h].max()-df[h].min())
    result = result.append(hold,ignore_index=True)

你需要正常化。通常,在matplotlib中,一个norm is used, of which plt.Normalize()是最标准的

更新后的代码可能如下所示:

my_norm = plt.Normalize(0, 100)

def my_gradient(s, cmap):
    return [f'background-color: {colors.rgb2hex(x)}'
            for x in cmap(my_norm(s.replace(np.inf, np.nan)))]