Вот мое решение с использованием numpy, pandas и seaborn:
import numpy as np
import pandas as pd
import seaborn
import matplotlib.pyplot as plt
# Create summaryTable
categories = np.array(['A','B','C','D','E'])
summaryTable = pd.DataFrame(index=categories, columns=np.arange(1,6))
for i in range(summaryTable.shape[0]):
for j in range(summaryTable.shape[1]):
df_ij = df.loc[df.Category == summaryTable.index[i]].loc[df.Score == summaryTable.columns[j]]
numOccurances = df_ij.shape[0]
numOccurancesCat = df.loc[df.Category == summaryTable.index[i]].shape[0]
summaryTable.at[categories[i], j+1] = numOccurances / numOccurancesCat * 100
# Create heatmap
summaryTable_np = summaryTable.to_numpy().astype(float)
xLabels = np.arange(1,6)
yLabels = categories
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
- ваш фрейм данных с ~ 300 строками и 2 столбцами, а summaryTable
- оценка пользователя. таблица процентов.
Вот пример тепловой карты:
Тепловая карта