Вот мое решение с использованием pandas, numpy и seaborn:
import pandas as pd
import numpy as np
import seaborn
import matplotlib.pyplot as plt
# Create summaryTable
ageGroups = np.array(["18-25","26-40"])
categories = np.array(['A','B','C','D','E'])
summaryTable = pd.DataFrame(index=ageGroups, columns=categories)
ageGroupsInts = np.array([18,25,26,40])
counter = 0
for i in range(0, ageGroupsInts.shape[0], 2):
inAgeGroupI = df.loc[df.Age >= ageGroupsInts[i]].loc[df.Age <= ageGroupsInts[i+1]]
numEntries = inAgeGroupI.shape[0]
for j in range(categories.shape[0]):
df_catJ = inAgeGroupI.loc[inAgeGroupI.Category == categories[j]]
summaryTable.at[ageGroups[counter], categories[j]] = df_catJ.shape[0] / numEntries * 100
counter += 1
# Create heatmap
summaryTable_np = summaryTable.to_numpy().astype(float)
xLabels = categories
yLabels = ageGroups
seaborn.heatmap(summaryTable_np, annot=True, linewidths=.5, square=True,
xticklabels=xLabels, yticklabels=yLabels,
vmin=np.amin(summaryTable_np), vmax=np.amax(summaryTable_np), cmap='Reds')
plt.yticks(rotation=0)
, где df
- это кадр данных размера (nRows, 2) со столбцами «Возраст» и «Категория». и summaryTable
- это фрейм данных с возрастными группами в виде строк и категориями AE в виде столбцов.
Вот пример выходной тепловой карты:
Тепловая карта