function generateGroupHeatMapByStateAllStrategies(data) {
const predicates = [
[learningViaAssignments, 'Assignments'],
[learningViaEducationalRadio, 'Radio'],
[learningViaEducationalTV, 'TV'],
[learningViaMobileApps, 'Mobile apps'],
[learningViaOwnStudy, 'Study'],
[taughtByParent, 'Parent'],
[taughtByTutor, 'Tutor']
]
function getFlattenedDataForStrategy(predicate, name) {
const filtered = data.filter(predicate);
const groups = d3.group(filtered, d => d.round);
const flattenedData = Array.from(groups).map(([round, valuesForRound]) => {
const dataByState = Array.from(d3.group(valuesForRound, d => d.state)).map(([state, valuesForState]) => {
return {
state,
zone: valuesForState[0].zone,
values: valuesForRound,
round,
size: valuesForState.length,
proportion: valuesForState.length * 100 / valuesForRound.length,
strategy: `${name}`
}
});
return dataByState;
}).flat();
return flattenedData;
}
const flattenedData = predicates.map(([predicate, name]) => getFlattenedDataForStrategy(predicate, name)).flat();
const weightedStates = getStateSortOrderByWeights(flattenedData);
const weightedStrategies = getStrategySortOrderByWeights(flattenedData)
return vl.markRect({tooltip: {content: 'data'}})
.data(flattenedData)
.encode(
vl.x().fieldN('strategy').axis({title: ''}).sort(weightedStrategies),
vl.y().fieldN('state').axis({title: ''}).sort(weightedStates),
vl.column('round').title(''),
vl.color().fieldQ(heatmapColorField).scale({scheme: "yelloworangered"})
)
}