From f1ed2ee932621d8d7d3a5ea81b9bd30992294e38 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Thu, 8 Oct 2020 00:37:10 +0300 Subject: [PATCH] beginAtZero support for logarithmic (#7862) --- src/scales/scale.logarithmic.js | 7 +++++++ .../stacking/logarithmic-strings.png | Bin 12961 -> 13897 bytes .../controller.bar/stacking/logarithmic.png | Bin 12961 -> 13897 bytes test/specs/scale.logarithmic.tests.js | 17 +++++++++-------- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/scales/scale.logarithmic.js b/src/scales/scale.logarithmic.js index 98942f9b6..57bbafa78 100644 --- a/src/scales/scale.logarithmic.js +++ b/src/scales/scale.logarithmic.js @@ -64,6 +64,7 @@ export default class LogarithmicScale extends Scale { parse(raw, index) { const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]); if (value === 0) { + this._zero = true; return undefined; } return isFinite(value) && value > 0 ? value : NaN; @@ -101,6 +102,11 @@ export default class LogarithmicScale extends Scale { if (max <= 0) { max = Math.pow(10, Math.floor(log10(min)) + 1); } + // if data has `0` in it or `beginAtZero` is true, and min (non zero) value is at bottom + // of scale, lower the min bound by one exp. + if (!me._userMin && me._zero && min === Math.pow(10, Math.floor(log10(me.min)))) { + min = Math.pow(10, Math.floor(log10(min)) - 1); + } me.min = min; me.max = max; } @@ -153,6 +159,7 @@ export default class LogarithmicScale extends Scale { me._startValue = log10(start); me._valueRange = log10(me.max) - log10(start); + me._zero = me.options.beginAtZero; } getPixelForValue(value) { diff --git a/test/fixtures/controller.bar/stacking/logarithmic-strings.png b/test/fixtures/controller.bar/stacking/logarithmic-strings.png index 52dae9b93d79f8ea5f602f22caa253e1e407a583..377b6c59ff1eba426ce114ee4dac236f97362509 100644 GIT binary patch literal 13897 zc-rln=~Giz7>D1Rg@A|wqA7|JL?tRvv2H;zms%9Dn5ejbSOQhS9Vjl0L~=!Cu~wx} ziin0z6{=E2K|x2%tx%VuURLs)LTVKg4vT|Wt_C4XL28Uj zX`8BkMN6}TQa{u`bK{@z#RefCP!ys(&evtRL-b5?REI+`x$sAZ=M!h97qO2ki zQ6=)ZKD}!1?<`TMRWI$c=s%-2o(gogg3ew9N6M)4#pvI9=tUv#Q)nnWm{q#t#^A_%D}*l=HK%t-fjSdBD%pL+m49QLwq! z&0vj!l6~4lAsp#G=VTyK-hK4&meDNd5ak!prgEemdTMHf)O_*7U<0u!Bl)QX32GYA zXQ_fPQ(cEIxIGVd*RgfYZ|8>3qtM!9xVX$bXpo3RDx*<}J&P~|7I(-|< z|Ggly0%A7Ex6^z&yj1U>gifeLn@iXTWQo1+uR?dgX7AhlpczFKJ>nRmV0Tuph8y!j zJR%+$KK+6cQKhopSS`w*R3~QZ5J6GHn6Ci z`Bw=NuwDo`i>q4L8*2GQ1dX!``fx6melf>K1ky zoSs{gnT_(-xu}QJh#)aNHQ^FBrZIGeOBxh*6zw9>ovQrGhTSAhk~qSm!Dc%%1n%0) z7ohxE6QrXlM9|LBzlwIGPv^#YnPFyaKvx<9-<*lXVR2X-7Kg=QaabG{hs9xWSR59I z#bI$+92SSgVR2X-7Kg=sV&ba7+_6WkFq=hca_M?QPKN1jBdM`iM5IdY(Z=%()f*CC z^C+3wIArerFl5f?N#1veR%?_}CQR0E6~Fahwkw$=LdTZm=b70Cc5&=SdG@N7F3sW8 z9R=3Typ`-&w72Kg27fd0C|C$f%5Fq6t6Gz5Ka!@0I++&~oY8;?1bfGNx;)0m;e*ygbQvUz| literal 12961 zc-rmSdrVtZ90%}oFD->KtiTv^!ivyPWKIS`1SGxPM4@JBi7;S3Xcy+HMg>8%KxwaJ zJgQ`FG!Zc6vB-ksAGiNb{Y&FN{&8+{a`Vgg zmy>($=bYsJaaF0pWN+p^CIG-&kdpK|065qg9`5k=NOo@vfM6g6eUiId14;*cB#(ZWe#%9IqWP(kMm=k$uA&%Fx!@0u8mEzsiZ?< zF#59_d5-S2xz6JKlu=Hbq6Sl4gs+i`w8bj0Lzg9(3pW`?*`Z#07UtOU>Q1I-A60%n z9Naq3kxo)>CM@Nlpk#4Q#9dpz>d{BtDl%_d1IUMQ_77}cY!ZIuF8G3mRqAHhg_T-qUcMd-j9s=dvy}DOaL;BRD2kK!rK- z|GUth>jbrBUysx&U571BC-3uVrQNxmOKmx&I(3jD1J0GZMqH+t{M<$&+VBJ1Ao9mw zB1E(%)&xSaz1f2j|pD=v<e(b4;8b=`IAAuvYt?lCj2D?_c7y7Lbc_dDvzK%3dxir`71w(OW`0wpSD1Wp*obNc zOL;=tWrf-JQ|9eV(6&B2^eotGxQNSvu-|y2!!H%w_Yv(g!7QxL@xDK)JzC>8<90Ui zcJ?yN+FlrTbb<6aRb?6!N~7C=rnvvBv#kxt>nAUJ+mD=dZ$L?!6s+(HjA4`*#C@CNpDUN zC2DZ;TtkGOVY+829ZkUKlAzTV3}%wDYh4-GAHQ(oeRyDGW?_Q|Pkh452n>NCFa(Cc z5EueOUAut4nzz`S$LtqFDfgvyihQR(anB-LFE&zPr+W8j%;i1!pzz`S$LtqFD sfgvyihQJUQ0z+U341pmq1orR2D1!TZi#f;OTM6JLctx1>{SisoU(H^R=>Px# diff --git a/test/fixtures/controller.bar/stacking/logarithmic.png b/test/fixtures/controller.bar/stacking/logarithmic.png index 52dae9b93d79f8ea5f602f22caa253e1e407a583..377b6c59ff1eba426ce114ee4dac236f97362509 100644 GIT binary patch literal 13897 zc-rln=~Giz7>D1Rg@A|wqA7|JL?tRvv2H;zms%9Dn5ejbSOQhS9Vjl0L~=!Cu~wx} ziin0z6{=E2K|x2%tx%VuURLs)LTVKg4vT|Wt_C4XL28Uj zX`8BkMN6}TQa{u`bK{@z#RefCP!ys(&evtRL-b5?REI+`x$sAZ=M!h97qO2ki zQ6=)ZKD}!1?<`TMRWI$c=s%-2o(gogg3ew9N6M)4#pvI9=tUv#Q)nnWm{q#t#^A_%D}*l=HK%t-fjSdBD%pL+m49QLwq! z&0vj!l6~4lAsp#G=VTyK-hK4&meDNd5ak!prgEemdTMHf)O_*7U<0u!Bl)QX32GYA zXQ_fPQ(cEIxIGVd*RgfYZ|8>3qtM!9xVX$bXpo3RDx*<}J&P~|7I(-|< z|Ggly0%A7Ex6^z&yj1U>gifeLn@iXTWQo1+uR?dgX7AhlpczFKJ>nRmV0Tuph8y!j zJR%+$KK+6cQKhopSS`w*R3~QZ5J6GHn6Ci z`Bw=NuwDo`i>q4L8*2GQ1dX!``fx6melf>K1ky zoSs{gnT_(-xu}QJh#)aNHQ^FBrZIGeOBxh*6zw9>ovQrGhTSAhk~qSm!Dc%%1n%0) z7ohxE6QrXlM9|LBzlwIGPv^#YnPFyaKvx<9-<*lXVR2X-7Kg=QaabG{hs9xWSR59I z#bI$+92SSgVR2X-7Kg=sV&ba7+_6WkFq=hca_M?QPKN1jBdM`iM5IdY(Z=%()f*CC z^C+3wIArerFl5f?N#1veR%?_}CQR0E6~Fahwkw$=LdTZm=b70Cc5&=SdG@N7F3sW8 z9R=3Typ`-&w72Kg27fd0C|C$f%5Fq6t6Gz5Ka!@0I++&~oY8;?1bfGNx;)0m;e*ygbQvUz| literal 12961 zc-rmSdrVtZ90%}oFD->KtiTv^!ivyPWKIS`1SGxPM4@JBi7;S3Xcy+HMg>8%KxwaJ zJgQ`FG!Zc6vB-ksAGiNb{Y&FN{&8+{a`Vgg zmy>($=bYsJaaF0pWN+p^CIG-&kdpK|065qg9`5k=NOo@vfM6g6eUiId14;*cB#(ZWe#%9IqWP(kMm=k$uA&%Fx!@0u8mEzsiZ?< zF#59_d5-S2xz6JKlu=Hbq6Sl4gs+i`w8bj0Lzg9(3pW`?*`Z#07UtOU>Q1I-A60%n z9Naq3kxo)>CM@Nlpk#4Q#9dpz>d{BtDl%_d1IUMQ_77}cY!ZIuF8G3mRqAHhg_T-qUcMd-j9s=dvy}DOaL;BRD2kK!rK- z|GUth>jbrBUysx&U571BC-3uVrQNxmOKmx&I(3jD1J0GZMqH+t{M<$&+VBJ1Ao9mw zB1E(%)&xSaz1f2j|pD=v<e(b4;8b=`IAAuvYt?lCj2D?_c7y7Lbc_dDvzK%3dxir`71w(OW`0wpSD1Wp*obNc zOL;=tWrf-JQ|9eV(6&B2^eotGxQNSvu-|y2!!H%w_Yv(g!7QxL@xDK)JzC>8<90Ui zcJ?yN+FlrTbb<6aRb?6!N~7C=rnvvBv#kxt>nAUJ+mD=dZ$L?!6s+(HjA4`*#C@CNpDUN zC2DZ;TtkGOVY+829ZkUKlAzTV3}%wDYh4-GAHQ(oeRyDGW?_Q|Pkh452n>NCFa(Cc z5EueOUAut4nzz`S$LtqFDfgvyihQR(anB-LFE&zPr+W8j%;i1!pzz`S$LtqFD sfgvyihQJUQ0z+U341pmq1orR2D1!TZi#f;OTM6JLctx1>{SisoU(H^R=>Px# diff --git a/test/specs/scale.logarithmic.tests.js b/test/specs/scale.logarithmic.tests.js index 19a616ab2..df169c954 100644 --- a/test/specs/scale.logarithmic.tests.js +++ b/test/specs/scale.logarithmic.tests.js @@ -478,7 +478,7 @@ describe('Logarithmic Scale tests', function() { }); var y = chart.scales.y; - expect(y.min).toBe(1); + expect(y.min).toBe(0.1); expect(y.max).toBe(2); }); @@ -508,7 +508,7 @@ describe('Logarithmic Scale tests', function() { }); var y = chart.scales.y; - expect(y.min).toBe(1); + expect(y.min).toBe(0.1); expect(y.max).toBe(2); }); @@ -638,7 +638,7 @@ describe('Logarithmic Scale tests', function() { type: 'line', data: { datasets: [{ - data: [10, 5, 1, 25, 0, 78] + data: [10, 5, 1.1, 25, 0, 78] }], labels: [] }, @@ -751,7 +751,7 @@ describe('Logarithmic Scale tests', function() { min: 0 } }, - firstTick: 1, + firstTick: 0.1, describe: 'all stacks are defined and min: 0' }, { @@ -762,7 +762,7 @@ describe('Logarithmic Scale tests', function() { min: 0 } }, - firstTick: 1, + firstTick: 0.1, describe: 'not stacks are defined and min: 0' }, { @@ -783,7 +783,7 @@ describe('Logarithmic Scale tests', function() { min: 0 } }, - firstTick: 1, + firstTick: 0.1, describe: 'all stacks are defined and min: 0' }, { @@ -794,7 +794,7 @@ describe('Logarithmic Scale tests', function() { min: 0 } }, - firstTick: 1, + firstTick: 0.1, describe: 'not all stacks are defined and min: 0' }, ]; @@ -812,7 +812,8 @@ describe('Logarithmic Scale tests', function() { chartEnd = 'top'; } scaleConfig[setup.axis] = { - type: 'logarithmic' + type: 'logarithmic', + beginAtZero: false }; Object.assign(scaleConfig, setup.scale); scaleConfig[setup.axis].type = 'logarithmic'; -- 2.47.2