在 Seaborn FacetGrid 中访问当前列和行信息

Access current column and row information in Seaborn FacetGrid

我正在使用 python 中的 seaborn 包绘制热图的 FacetGrid。

现在我想根据此示例中的热图平铺值用阴影覆盖每个热图:

adding hatches to seaborn heatmap plot

我的函数,它定义了一个单元格是否被影线取决于 FacetGrid 的行和列信息

def draw_heatmap(*args, **kwargs):
    kwargs.pop('color')
    data = kwargs.pop('data')
    d = data.pivot(index=args[1], columns=args[0], values=args[2])
    d = d.sort_index(ascending=False)
    sns.heatmap(d, **kwargs)


d = np.array(
    np.meshgrid(np.arange(1, 6, 1),
                np.arange(6, 11, 1),
                np.arange(1, 6, 1),
                np.arange(6, 11, 1))).T.reshape(-1, 4)
d = np.c_[d, np.random.randint(1, 5, 625)]
df = pd.DataFrame(d, columns=['a', 'b', 'c', 'd', 'e'])
fg = sns.FacetGrid(df,
                   col='b',
                   row='a',
                   margin_titles=True,
                   height=5,
                   aspect=1)
fg = fg.map_dataframe(draw_heatmap,
                      'c',
                      'd',
                      'e',
                      cbar=False,
                      cmap='viridis',
                      annot=True,
                      fmt=".0f",
                      linewidths=.5)

现在,根据 'b', 'a''values' 的值,其中 'b', 'a' 是 FacetGrid 的行和列,'values' 是数据透视表的值在 draw_heatmap 函数中,我想应用遮罩。

# fgA and fgB are the input values coming from the FacetGrid
hatch = data.stack().to_frame().apply(lambda x: myFunc(fgA, fgB, x.name[0], x.name[1]), axis=1).unstack()
x = np.arange(len(data.columns)+1)
y = np.arange(len(data.index)+1)
zm = np.ma.masked_less(hatch.values, 5)
fig, ax = plt.subplots()
sns.heatmap(w, cmap='viridis', annot=True, fmt=".0f", linewidths=.5, ax=ax)
ax.pcolor(x, y, zm, hatch='//', alpha=0.)

如何在绘制单个热图时实现这一点并访问 FacetGrid 信息?

谢谢

您可以使用 axes 属性获取 FacetGrid 中的轴对象。它是 FacetGrid 中所有轴的数组。

fg.axes[b, a].pcolor(x, y, zm, hatch='//', alpha=0.)