仅在数据框的一部分上的热图?
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)
【讨论】:
以上是关于仅在数据框的一部分上的热图?的主要内容,如果未能解决你的问题,请参考以下文章