in src/TornadoChart.ts [788:826]
private calculateDataPoints(dataPoints: TornadoChartPoint[]): void {
let categoriesLength: number = this.dataView.categories.length;
let settings: TornadoChartSettings = this.dataView.settings;
let heightColumn: number = Math.max(this.heightColumn, 0);
let py: number = heightColumn / 2;
let pyHighlighted: number = heightColumn * TornadoChart.HighlightedShapeFactor / 2;
let maxSeries: boolean = this.dataView.series.length === TornadoChart.MaxSeries;
for (let i: number = 0; i < dataPoints.length; i++) {
let dataPoint: TornadoChartPoint = dataPoints[i];
let shiftToMiddle: boolean = i < categoriesLength && maxSeries;
let shiftToRight: boolean = i > categoriesLength - 1;
let widthOfColumn: number = this.getColumnWidth(dataPoint.value, dataPoint.minValue, dataPoint.maxValue, this.columnWidth);
let dx: number = (this.columnWidth - widthOfColumn) * Number(shiftToMiddle) + this.columnWidth * Number(shiftToRight)/* - scrollBarWidth*/;
dx = Math.max(dx, 0);
let highlighted: boolean = this.dataView.hasHighlights && dataPoint.highlight;
let highlightOffset: number = highlighted ? heightColumn * (1 - TornadoChart.HighlightedShapeFactor) / 2 : 0;
let dy: number = (heightColumn + this.columnPadding) * (i % categoriesLength) + highlightOffset;
let label: LabelData = this.getLabelData(
dataPoint.value,
dx,
widthOfColumn,
shiftToMiddle,
dataPoint.formatString,
settings);
dataPoint.dx = dx;
dataPoint.dy = dy;
dataPoint.px = widthOfColumn / 2;
dataPoint.py = highlighted ? pyHighlighted : py;
dataPoint.angle = shiftToMiddle ? TornadoChart.MaxAngle : TornadoChart.MinAngle;
dataPoint.width = widthOfColumn;
dataPoint.height = highlighted ? heightColumn * TornadoChart.HighlightedShapeFactor : heightColumn;
dataPoint.label = label;
}
}