【问题标题】:Masking annotations in seaborn heatmap在 seaborn 热图中屏蔽注释
【发布时间】:2018-08-25 13:21:06
【问题描述】:

我想制作一个仅在特定单元格中具有注释的热图。我虽然这样做的一种方法是在所有单元格中制作一个带有注释的热图,然后覆盖另一个没有注释但在我希望原始注释可见的区域中被掩盖的热图:

import numpy as np
import seaborn as sns

par_corr_p = np.array([[1, 2], [3, 4]])
masked_array = np.ma.array(par_corr_p, mask=par_corr_p<2)

fig, ax = plt.subplots()
sns.heatmap(par_corr_p, ax=ax, cmap ='RdBu_r', annot = par_corr_p, center=0, vmin=-5, vmax=5)
sns.heatmap(par_corr_p, mask = masked_array.mask, ax=ax,  cmap ='RdBu_r', center=0, vmin=-5, vmax=5)

但是,这不起作用 - 第二个热图没有覆盖第一个:

请指教

【问题讨论】:

  • 我会手动使用plt.text 将注释放在任何需要的地方

标签: python-3.x matplotlib seaborn


【解决方案1】:

我尝试了一些方法,包括在 annot 数组中使用 numpy.nan 或 ""。不幸的是,它们不起作用。

这可能是最简单的方法。它涉及抓取轴的texts,它应该只是annot 中的标签,sns.heatmap 放在那里。

import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns

par_corr_p = np.array([[1, 2], [3, 4]])

data = par_corr_p
show_annot_array = data >= 2

fig, ax = plt.subplots()
sns.heatmap(
    ax=ax,
    data=data,
    annot=data,
    cmap ='RdBu_r', center=0, vmin=-5, vmax=5
)
for text, show_annot in zip(ax.texts, (element for row in show_annot_array for element in row)):
    text.set_visible(show_annot)

plt.show()

【讨论】:

    猜你喜欢
    • 2016-01-14
    • 2020-04-19
    • 1970-01-01
    • 2022-07-09
    • 2021-12-23
    • 2021-12-05
    • 2020-11-28
    • 2021-03-14
    相关资源
    最近更新 更多