仅在数据框的一部分上的热图?

Posted

技术标签:

【中文标题】仅在数据框的一部分上的热图?【英文标题】:Heatmap on only a part of the dataframe? 【发布时间】:2020-10-11 18:27:11 【问题描述】:

我正在尝试制作热图,但想从中省略第一行。这样我就有一个表格,其中第一行没有任何背景颜色。有点像paint example

但我什至不确定这是否可能。我尝试将 mulitIndex 作为列,以便第一行成为列名的一部分,但我希望行名“固定”仍然存在。有可能吗?

这是我目前正在使用的。如有任何意见,我将不胜感激!

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

SO = pd.DataFrame(np.random.randint(100,size=(4,5)))
SO.iloc[0] = [5, 10, 15, 10, 5]
SO.index = ['fixed','val1', 'sd2', 'val2']
SO.columns = ['Prod1', 'Prod2', 'Prod3', 'Prod4', 'Prod5']

sns.set(font_scale=1.5)
fig, ax = plt.subplots(figsize=(20,10))
ax = sns.heatmap(SO, annot=True, fmt="", cbar=False, cmap="RdYlGn", vmin=0, vmax=100)
plt.tick_params(axis='both', which='major', labelsize=19, labelbottom = False, bottom=False, top = False, labeltop=True)

【问题讨论】:

【参考方案1】:

Stupid Wolf 的遮罩想法很棒,但如果您正在寻找更简单的 您可以简单地将第一行合并到列名中并像往常一样绘制热图。

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

SO = pd.DataFrame(np.random.randint(100,size=(4,5)))
SO.iloc[0] = [5, 10, 15, 10, 5]
SO.index = ['fixed','val1', 'sd2', 'val2']
SO.columns = ['Prod1', 'Prod2', 'Prod3', 'Prod4', 'Prod5']
first_row = [str(i) for i in SO.iloc[0]]
labels = [i + '\n' + j for i,j in zip(SO.columns, first_row)]

sns.set(font_scale=1.5)
fig, ax = plt.subplots(figsize=(20,10))
ax = sns.heatmap(SO.iloc[1:], annot=True, fmt="", cbar=False, cmap="RdYlGn",
                 vmin=0, vmax=100)

ax.set_xticklabels(labels)
plt.tick_params(axis='both', which='major', labelsize=19,
                labelbottom = False, bottom=False, top = False, labeltop=True)

结果

【讨论】:

我很抱歉不清楚。我希望该行显示在图中,但我不希望将热图应用于第一行。这样您就可以看到数字和行名,但不会从热图中看到任何颜色。是否可以掩盖第一行以提供白色背景?【参考方案2】:

一个快速的解决方案是先绘制你的第一行,掩盖其余的行,然后用反向绘制:

这是掩码,第一行被掩码:

MASK = SO.apply(lambda x:np.arange(len(x))==0)

        Prod1   Prod2   Prod3   Prod4   Prod5
fixed   True    True    True    True    True
val1    False   False   False   False   False
sd2     False   False   False   False   False
val2    False   False   False   False   False

为第一行设置颜色:

COL = [(0.9690888119953864, 0.9664744329104191, 0.9649365628604383)]

然后我们绘制:

sns.set(font_scale=1.5)
fig, ax = plt.subplots(figsize=(20,10))
sns.heatmap(SO, annot=True, fmt="", cbar=False, mask=~MASK,cmap=COL,vmin=0, vmax=100,ax=ax)
sns.heatmap(SO, annot=True, fmt="", cbar=False, mask=MASK,cmap="RdYlGn",vmin=0, vmax=100,ax=ax)

plt.tick_params(axis='both', which='major', labelsize=19, 
                labelbottom = False, bottom=False, top = False, labeltop=True)

【讨论】:

以上是关于仅在数据框的一部分上的热图?的主要内容,如果未能解决你的问题,请参考以下文章

来自带有 NaN 的 pandas 数据框的 seaborn 热图

我们如何在热图中绘制来自多索引数据框的数据?

在数据框的其他列上使用多个日期列和条件注释热图

seaborn 热图的人工刻度标签

使用 ggplot2 在 r 中为热图准备数据框

sns.heatmap y 轴未被覆盖