更改 seaborn 热图中的某些方块

change certain squares in a seaborn heatmap

假设我有一个看起来像这样的热图(轴被修剪):

我希望能够改变某些方块来表示统计显着性。我知道我可以屏蔽掉统计上不显着的方块,但我仍然想保留该信息(而不是将值设置为零)。这样做的选项包括 1) 将某些方块上的文本设为粗体,2) 添加类似阴影的功能,以便某些方块具有点画,或 3) 向某些方块添加符号。

对此有什么想法吗?谢谢!

一种方法是直接访问 Text 对象并更改它们的 weight/style。下面的代码将获取一些示例数据并尝试使每个等于 118 的条目脱颖而出:

flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
ax = sns.heatmap(flights, annot=True, fmt="d")

for text in ax.texts:
    text.set_size(14)
    if text.get_text() == '118':
        text.set_size(18)
        text.set_weight('bold')
        text.set_style('italic')

我不是 matplotlib/seaborn 专家,但在我看来,要求对热图中的单个单元格进行孵化需要一些工作。总之,heatmap是Collection of matplotlib Patches,一个collection的hatching只能在collection整体上设置。要设置单个单元格的舱口,您需要它们是不同的补丁,事情变得一团糟。也许(希望)比我更有见识的人会说这是错误的,而且这很容易——但如果我不得不猜测,我会说更改文本样式比设置阴影线更容易。

您可以绘制两次,对您不想第二次强调的单元格应用蒙版:

import numpy as np
import seaborn as sns
x = np.random.randn(10, 10)
sns.heatmap(x, annot=True)
sns.heatmap(x, mask=x < 1, cbar=False,
            annot=True, annot_kws={"weight": "bold"})