首页 > 解决方案 > 如何在熊猫中使用 seaborn 对数据着色进行规范化?

问题描述

我得到了如图 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

在此处输入图像描述

图二

在此处输入图像描述

标签: pythonpandasseabornpandas-styles

解决方案


你需要正常化。通常,在 matplotlib 中,使用一个规范,其中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)))]

推荐阅读