Seaborn定制范围热图

2024-09-27 22:35:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要根据以下要求构建定制的seaborn热图样图:

import pandas as pd
df = pd.DataFrame({"A": [0.3, 0.8, 1.3], 
                   "B": [4, 9, 15], 
                   "C": [650, 780, 900]})

df_info = pd.DataFrame({"id": ["min", "max"],
                   "A": [0.5, 0.9], 
                   "B": [6, 10], 
                   "C": [850, 880]})
df_info = df_info.set_index('id')

df


    A      B    C
0   0.3    4    650
1   0.8    9    780
2   1.3    15   900

df_信息

id      A      B    C
            
min     0.5    6    850
max     0.9    10   880

df内的每个值都应该在df_info中定义的范围内。
例如,如果列A的值在0.5和0.9范围内,则视为正常值。超出范围的值应使用自定义热图着色

特别是:

  • 在为每列定义的范围内的值应为彩色,纯黑色文本在白色背景单元格上
  • 该列小于min的值应着色,例如蓝色。最小值越低,蓝色的阴影越深
  • 该列大于max的值应着色,例如红色。它们的最大值越高,红色的阴影越深

Q:我不知道如何用标准的热图来实现这一点,我甚至不确定我能用热图图来实现这一点。有什么建议吗


Tags: infoiddataframedf定义seabornminmax
1条回答
网友
1楼 · 发布于 2024-09-27 22:35:04

据我所知,热图只能有一个数值比例。我建议对df数据框中的数据进行规范化,以便每列中的值如下所示:

  • 01之间,如果值在df_infomin{}之间
  • 低于0如果该值低于df_infomin
  • 高于1如果值高于df_infomax

要规范化数据帧,请使用:

for col in df:
    df[col] = (df[col] - df_info[col]['min']) / (df_info[col]['max'] - df_info[col]['min'])

最后,要创建颜色编码的热图,请使用:

import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap

vmin = df.min().min()
vmax = df.max().max()

colors = [[0, 'darkblue'],
          [- vmin / (vmax - vmin), 'white'],
          [(1 - vmin)/ (vmax - vmin), 'white'],
          [1, 'darkred']]

cmap = LinearSegmentedColormap.from_list('', colors)
sns.heatmap(df, cmap=cmap, vmin=vmin, vmax=vmax)

使用vminvmax的附加计算允许根据与最小值和最大值的差异动态缩放颜色贴图

使用您的输入数据框,我们得到以下热图: enter image description here

相关问题 更多 >

    热门问题