python - 如何在熊猫中使用 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
图二
解决方案
你需要正常化。通常,在 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)))]
推荐阅读
- scala - 在Scala中将元组转换为数组
- node.js - 即使配置了环境,也找不到节点模块
- postgresql - 尝试将包含 timestampz 数组的列拆分为 Postgres 中的分隔文本字符串时出现“函数不存在”错误
- python - 你能在 python 中复制 matlab 的旧伪随机数生成器吗?
- networking - Istio 可以在延迟更高、丢包的环境中工作吗?
- r - 使用 ABC_mcmc 函数时的错误:
- java - 为什么我的数据结构很慢(自定义数据结构)
- powerbi - 如何创建和发布结合多个 Power Bi 报告的移动应用程序?
- node.js - 标头已发送但不知道为什么
- python - 如何将 .wav 文件转换为 Pandas DataFrame 以将其提供给神经网络?