【问题标题】:Heatmap on only a part of the dataframe?仅在数据框的一部分上的热图?
【发布时间】:2023-03-22 13:58:01
【问题描述】:

我正在尝试制作热图,但想从中省略第一行。这样我就有一个表格,其中第一行没有任何背景颜色。有点像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)

【问题讨论】:

    标签: python pandas seaborn heatmap


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      相关资源
      最近更新 更多