改变seaborn热图中的某些方块

时间:2015-07-29 17:15:59

标签: python pandas matplotlib heatmap seaborn

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

我希望能够改变某些方块以表示统计显着性。我知道我可以掩盖不具有统计意义的方块,但我仍然希望保留该信息(而不是将值设置为零)。执行此操作的选项包括1)使某些正方形上的文本变粗,2)添加类似阴影的功能,以便某些正方形具有点画,或3)向某些正方形添加符号。

有关于此的任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:11)

一种方法是直接访问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')

enter image description here

我不是matplotlib / seaborn专家,但在我看来,要求热图中的单个细胞被孵化需要一些工作。简而言之,热图是Collection matplotlib的{​​{1}},并且集合的图案只能在整个集合中设置。要设置单个单元格的填充,您需要它们是不同的补丁,并且事情变得混乱。也许(希望)有些人比我更了解并且说这是错误的,而且这很容易 - 但如果我不得不猜测,我会说改变文字风格比设置舱口更容易。

答案 1 :(得分:10)

您可以绘制两次,将掩码应用于您不想第二次强调的单元格:

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