@@ -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+
18231890const 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