public changeChartType()

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
                );
            });
        }