Доступ к текущей информации о столбцах и строках в Seaborn FacetGrid

Я строю FacetGrid тепловых карт с пакетом seaborn в python.

Теперь я хочу наложить на каждую тепловую карту штриховку в зависимости от значения плитки тепловой карты, следуя этому примеру:

добавление штриховки на график тепловой карты моря

Моя функция, которая определяет, заштрихована ячейка или нет, зависит от информации о строке и столбце 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 при построении отдельных тепловых карт?

Спасибо


person insofern    schedule 28.02.2020    source источник


Ответы (1)


Вы можете получить объект осей в FacetGrid, используя атрибут axes. Это массив всех осей в вашем FacetGrid.

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