Я строю 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 при построении одиночных тепловых карт?
Спасибо