具有二进制颜色编码和原始输入注释的 seaborn 热图

Posted

技术标签:

【中文标题】具有二进制颜色编码和原始输入注释的 seaborn 热图【英文标题】:seaborn heatmap with binary color coding and annotation of raw inputs 【发布时间】:2021-09-30 14:30:45 【问题描述】:

我需要将数据框列中的值显示为二进制颜色图,具体取决于它们是高于还是低于阈值。我还需要显示原始数字。

我正在使用 seaborn 热图。

样本数据帧

Month  Raw_value
Jan     3.72
feb     2.51
Mar     1.82
...

我已将该列转换为二进制,然后仅保留索引和二进制列并从数据框中删除其他列,然后绘制为二进制。但这无助于显示实际数字(见图)。

kpi2['status'] = np.where(kpi2['raw_value'] > thres, 1,0) # convert to binary
kpi2 = kpi2.set_index('month')
kpi2.drop(['raw_value'], axis=1, inplace=True) # drop other columns
kpi_transposed = kpi2.transpose() # convert column to row for plotting horizontally
rdgn = sns.diverging_palette(h_neg=130, h_pos=10, s=99, l=55, sep=3, as_cmap=True)
sns.heatmap(kpi_transposed, linecolor='white', linewidths=1.3,vmin=0, vmax=1, cmap=rdgn, cbar=False)
plt.show()

但如果我使用原始数据列,我不确定如何将其着色为二进制。

有什么想法吗?

【问题讨论】:

【参考方案1】:

而不是删除raw_valuetranspose 两列,然后在调用热图时使用loc 选择status 作为数据并将raw_value 传递给annotsns.heatmap

import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt

kpi2 = pd.DataFrame('month': ['Jan', 'Feb', 'Mar'],
                     'raw_value': [3.72, 2.51, 1.82])

thres = 3
kpi2['status'] = np.where(kpi2['raw_value'] > thres, 1, 0)
kpi2 = kpi2.set_index('month')

kpi_transposed = kpi2.transpose()

rdgn = sns.diverging_palette(h_neg=130, h_pos=10, s=99, l=55, sep=3,
                             as_cmap=True)

ax = sns.heatmap(
    kpi_transposed.loc[['status']],  # Select Status Column
    annot=kpi_transposed.loc[['raw_value']],  # Select raw_values for annot
    fmt='.2f',  # Specify Annotation Format
    linecolor='white', linewidths=1.3, vmin=0, vmax=1,
    cmap=rdgn, cbar=False
)

# Add Percent Sign
for t in ax.texts:
    t.set_text(t.get_text() + "%")
plt.show()

【讨论】:

以上是关于具有二进制颜色编码和原始输入注释的 seaborn 热图的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn 调色板 - 防止颜色回收

如何在seaborn barplot中使用NaN值作为具有定义颜色的色调

在相同的绘图空间上绘制两个 Seaborn sns.kdeplot 图形,但每个图形都有一个具有相同范围的不同颜色条

使用 matplotlib 和 seaborn 在多元时间序列图中突出显示时间间隔

seaborn distplot / displot 具有多个分布

基于 DataFrame 列名的颜色 seaborn 箱线图