只在数据框的一部分上绘制热图?

Heatmap on only a part of the dataframe?

我正在尝试绘制热图,但想省略其中的第一行。所以我有一个 table ,其中第一行没有任何背景颜色。有点像这样 paint example

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

这就是我目前正在使用的内容。我将不胜感激任何意见!

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)

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)

结果

一个快速的解决方案,是先绘制第一行,屏蔽其余行,然后用反函数绘制:

这是遮罩,第一行被遮罩:

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)