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 zcmeHO`BM{D9DkdGfQS*IsS1*aN>pOSdIiOV+9+Z%QSkt=Ce#COpa?Q1Br7TqYgLM+ zh|$ogLRG40JkSxd73xtGtU>Xrgmj#Yas>nua&2G!jJEHGH@h?6nfLvE_PgKf^L91M zB(VWQ#tZ=f1jH>CuK<7oZz;gn2VVMenjHXeL7e#Wl{xD>wbL6bqDIpUeuV;z!CjR1 zgMbw{E(BW;)_CA5H!u@OV#JXf#k7R&S;m3q_XfzT7uGA*%Bp2T4-fNO9774Rvneu> z!J!nksvB0cH2W!SgS~?hCmaX)*}u{za4|nupd6x`II!l*Qf{qc-XnfG%fGhh^ zINZaujl#w^<-#>@b1_bvkUk6ZC$0$L8mo_k3Tn!5x;#lom%lvn(!1Zfr39tAs)s<%xExD-o{A-2-!R*2(Hd4Y;J51m|Mm2f(13jxyz2Xtkb3m+{}-=b#0dP7 zPNx#;Wc&nsV5-w;X|Txt{Mar!WV0T%xH&$%o$tI6NQt1E*65ln&P_u^<{fq_QKbZt zSIqghNpnibti^;=H0hn8$m%BZq<=H;qLFhn6)bKv~Jt zMI}U*yN(ez0<9i(a3yJ+q9msRl9%w)Wi~$i#g`tw3Va&%K1<$8tXOg@#KA%J5j_XP{N>Pxy7!*0S;WyvJfYwk1FF zxf?pjIIPEg1H?P)+xTGA%YjJCoJMC?DOJWP=$q zeqOz;l@i&>D$oP@M(Iw1NhDO-A~Rra7MP1MF9Jz=cjqwW2M=J z-3Ge+6>nH7^zi9dI0vtkbf=i1{TcN}?$FtaYIT?K(}EkKS#jzbZLA`YcWlqyk; zL(K_lPEc2gx=J(-pg9iBacBTX12|$%5OabkFT_iC+a8_F<>Kf>OE=hy z@}2jaL`Jlib!0JL08AeL05iPX6`{kXHW{scuB8^_db-|sU$Nn zD^*Z(+(orh%TxNKnpG|BhC_;7r5?-imDCi-WS`gBBVE`NF&iwYy0xBM^(M2fPgHqk zjIZ+sSm~}WXk+5xSHQBbpY=N~nNJ5-kWmw##k?@k%RlghL)Bnr5giY@aIr-_()K3O z-8A`}&t1<{uu9aE0u^fb;CNzIt>;3GCI7uz5;tr3KpOUoL&L1&fTbI;^7`}b{j%TZ z&xt29mz>{Mt@e+3CRL8|fGuJEVB+epE|F8ZZl*YN2`d5)xRb$omATH!h+!pxNtZwD zb+5^23NVt|@3(O~S}Du=SsZv)Q}%!ogCPE!ycm$Z;V}Sgn)h1(;ulO#B}dwFQC^x9_l Pix`MoC=p*=AkX^;{QOe? literal 12961 zcmeHOZA@EL7(VyXQYga;j4>yy2n|K%WFSO9(%VfGYL=D=1Lg?}r)^JARJFCcv|+m>Cf zjZL$uq(fpb`m-B(j_$R&&f@))QBIqp22)*xuaSzh#VW8vmnE1BHyK9RpLbfB-C z0si*2HZOib_=sVX0y0ojbT`{!|5fF59)xc#Xp~XgaCn8hr(r+$><87)WnF4gu0-`l za7?a%3UlQDx1&AR32Mu}9;s8h4qKc~-sjUwyK_62+Hy*D>L5i1>|X8~ahYQBa~p|h z!w=9w%Fn18g#_%Nk{&?IsI{)$Ti( z=aTjfdUK?DHpvD!mE98#h|TX>bsYfXMdq2^pn4%4xdtq%`93-%f=;&LGDH{R&*O9l6RMEgt-3+r>d?@wxv z*7(i1oejL5y$rFo7ls{OAbn0%nFd`kjcx;);{LCWbDKd&Xk&~XVn_3=;}M{=p2Hnv z1jlRojSx$hR$0Z^cenjmtw3_JmAQh&Z4|S+g?ub4Iq^LbVs)ma_G4fxS|B{l;^)Ve z^o#h={>fz>p4!0OFNDr3^f$TX&2R8dHIVqFGqSq?VuuEP&uj;e-l@@eu*uoH&Eh5! z+CO7d(wh@Ri5i?d*ASs+nC@9hM-wo*Bxtn-gP5f3T2}`4$1j|CA08N)S=ivg2r=Ph zG+}7M&pOSdIiOV+9+Z%QSkt=Ce#COpa?Q1Br7TqYgLM+ zh|$ogLRG40JkSxd73xtGtU>Xrgmj#Yas>nua&2G!jJEHGH@h?6nfLvE_PgKf^L91M zB(VWQ#tZ=f1jH>CuK<7oZz;gn2VVMenjHXeL7e#Wl{xD>wbL6bqDIpUeuV;z!CjR1 zgMbw{E(BW;)_CA5H!u@OV#JXf#k7R&S;m3q_XfzT7uGA*%Bp2T4-fNO9774Rvneu> z!J!nksvB0cH2W!SgS~?hCmaX)*}u{za4|nupd6x`II!l*Qf{qc-XnfG%fGhh^ zINZaujl#w^<-#>@b1_bvkUk6ZC$0$L8mo_k3Tn!5x;#lom%lvn(!1Zfr39tAs)s<%xExD-o{A-2-!R*2(Hd4Y;J51m|Mm2f(13jxyz2Xtkb3m+{}-=b#0dP7 zPNx#;Wc&nsV5-w;X|Txt{Mar!WV0T%xH&$%o$tI6NQt1E*65ln&P_u^<{fq_QKbZt zSIqghNpnibti^;=H0hn8$m%BZq<=H;qLFhn6)bKv~Jt zMI}U*yN(ez0<9i(a3yJ+q9msRl9%w)Wi~$i#g`tw3Va&%K1<$8tXOg@#KA%J5j_XP{N>Pxy7!*0S;WyvJfYwk1FF zxf?pjIIPEg1H?P)+xTGA%YjJCoJMC?DOJWP=$q zeqOz;l@i&>D$oP@M(Iw1NhDO-A~Rra7MP1MF9Jz=cjqwW2M=J z-3Ge+6>nH7^zi9dI0vtkbf=i1{TcN}?$FtaYIT?K(}EkKS#jzbZLA`YcWlqyk; zL(K_lPEc2gx=J(-pg9iBacBTX12|$%5OabkFT_iC+a8_F<>Kf>OE=hy z@}2jaL`Jlib!0JL08AeL05iPX6`{kXHW{scuB8^_db-|sU$Nn zD^*Z(+(orh%TxNKnpG|BhC_;7r5?-imDCi-WS`gBBVE`NF&iwYy0xBM^(M2fPgHqk zjIZ+sSm~}WXk+5xSHQBbpY=N~nNJ5-kWmw##k?@k%RlghL)Bnr5giY@aIr-_()K3O z-8A`}&t1<{uu9aE0u^fb;CNzIt>;3GCI7uz5;tr3KpOUoL&L1&fTbI;^7`}b{j%TZ z&xt29mz>{Mt@e+3CRL8|fGuJEVB+epE|F8ZZl*YN2`d5)xRb$omATH!h+!pxNtZwD zb+5^23NVt|@3(O~S}Du=SsZv)Q}%!ogCPE!ycm$Z;V}Sgn)h1(;ulO#B}dwFQC^x9_l Pix`MoC=p*=AkX^;{QOe? literal 12961 zcmeHOZA@EL7(VyXQYga;j4>yy2n|K%WFSO9(%VfGYL=D=1Lg?}r)^JARJFCcv|+m>Cf zjZL$uq(fpb`m-B(j_$R&&f@))QBIqp22)*xuaSzh#VW8vmnE1BHyK9RpLbfB-C z0si*2HZOib_=sVX0y0ojbT`{!|5fF59)xc#Xp~XgaCn8hr(r+$><87)WnF4gu0-`l za7?a%3UlQDx1&AR32Mu}9;s8h4qKc~-sjUwyK_62+Hy*D>L5i1>|X8~ahYQBa~p|h z!w=9w%Fn18g#_%Nk{&?IsI{)$Ti( z=aTjfdUK?DHpvD!mE98#h|TX>bsYfXMdq2^pn4%4xdtq%`93-%f=;&LGDH{R&*O9l6RMEgt-3+r>d?@wxv z*7(i1oejL5y$rFo7ls{OAbn0%nFd`kjcx;);{LCWbDKd&Xk&~XVn_3=;}M{=p2Hnv z1jlRojSx$hR$0Z^cenjmtw3_JmAQh&Z4|S+g?ub4Iq^LbVs)ma_G4fxS|B{l;^)Ve z^o#h={>fz>p4!0OFNDr3^f$TX&2R8dHIVqFGqSq?VuuEP&uj;e-l@@eu*uoH&Eh5! z+CO7d(wh@Ri5i?d*ASs+nC@9hM-wo*Bxtn-gP5f3T2}`4$1j|CA08N)S=ivg2r=Ph zG+}7M&