具有二进制颜色编码和原始输入注释的 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_value
。 transpose
两列,然后在调用热图时使用loc
选择status
作为数据并将raw_value
传递给annot
的sns.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 barplot中使用NaN值作为具有定义颜色的色调
在相同的绘图空间上绘制两个 Seaborn sns.kdeplot 图形,但每个图形都有一个具有相同范围的不同颜色条
使用 matplotlib 和 seaborn 在多元时间序列图中突出显示时间间隔