in packages/sanddance-explorer/src/explorer.tsx [542:593]
public changeChartType(chart: SandDance.specs.Chart) {
const partialInsight = copyPrefToNewState(this.prefs, chart, '*', '*');
const insight: Partial<HistoricInsight> = { chart, ...partialInsight };
const columns = SandDance.VegaDeckGl.util.deepMerge({}, partialInsight.columns, this.state.columns);
const { signalValues } = this.viewer.getInsight();
insight.signalValues = { ...this.state.signalValues, ...signalValues };
insight.columns = { ...columns };
insight.totalStyle = this.state.totalStyle;
let errors: string[];
//special case mappings when switching chart type
if (this.state.chart === 'scatterplot' && (chart === 'barchart' || chart === 'barchartV')) {
insight.columns = { ...columns, sort: columns.y };
} else if (this.state.chart === 'scatterplot' && chart === 'barchartH') {
insight.columns = { ...columns, sort: columns.x };
} else if (chart === 'treemap') {
insight.view = '2d';
if (!columns.size) {
//make sure size exists and is numeric
let sizeColumn: SandDance.types.Column;
//first check prefs
if (partialInsight && partialInsight.columns && partialInsight.columns.size) {
const prefSizeColumn = this.state.dataContent.columns.filter(c => c.name === partialInsight.columns.size)[0];
if (prefSizeColumn && prefSizeColumn.quantitative) {
sizeColumn = prefSizeColumn;
}
}
if (!sizeColumn) {
sizeColumn = getTreemapColumn(this.state.dataContent.columns);
}
if (!sizeColumn) {
//error - no numeric columns
errors = [strings.errorColumnMustBeNumeric];
} else {
insight.columns = { ...columns, size: sizeColumn.name };
}
}
} else if (chart === 'stacks') {
insight.view = '3d';
}
ensureColumnsExist(insight.columns, this.state.dataContent.columns, this.state.transform);
errors = ensureColumnsPopulated(chart, insight.totalStyle, insight.columns, this.state.dataContent.columns);
this.calculate(() => {
this.changeInsight(
insight,
{ label: strings.labelHistoryChangeChartType(chartLabel(chart)) },
errors ? { errors } : null
);
});
}