【问题标题】:Seaborn heatmap...white out the bottom row and right columnSeaborn 热图...白色的底行和右列
【发布时间】:2021-10-26 17:41:25
【问题描述】:

我通过sns.heatmap 在 Seaborn 有一张热图。我现在想将底行和右列变白,但保留值。

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

np.random.seed(2021)
df = pd.DataFrame(np.random.normal(0, 1, (6, 4))
df = df.rename(columns = {0:"a", 1:"b", 2:"c", 3:"d"})
df.index = [value for key, value in {0:"a", 1:"b", 2:"c", 3:"d", 4:"e", 5:"f"}.items()]
sns.heatmat(df, annot = True)
plt.show

我以为我必须在我的sns.heatmap 调用中包含一个mask 参数,但我没有成功给出正确的mask,并且掩码删除了注释。我还需要保留我的数据框d 的文本索引。如何在保留文本索引的同时使这些单元格变白?

【问题讨论】:

    标签: python plot graph seaborn heatmap


    【解决方案1】:

    这是一种方法:

    • 使用原始数据进行标注(annot=data
    • 使用原始数据创建"norm",用于着色
    • 创建颜色图的副本并将"over" color 指定为“白色”
    • 创建数据的副本,并用高于原始数据最大值的值填充右列和下一行(np.inf不能使用,因为那样不会放置注释);使用此副本进行着色; seaborn 会神奇地为注释使用适当的颜色
    • 要在热图中使用数据框的列和索引名称,只需使用sns.heatmap(..., xticklabels=df.columns, yticklabels=df.index)
    • 如果您没有安装最新的 seaborn 版本,您可以考虑使用matplotlib's standard colormaps 之一,或者通过matplotlib.colors.ListedColormap() 创建一个。也许cmap = ListedColormap(sns.color_palette('rocket', 256))

    在示例代码中:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    import numpy as np
    from copy import copy
    
    np.random.seed(2021)
    df = pd.DataFrame(np.random.normal(0, 1, (6, 4)), columns=[*"abcd"], index=[*"abcdef"])
    data = df.to_numpy()
    data_for_colors = data.copy()
    data_for_colors[:, -1] = data.max() + 10
    data_for_colors[-1, :] = data.max() + 10
    norm = plt.Normalize(data[:-1, :-1].min(), data[:-1, :-1].max())
    # cmap = sns.color_palette('rocket', as_cmap=True).copy()
    cmap = copy(plt.get_cmap('RdYlGn'))
    cmap.set_over('white')
    sns.set_style('white')
    sns.heatmap(data=data_for_colors, xticklabels=df.columns, yticklabels=df.index,
                annot=data, cmap=cmap, norm=norm)
    plt.show()
    

    【讨论】:

    • 这很聪明,但as_cmap 不适合我:color_palette() got an unexpected keyword argument。知道为什么吗? // 我将编辑原始问题以反映这一点,但我还需要 0-5 和 0-3 作为我数据框中的文本索引。有没有办法保留这些或将它们重新引入情节?
    • 也许是一个非常古老的 seaborn 版本?最新的是 0.11.2。您始终可以使用不同的标准 matplotlib 颜色图。或者从颜色列表中创建自己的颜色。
    • 我根据您的新要求更新了答案。
    • cmap = plt.get_cmap('RdYlGn').copy() 行出现错误:AttributeError: 'LinearSegmentedColormap' object has no attribute 'copy'。如果我去掉.copy(),我会得到一个类似于你显示的图的图,除了底行和右列为绿色,颜色条范围从 0(真的更像 -2)到 12。任何想法发生了什么事?
    • 您正在运行一个非常旧的 matplotlib 版本。请考虑升级。开发人员在改进和扩展库方面投入了大量精力。在旧版本中,可以使用from copy import copycmap = copy(plt.get_cmap('RdYlGn'))。它也可以直接与cmap = plt.get_cmap('RdYlGn') 一起使用,尽管不建议这样做,因为set_over 然后会更改全局颜色图。我更新了代码。
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2018-05-15
    • 2015-09-12
    • 2018-05-09
    • 2020-12-16
    相关资源
    最近更新 更多