Skip to content

Commit 9be9176

Browse files
committed
chore(VueUiXy): standardise vertical geometry computation for all series types
1 parent 7b318e2 commit 9be9176

1 file changed

Lines changed: 125 additions & 66 deletions

File tree

src/components/vue-ui-xy.vue

Lines changed: 125 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,6 +1820,73 @@ function isPlotAlone(plotSeries, index) {
18201820
/ DATAPOINTS COMPUTING /
18211821
/******************************************************************************************/
18221822

1823+
function getSerieVerticalGeometry({
1824+
datapoint,
1825+
totalSeries,
1826+
gap,
1827+
usableHeight,
1828+
autoScaleValueMin,
1829+
autoScaleValueMax,
1830+
individualExtremes,
1831+
forceExactScale = false
1832+
}) {
1833+
const scaleSteps = datapoint.scaleSteps || FINAL_CONFIG.value.chart.grid.labels.yAxis.commonScaleSteps;
1834+
const corrector = 1.0000001;
1835+
1836+
const scaleBuilder = forceExactScale || !FINAL_CONFIG.value.chart.grid.labels.yAxis.useNiceScale
1837+
? calculateNiceScaleWithExactExtremes
1838+
: calculateNiceScale;
1839+
1840+
const safeIndividualMax = individualExtremes.max === individualExtremes.min
1841+
? individualExtremes.max * corrector
1842+
: individualExtremes.max;
1843+
1844+
const safeAutoScaleMax = autoScaleValueMax === autoScaleValueMin
1845+
? autoScaleValueMax * corrector
1846+
: autoScaleValueMax;
1847+
1848+
const individualScale = scaleBuilder(
1849+
individualExtremes.min,
1850+
safeIndividualMax,
1851+
scaleSteps
1852+
);
1853+
1854+
const autoScaleSteps = scaleBuilder(
1855+
autoScaleValueMin,
1856+
safeAutoScaleMax,
1857+
scaleSteps
1858+
);
1859+
1860+
const individualZero = individualScale.min >= 0 ? 0 : Math.abs(individualScale.min);
1861+
const autoScaleZero = 0;
1862+
1863+
const individualMax = individualScale.max + Math.abs(individualZero);
1864+
const autoScaleMax = autoScaleSteps.max + Math.abs(autoScaleZero);
1865+
1866+
const origIdx = datapoint.stackIndex;
1867+
const flippedIdx = totalSeries - 1 - origIdx;
1868+
const flippedLowerRatio = mutableConfig.value.isStacked ? 1 - datapoint.cumulatedStackRatio : 0;
1869+
const yOffset = mutableConfig.value.isStacked ? usableHeight * flippedLowerRatio + gap * flippedIdx : 0;
1870+
const individualHeight = mutableConfig.value.isStacked ? usableHeight * datapoint.stackRatio : drawingArea.value.height;
1871+
1872+
const zeroPosition = drawingArea.value?.bottom - yOffset - ((individualHeight) * individualZero / individualMax);
1873+
const autoScaleZeroPosition = drawingArea.value?.bottom - yOffset - (individualHeight * autoScaleZero / autoScaleMax);
1874+
1875+
return {
1876+
scaleSteps,
1877+
individualScale,
1878+
autoScaleSteps,
1879+
individualZero,
1880+
autoScaleZero,
1881+
individualMax,
1882+
autoScaleMax,
1883+
yOffset,
1884+
individualHeight,
1885+
zeroPosition,
1886+
autoScaleZeroPosition
1887+
};
1888+
}
1889+
18231890
const barSet = computed(() => {
18241891
const stackSeries = activeSeriesWithStackRatios.value
18251892
.filter(s => ['bar', 'line', 'plot'].includes(s.type));
@@ -1847,28 +1914,26 @@ const barSet = computed(() => {
18471914
max: datapoint.scaleMax || Math.max(...datapoint.absoluteValues) || 1,
18481915
min: datapoint.scaleMin || Math.min(...datapoint.absoluteValues.filter(v => ![undefined, null].includes(v))) > 0 ? 0 : Math.min(...datapoint.absoluteValues.filter(v => ![null, undefined].includes(v)))
18491916
};
1850-
const scaleSteps = datapoint.scaleSteps || FINAL_CONFIG.value.chart.grid.labels.yAxis.commonScaleSteps;
1851-
1852-
const corrector = 1.0000001;
1853-
1854-
const individualScale = FINAL_CONFIG.value.chart.grid.labels.yAxis.useNiceScale ? calculateNiceScale(individualExtremes.min, individualExtremes.max === individualExtremes.min ? individualExtremes.max * corrector : individualExtremes.max, scaleSteps) : calculateNiceScaleWithExactExtremes(individualExtremes.min, individualExtremes.max === individualExtremes.min ? individualExtremes.max * corrector : individualExtremes.max, scaleSteps);
1855-
1856-
const autoScaleSteps = FINAL_CONFIG.value.chart.grid.labels.yAxis.useNiceScale ? calculateNiceScale(autoScale.valueMin, autoScale.valueMax === autoScale.valueMin ? autoScale.valueMax * corrector : autoScale.valueMax, scaleSteps) : calculateNiceScaleWithExactExtremes(autoScale.valueMin, autoScale.valueMax === autoScale.valueMin ? autoScale.valueMax * corrector : autoScale.valueMax, scaleSteps);
1857-
1858-
const individualZero = individualScale.min >= 0 ? 0 : Math.abs(individualScale.min);
1859-
const autoScaleZero = 0;
18601917

1861-
const individualMax = individualScale.max + individualZero;
1862-
const autoScaleMax = autoScaleSteps.max + Math.abs(autoScaleZero);
1863-
1864-
const origIdx = datapoint.stackIndex;
1865-
const flippedIdx = totalSeries - 1 - origIdx;
1866-
const flippedLowerRatio = stacked ? 1 - datapoint.cumulatedStackRatio : 0;
1867-
const yOffset = stacked ? usableHeight * flippedLowerRatio + gap * flippedIdx : 0;
1868-
const individualHeight = stacked ? usableHeight * datapoint.stackRatio : drawingArea.value.height;
1869-
1870-
const zeroPosition = drawingArea.value?.bottom - yOffset - ((individualHeight) * individualZero / individualMax);
1871-
const autoScaleZeroPosition = drawingArea.value?.bottom - yOffset - (individualHeight * autoScaleZero / autoScaleMax);
1918+
const {
1919+
individualScale,
1920+
autoScaleSteps,
1921+
individualZero,
1922+
individualMax,
1923+
autoScaleMax,
1924+
yOffset,
1925+
individualHeight,
1926+
zeroPosition,
1927+
autoScaleZeroPosition
1928+
} = getSerieVerticalGeometry({
1929+
datapoint,
1930+
totalSeries,
1931+
gap,
1932+
usableHeight,
1933+
autoScaleValueMin: autoScale.valueMin,
1934+
autoScaleValueMax: autoScale.valueMax,
1935+
individualExtremes
1936+
});
18721937

18731938
const barLen = absoluteDataset.value.filter(ds => ds.type === 'bar').filter(s => !segregatedSeries.value.includes(s.id)).length;
18741939

@@ -1998,29 +2063,25 @@ const lineSet = computed(() => {
19982063
min: datapoint.scaleMin || (Math.min(...datapoint.absoluteValues) > 0 ? 0 : Math.min(...datapoint.absoluteValues))
19992064
};
20002065

2001-
const scaleSteps = datapoint.scaleSteps || FINAL_CONFIG.value.chart.grid.labels.yAxis.commonScaleSteps
2002-
2003-
const corrector = 1.0000001;
2004-
2005-
const individualScale = FINAL_CONFIG.value.chart.grid.labels.yAxis.useNiceScale ? calculateNiceScale(individualExtremes.min, individualExtremes.max === individualExtremes.min ? individualExtremes.max * corrector : individualExtremes.max, scaleSteps) : calculateNiceScaleWithExactExtremes(individualExtremes.min, individualExtremes.max === individualExtremes.min ? individualExtremes.max * corrector : individualExtremes.max, scaleSteps);
2006-
2007-
const autoScaleSteps = FINAL_CONFIG.value.chart.grid.labels.yAxis.useNiceScale ? calculateNiceScale(autoScale.valueMin, autoScale.valueMax === autoScale.valueMin ? autoScale.valueMax * corrector : autoScale.valueMax, scaleSteps) : calculateNiceScaleWithExactExtremes(autoScale.valueMin, autoScale.valueMax === autoScale.valueMin ? autoScale.valueMax * corrector : autoScale.valueMax, scaleSteps);
2008-
2009-
const individualZero = (individualScale.min >= 0 ? 0 : Math.abs(individualScale.min));
2010-
const autoScaleZero = 0;
2011-
2012-
const individualMax = individualScale.max + Math.abs(individualZero);
2013-
const autoScaleMax = autoScaleSteps.max + Math.abs(autoScaleZero);
2014-
2015-
const origIdx = datapoint.stackIndex;
2016-
const flippedIdx = totalSeries - 1 - origIdx;
2017-
const flippedLowerRatio = stacked ? 1 - datapoint.cumulatedStackRatio : 0;
2018-
const yOffset = stacked ? usableHeight * flippedLowerRatio + gap * flippedIdx : 0;
2019-
const individualHeight = stacked ? usableHeight * datapoint.stackRatio : drawingArea.value.height;
2020-
2021-
const zeroPosition = drawingArea.value?.bottom - yOffset - ((individualHeight) * individualZero / individualMax);
2022-
2023-
const autoScaleZeroPosition = drawingArea.value?.bottom - yOffset - (individualHeight * autoScaleZero / autoScaleMax);
2066+
const {
2067+
individualScale,
2068+
autoScaleSteps,
2069+
individualZero,
2070+
individualMax,
2071+
autoScaleMax,
2072+
yOffset,
2073+
individualHeight,
2074+
zeroPosition,
2075+
autoScaleZeroPosition
2076+
} = getSerieVerticalGeometry({
2077+
datapoint,
2078+
totalSeries,
2079+
gap,
2080+
usableHeight,
2081+
autoScaleValueMin: autoScale.valueMin,
2082+
autoScaleValueMax: autoScale.valueMax,
2083+
individualExtremes
2084+
});
20242085

20252086
const plots = datapoint.series.map((plot, j) => {
20262087
const yRatio = mutableConfig.value.useIndividualScale
@@ -2208,28 +2269,26 @@ const plotSet = computed(() => {
22082269
min: datapoint.scaleMin || Math.min(...datapoint.absoluteValues) > 0 ? 0 : Math.min(...datapoint.absoluteValues)
22092270
};
22102271

2211-
const scaleSteps = datapoint.scaleSteps || FINAL_CONFIG.value.chart.grid.labels.yAxis.commonScaleSteps;
2212-
2213-
const corrector = 1.0000001;
2214-
2215-
const individualScale = calculateNiceScaleWithExactExtremes(individualExtremes.min, individualExtremes.max === individualExtremes.min ? individualExtremes.max * corrector : individualExtremes.max, scaleSteps);
2216-
2217-
const autoScaleSteps = calculateNiceScaleWithExactExtremes(autoScale.valueMin, autoScale.valueMax === autoScale.valueMin ? autoScale.valueMax * corrector : autoScale.valueMax, scaleSteps);
2218-
2219-
const individualZero = individualScale.min >= 0 ? 0 : Math.abs(individualScale.min);
2220-
const autoScaleZero = 0;
2221-
2222-
const individualMax = individualScale.max + individualZero;
2223-
const autoScaleMax = autoScaleSteps.max + Math.abs(autoScaleZero);
2224-
2225-
const origIdx = datapoint.stackIndex;
2226-
const flippedIdx = totalSeries - 1 - origIdx;
2227-
const flippedLowerRatio = stacked ? 1 - datapoint.cumulatedStackRatio : 0;
2228-
const yOffset = stacked ? usableHeight * flippedLowerRatio + gap * flippedIdx : 0;
2229-
const individualHeight = stacked ? usableHeight * datapoint.stackRatio : drawingArea.value.height;
2230-
2231-
const zeroPosition = drawingArea.value?.bottom - yOffset - ((individualHeight) * individualZero / individualMax);
2232-
const autoScaleZeroPosition = drawingArea.value?.bottom - yOffset - (individualHeight * autoScaleZero / autoScaleMax);
2272+
const {
2273+
individualScale,
2274+
autoScaleSteps,
2275+
individualZero,
2276+
individualMax,
2277+
autoScaleMax,
2278+
yOffset,
2279+
individualHeight,
2280+
zeroPosition,
2281+
autoScaleZeroPosition
2282+
} = getSerieVerticalGeometry({
2283+
datapoint,
2284+
totalSeries,
2285+
gap,
2286+
usableHeight,
2287+
autoScaleValueMin: autoScale.valueMin,
2288+
autoScaleValueMax: autoScale.valueMax,
2289+
individualExtremes,
2290+
forceExactScale: true
2291+
});
22332292

22342293
const plots = datapoint.series.map((plot, j) => {
22352294
const yRatio = mutableConfig.value.useIndividualScale ? ((datapoint.absoluteValues[j] + Math.abs(individualZero)) / individualMax) : ratioToMax(plot)

0 commit comments

Comments
 (0)