在 seaborn 热力图中更改特定方块

16

假设我有一个热力图,长这样(坐标轴被裁剪掉了):

Enter image description here

我想要修改某些方格以表示统计学显著性。我知道可以遮盖那些不具有统计学意义的方格,但我仍然希望保留该信息(而不是将其设置为零)。实现这一目标的选项包括:1)使某些方格上的文本加粗;2)添加类似于斜纹的功能,以便某些方格具有点刻线;或3)向某些方格添加符号。

我应该怎么做?

2个回答

20

一种方法是直接访问Text对象并更改其权重/样式。以下代码将获取一些示例数据,并尝试使每个等于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的专家,但我认为要求热力图中的单个单元格有斜纹必须要做一些工作。简而言之,热力图是CollectionmatplotlibPatches,一个集合的阴影只能在整个集合上设置。要设置单个单元格的阴影,您需要将它们作为不同的补丁,在这种情况下变得混乱。也许(希望)比我更有知识的人可以过来说这是错的,而且很容易 - 但如果我猜的话,改变文本样式将比设置阴影更容易。


这很有帮助,但如果我只想加粗每列底部方格中的文本怎么办? - Dance Party

19

你可以绘制两次图表,第二次应用掩码来标记不需要强调的单元格:

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"})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接