From 1f6d0a244bdc1636cb42dce1ce1cc22f2caa0a51 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Mon, 15 Mar 2021 08:49:25 -0400 Subject: [PATCH] Linear Scale: Ability to specify a fixed number of ticks (#8643) * Option to specify exact number of ticks on linear scale * Fix issue description in tests * Add tests for conditions where min/max do not align with niceMin/niceMax * Refactor linear tick generation algorithm * Add TS definitions * Update docs * Code review feedback + lint fixes --- docs/docs/axes/cartesian/linear.mdx | 1 + docs/docs/axes/radial/linear.mdx | 1 + src/scales/scale.linearbase.js | 78 ++++++++++++------ .../scale.linear/tick-count-data-limits.js | 28 +++++++ .../scale.linear/tick-count-data-limits.png | Bin 0 -> 27020 bytes .../tick-count-min-max-not-aligned.js | 23 ++++++ .../tick-count-min-max-not-aligned.png | Bin 0 -> 11023 bytes .../scale.linear/tick-count-min-max.js | 23 ++++++ .../scale.linear/tick-count-min-max.png | Bin 0 -> 18369 bytes .../scale.linear/tick-step-min-max.js | 23 ++++++ .../scale.linear/tick-step-min-max.png | Bin 0 -> 11023 bytes types/index.esm.d.ts | 10 +++ 12 files changed, 161 insertions(+), 26 deletions(-) create mode 100644 test/fixtures/scale.linear/tick-count-data-limits.js create mode 100644 test/fixtures/scale.linear/tick-count-data-limits.png create mode 100644 test/fixtures/scale.linear/tick-count-min-max-not-aligned.js create mode 100644 test/fixtures/scale.linear/tick-count-min-max-not-aligned.png create mode 100644 test/fixtures/scale.linear/tick-count-min-max.js create mode 100644 test/fixtures/scale.linear/tick-count-min-max.png create mode 100644 test/fixtures/scale.linear/tick-step-min-max.js create mode 100644 test/fixtures/scale.linear/tick-step-min-max.png diff --git a/docs/docs/axes/cartesian/linear.mdx b/docs/docs/axes/cartesian/linear.mdx index bd6670297..5a5f8588a 100644 --- a/docs/docs/axes/cartesian/linear.mdx +++ b/docs/docs/axes/cartesian/linear.mdx @@ -31,6 +31,7 @@ Namespace: `options.scales[scaleId].ticks` | Name | Type | Default | Description | ---- | ---- | ------- | ----------- +| `count` | `number` | `undefined` | The number of ticks to generate. If specified, this overrides the automatic generation. | `format` | `object` | | The [`Intl.NumberFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) options used by the default label formatter | `maxTicksLimit` | `number` | `11` | Maximum number of ticks and gridlines to show. | `precision` | `number` | | if defined and `stepSize` is not specified, the step size will be rounded to this many decimal places. diff --git a/docs/docs/axes/radial/linear.mdx b/docs/docs/axes/radial/linear.mdx index e66f8a414..663e949b4 100644 --- a/docs/docs/axes/radial/linear.mdx +++ b/docs/docs/axes/radial/linear.mdx @@ -35,6 +35,7 @@ Namespace: `options.scales[scaleId].ticks` | ---- | ---- | ------- | ------- | ----------- | `backdropColor` | [`Color`](../../general/colors.md) | Yes | `'rgba(255, 255, 255, 0.75)'` | Color of label backdrops. | `backdropPadding` | [`Padding`](../../general/padding.md) | Yes | `2` | Padding of label backdrop. +| `count` | `number` | Yes | `undefined` | The number of ticks to generate. If specified, this overrides the automatic generation. | `format` | `object` | Yes | | The [`Intl.NumberFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) options used by the default label formatter | `maxTicksLimit` | `number` | Yes | `11` | Maximum number of ticks and gridlines to show. | `precision` | `number` | Yes | | if defined and `stepSize` is not specified, the step size will be rounded to this many decimal places. diff --git a/src/scales/scale.linearbase.js b/src/scales/scale.linearbase.js index 1dbaf285a..be5b0508c 100644 --- a/src/scales/scale.linearbase.js +++ b/src/scales/scale.linearbase.js @@ -5,7 +5,20 @@ import {formatNumber} from '../core/core.intl'; import {_addGrace} from '../helpers/helpers.options'; /** - * Generate a set of linear ticks + * Generate a set of linear ticks for an axis + * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined: + * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max] + * Note that the generationOptions.maxCount setting is respected in this scenario + * + * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined + * spacing = (max - min) / count + * Ticks are generated as [min, min + spacing, ..., max] + * + * 3. If generationOptions.count is defined + * spacing = (niceMax - niceMin) / count + * + * 4. Compute optimal spacing of ticks using niceNum algorithm + * * @param generationOptions the options used to generate the ticks * @param dataRange the range of the data * @returns {object[]} array of tick objects @@ -17,13 +30,14 @@ function generateTicks(generationOptions, dataRange) { // for details. const MIN_SPACING = 1e-14; - const {stepSize, min, max, precision} = generationOptions; - const unit = stepSize || 1; - const maxNumSpaces = generationOptions.maxTicks - 1; + const {step, min, max, precision, count, maxTicks} = generationOptions; + const unit = step || 1; + const maxSpaces = maxTicks - 1; const {min: rmin, max: rmax} = dataRange; const minDefined = !isNullOrUndef(min); const maxDefined = !isNullOrUndef(max); - let spacing = niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; + const countDefined = !isNullOrUndef(count); + let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit; let factor, niceMin, niceMax, numSpaces; // Beyond MIN_SPACING floating point numbers being to lose precision @@ -33,15 +47,12 @@ function generateTicks(generationOptions, dataRange) { } numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); - if (numSpaces > maxNumSpaces) { + if (numSpaces > maxSpaces) { // If the calculated num of spaces exceeds maxNumSpaces, recalculate it - spacing = niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; + spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit; } - if (stepSize || isNullOrUndef(precision)) { - // If a precision is not specified, calculate factor based on spacing - factor = Math.pow(10, _decimalPlaces(spacing)); - } else { + if (!isNullOrUndef(precision)) { // If the user specified a precision, round to that number of decimal places factor = Math.pow(10, precision); spacing = Math.ceil(spacing * factor) / factor; @@ -50,23 +61,37 @@ function generateTicks(generationOptions, dataRange) { niceMin = Math.floor(rmin / spacing) * spacing; niceMax = Math.ceil(rmax / spacing) * spacing; - // If min, max and stepSize is set and they make an evenly spaced scale use it. - if (stepSize && minDefined && maxDefined) { - // If very close to our whole number, use it. - if (almostWhole((max - min) / stepSize, spacing / 1000)) { - niceMin = min; - niceMax = max; + if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) { + // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it. + // spacing = step; + // numSpaces = (max - min) / spacing; + numSpaces = Math.min((max - min) / spacing, maxTicks); + spacing = (max - min) / numSpaces; + niceMin = min; + niceMax = max; + } else if (countDefined) { + // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range. + // Sometimes these are no-ops, but it makes the code a lot clearer + // and when a user defined range is specified, we want the correct ticks + niceMin = minDefined ? min : niceMin; + niceMax = maxDefined ? max : niceMax; + numSpaces = count - 1; + spacing = (niceMax - niceMin) / numSpaces; + } else { + // Case 4 + numSpaces = (niceMax - niceMin) / spacing; + + // If very close to our rounded value, use it. + if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); } } - numSpaces = (niceMax - niceMin) / spacing; - // If very close to our rounded value, use it. - if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { - numSpaces = Math.round(numSpaces); - } else { - numSpaces = Math.ceil(numSpaces); - } - + // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed + // until this point + factor = Math.pow(10, isNullOrUndef(precision) ? _decimalPlaces(spacing) : precision); niceMin = Math.round(niceMin * factor) / factor; niceMax = Math.round(niceMax * factor) / factor; @@ -204,7 +229,8 @@ export default class LinearScaleBase extends Scale { min: opts.min, max: opts.max, precision: tickOpts.precision, - stepSize: tickOpts.stepSize + step: tickOpts.stepSize, + count: tickOpts.count, }; const ticks = generateTicks(numericGeneratorOptions, _addGrace(me, opts.grace)); diff --git a/test/fixtures/scale.linear/tick-count-data-limits.js b/test/fixtures/scale.linear/tick-count-data-limits.js new file mode 100644 index 000000000..497ed1145 --- /dev/null +++ b/test/fixtures/scale.linear/tick-count-data-limits.js @@ -0,0 +1,28 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/4234', + config: { + type: 'line', + data: { + datasets: [{ + data: [0, 2, 45, 30] + }], + labels: ['A', 'B', 'C', 'D'] + }, + options: { + scales: { + y: { + ticks: { + count: 21, + callback: (v) => v.toString(), + } + }, + x: { + display: false + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/scale.linear/tick-count-data-limits.png b/test/fixtures/scale.linear/tick-count-data-limits.png new file mode 100644 index 0000000000000000000000000000000000000000..bb365bcd1f150ed78c51b883884e3627031be641 GIT binary patch literal 27020 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/scale.linear/tick-count-min-max-not-aligned.js b/test/fixtures/scale.linear/tick-count-min-max-not-aligned.js new file mode 100644 index 000000000..1747f9f39 --- /dev/null +++ b/test/fixtures/scale.linear/tick-count-min-max-not-aligned.js @@ -0,0 +1,23 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/4234', + config: { + type: 'line', + options: { + scales: { + y: { + max: 27, + min: -3, + ticks: { + count: 11, + } + }, + x: { + display: false + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/scale.linear/tick-count-min-max-not-aligned.png b/test/fixtures/scale.linear/tick-count-min-max-not-aligned.png new file mode 100644 index 0000000000000000000000000000000000000000..dea42ece524ee5fedfa0a124e4a75e532e11d3b7 GIT binary patch literal 11023 zcmeHNXHZnzmfqcDQG$dv1grgxKs09&6}F3shW3d%0Iv<&e{9yz1RBI_kHVxnwc0Z zStPj#A+%(-;f{R>k>O7=;^l^4qkgs12+5({JGSokvm0pUi#X6Vr9bSP_T*6L(mU@3 zQVs=`*5?~%yY>~8FVWcNUUw+9zJ8UXsIQx?(WPI+BKVb*)XTVcuKJ~KpYQv8ra;)1 z^qgK~aqqDl*W>O4|Cx}B<7Y#Bj}3Z#n={__;l-KiGqi(jv8I=(Nh zU@%|p$g4|@uBqt{#s(gLG)YK#L}$;d9eaDti--AM-ba^=4VE=a-po;wl632k&irHt z?ep=ZvWR6H9otJoS#Rv;A4-yCf+oNA#)zvN60O!5F^-VjtW>2l^48T*2*uKQEwHy) znEhko9%a4R;g>GQkB6q1CzX$X@s#x+dgj{{G&5l27N_NX%;xl`qpYeeL#3}S%R3F^ zG>9Wf-K`DsFan9pM?RH6vMThW=}h z4~FJsX{Ew-t+T3mZRf1cbj4idWE7>8Ss7sO%*nfH7xNgh%5vDcck11It+{FBJB?PI zbn!bU1JxZ~n{H_(yF^`lQvSF{i8#xWBraEOMt1_e zNE24>bbg6?a#4jnAIT`Fh0dPq-A<2*=9~X2NWT~~H_eB}#j$CH6faZXA+NdvmSQhM z1f$>IHK@oa7?ey+dszA5NlV~Fvt~!c#s>)ke*M`McYKFh$kfma8T;`yn{7nPy-G-B z&n8-=q&y30X+_h$2U1qqkB@vXQZ0kSS^n_{xa&b|MFSY^bOw@AgIl3O?}hqWe0?;SRBeHvYHpgYYHX(4Tqdap=2q90h^%CFm-vr@N>v?gVN-^ zcO9Rf<6^zwS1sKxs4MCme<~K$T-^PX8_&F+9l`k|hu5Cd=1C^$^G}LD9lN=+Ye=b@ zJ7A)qH4?IF<|B#esZig&pGa>ig*U(h`3*grXm1Z!jbe3FRAe1~**^SIFf(@e?Z)aI zT~mx-Bqm3#Ib_KF=hkSgB4#-P+2+tvcxGqUisI+zc~qZ`6?cAau<_p04@h2@OXg&l z+`9OYz81yMYW>}moX1haNO{UhjLih> zSbw51tNntMht+fuo1I_9p7vp&n&+WbCPcEz0ZhO^0%doj_41AR5@rkOU9y}EZsS+0 zhyq06t(_As`C<1_n$acZt%DEjQV3)Cd0Vc;cei<+9P*jr6~!+&B~@WWAKIFC!td+L z8obWpSVU!BU?2xKB5)Q104xs4IEw#A4mEP%`zN=ZM3Q@X+wD3Ix4dW^|1I>&3=qPr z=g?|=bTUJim}P^g5ZbUjKNb%@7+Ub>(EnsZAhGT!hKWWeCMJ&m8usm?i;-6GpX8zf zP9jQ5n*%>o#ds`QJX;Fe<9%B~mu);&`XDt!QpzLm@aXrC&eypqs&>m`oQ_rBlD0mP zy>qO!iKN&pW40c9_J|^!x$%unDUB+WU$syOK!8lWAZ7RlJAE?~tmYJsR4KQd?Mu%a{b1BlMzN0=qO)gcgHOB5 zSrxLf?8yrK_FMjgq55;*O=(kIR}GAe!jW0kRO$^ZR5pku&n%{P<<6}!Pb^jcazf;b zd#wry4P>PYhKl@cyq$1USH<~Fe@}9XKUE(};^5{*UGc@0ShUHR2Ujma;o>S`&Iy6)P(}-r1C+c*d)~9? z>anh81(^5TG_zSy{vL6&;6dP;vbdDY5|kOjZV?JvB%SPp;miovYSnxtU82d$kckef)UmfV<&95WF`X^3@z~oB#W(c=&yIC45@!8dIjyQ9nXY(w zGGY!^psQE6BP%<#3Sx!j{Jbbq!*?g1&@}^OGBr1vO2V_6$s!L-y$!P5U$l4mO9%j*hOq!m>`gHRc}N*}-Y-vAWY_Wa9huHi@GW5e`7lTZyiK!Sud*!inO>5ez{ia7(I zs1^=y!>D_9xujdEjDNrI+{{F@YT$RHuPTfv!Lnt+KPqhcVpRmOg<*V5_hi{I+>W4yAuVyzb;TV1toA}!*va#uJrSWwn=)m~=g z+q-b(%)$*oDq^`A>A5Z1->MVrm++_-O*-~NfoHvxonN0(H0?@aid<+HCBg@%D&IdQ zQGmz?ohY6gr@d9HSSx}~H_u5c#y|niWIi{FB)5?~?lot#n&BA~b_56BUlM9c<9@pS}L6Sww1ltGY z4HeB`5-9t7;>~i9Lk~PTn$C2`XMepQWkII4W~}>6Oo)P`_*QZ;Dmm!U`tyD|qcz*r zPW9Gm4wrDG3X%k*)Za=oqTap4vs$i3DEJ=Add@AiW2og>svuX;v_Nn)N&Se&x@~w+ zYp=W{ihzXWUQ=`0wZCPNALyud28Y0~kV8nhgBt#hE@{+#D33iq(~;ko5f0jHqs5`) z_c1Be0Vwq#XxXJLC{mi4N~E$V2EE_jUROIi+GFM0eCleDNZUCs{&v{B$X|q#3&qT) zBpkZRihszXdlAni2{f?69y;?z7{yw?WfAAWg1qc_XM33lvI3}KHDxiI4R%;l>|cJz zHy#B`lF5v80&9K}hyP0^1(hZ2j^aL@8#iuz7E!t(e@CTjwjM`s5?LAmTic^&K>_%{ zF@E2b=s=t^4Lj$-rl&NBxH1t_9bu>Ph!i^(#tATv>^(L=H)F|ewnoyjVGD93LmVa( zSGBWwoRd=~?b{@L)%Ntk(ZS{|hpeqr$7X?kL}U8HMDy#fjfX>|AJ7{>`Gc-i!Suwn zKlOwV3}Q#08@uzvdcL7(JV!$Jtk2`ekJm0iP8Cs+x3`CsPqI3k0BYy@$`YsYeC$s7fT|F zmhD=zi4`T4GxG@o=wp&;w3hd`(!`q{lIDrVp>q?h`dDe#94Z`90<}VE=pV(?hC$`w z`kh>&ka>`gHztJrHbcr(Q{>HscJm_k561QBTsz=YsmP>y_-6Zi3^t@*l`?YChGF z9<2p}d_Je!%pE(RW z!^Oqu^CJlzpWQMe->fTGOH}^z0@{jpP^SEbpYu3L2B zE_v3X80xPD{UiGbn(REP?8}8E>u4+2KQfg^$KEM{cDdDf;?cXK{F@|^WKQJWB<9IJ_JWh3UhLk=MPkU};-@u)^jgUeoU<&P zLV4s|9d+>0v7JCD@0up)VMe>F@E}@Q{bCzYEtQ5;h zu15C+U;aY8r6Nqd-nBN_u_=#6o1f~gz({KH-Kel7>W$2^8cb-{c-{^3mB#O;%I%R` zgWlfKEyx44-_hbf6gfBkMRoO_8={!lc>RZhKfj#2fCaIt3yWZ@OoIf$wV1a({b?0s zP@aUgPco{hVLg?=Ikh2{zwYktWlc}L@7fm!vHBlXm#+v}zI4G_HAjXw&mSPxeH&X6 zXpXX>poxOK$@cIL=ut$3iYQ>!ThuK*2i(oSA2{>b_@S|I#w{>BG<%rm9otHR>q3yS zz8=>lb>37$b;$!yV6erh@&=uUhjfxz<=Km(hJ;SAhxPkxTZXxR zeBHD~3%jzFiVUfbe#H~~iY*l>&T!Td-GZf{?>RRa5p#Wlksq3x&EfON{e0+Oyb*Ae zqC5B2x)wr=>vo@jUckeSlmy}s4={CA>l423L5h8Ob$jr$pH~J__$LDoS1pq8ES@_Z z&}ZHHVE*8#x&tqzk##u!aM~n9YTH^EdZ#Xe zEM~8#Uc&Fb*G$TrpY976mfuwhscad@lGX6ASuD9p5o-pZn_FbqsPkEZ4<75QgyGJcCm!x*{iYgld%E3zYNJC5qnCpb z!yZs!{BCS_9gF)*IiR8^r>g08#&MczGJb8r*T9GC&uOru0spTMv$R=(jy#Lsgb#TX z8&Xhj(gF8Fi-YDI@5fk#VI1jrQoKc=P>nR>VT4^gKJFtJ7we_4N<~ad@9qBM4uCSP zW-HH>D7C7>|21p_^bY} zUk`X4bo}ab{=L2%B{wW3aGNQ@`FX@~?)n?hn{q=72AC9pv`4A$ar~AVTP&5EeOpzq zuLttLZgWh}sSit-?NrDftGBlF9~P(jMt(R&@WdHRb3!CrH-XDf>$x3L4y?T$y!ptF zruw?4Th2I>m~-P%3vH#<04H`qQ(bq`(^Z}{pZ>e31tIC1=FAlG*#;i0JqccS6>nV|}J1t~xY(-V1LFVMdJ zM%m@<{Rq{#-}O06EGh_YG@BZrS6*2|19DRKhpFB&XuoIb@ix}h*5=M#T^LcWMwM~dKK-}iV$AZthTd(*qS$MU~2}8W(M1H zi|5?mCg|&9uoO5sWS~F2cg!d_K)B|lNy%3{ZJAOSIoD@TRkvr-=iCb6RO%>f_?d|z zkTA+W9JX#Zj^DB7u#J<^B$cFxFY)s#S+rUXr8#iy6~JH7R_kbu8D?wrNxx^A~{X^ghM-!OSL?rxt=wG}MaFmes$#s6_ z=H~uYpTHV9T4AnF9AYZf-!4u6<4t5%PfNucPQ0_0RFow`u(S&p&xCJj${MqsI%Y?z zqam17u}@(d-E*7gZz>jYUHYp2VFNbS6^stsK=Ch&v9w!;IdX+y1E~R>&Kv*i<^=AZ z7^-~2QEP++;6aQIJ4In<$)hcPc=OaUBz=;M|C&K_FESUYh!5sO3S5wfi?nvQ)- zeM*$LEx{SQXh17Tm0anOdK^a=iXzxt+@xfOoo8+I?x7Q=Nb4 za%BB&kEIHcYZqW!lLHoK{SYppb(EL&WfseH$9bFBfTNfVeghazlEfAV!;LO(Zpumt zbD04YYHLxTQ)AX)96BnMGuNUk4n4mRxeoB!5v{*Ye4UL%jJ|UE<9%sQKD%aDDy8n< z9Jr_?kx(o_iObLXB`R`O9f586WjCip?~p4Fm3T-{Y+PV^X8oHI80@=cxw}< zDAZ$vMQRADdD>I83rF;PYpgKZHM|LZWi#_n9}=P&(@yi0^b~pFUt47mqF;T zUQD(p-8!pO9w|k^7-bqX<7i-rRbZY_;Pj|4>b<#zkoZ0Y5N&zA4^khf&SN?hd^k;z z@9-sB)kSj?t(~Z6{IU}M0=%^t?=~`-fd;-omq&@omI2X%{)a|QP~o7H>%Gv)^`ICE z;4O8H7C(6??m{98CJ`9lhi~1K;M)>IF}ytsUE`HJjO!bn%U4~sSvt{5r;p{bN2<1D zPRls}jI~Z*Jw-HYp&wg6{jDaugTPL=p^EpwiQmH4L)U12^u~x zyMHF7a1!$%Sx{Y-r^oszVEmuJK7PPD4SB;a__-JxjBO*a1iJK$T0kyID(3To?p>WV zJBBh_d7hEmbkb-R=FDi}bLpm#jtUAATj!GmyX*(8h7S0?G8(LbyVIx**o%E2D{~gu zfR;(aYJ6J;Ff>f?g)U{_a1?0O1~Q6tbPYxNC2E1(d9Z@`T^yn&V-DNfs1tYSxk_ZMw zYWMrQQ9(@0z6AR>Kev*S`JUTkR`(%nN3LU=g0P54+WERfpQ$#_hCByjB9*KEf_gA~ zl0>2GAjCLzlvEYCbk!$oZ4s1rJuJA-LwD#)Zo1>)!;7`FIq7<#tv zp@c}MS?ix2yc+vY+Yn8{3D<7lb7iuZ6GqQ~5xwHq6^&x@H%8lR*N)Fqd_EEU%4?1k#N!F5}Kiqg9TV z8Zv!~J;KQ)u=hk)S!mPz%vi2lue$p{P*i=Vg>0|#%!!QB)N<01mfE6S>q zumTq6xTDK@k1#f4HhK#@^tBj)RJ}rZ{T1|Do#U9Q6;mcll% zCVDZp@d!H)R@~H^vkvV+jNlo-wd;?N3hdIl@NbM4RV+eXPMMm0v~~+)2#)jRu3U6Y}hUXephKbr&mlSsU zc1&Zs@xa2|h=I2D9r3xMk&qUZ3V#;1mH3$(c%+qNAYYRRv59oA5qIV@Q+9XmTQ zkfh+=|9NO;tk(bz0vi@|Va=aYM&rU+t54DpIvJ&)_xta^^Akw4aZypx_0s2VS3Oot zD=3g_^BG7twB76S?J(EI{inuytD6pSE8aW5k3fAH62FzP>deHIqx@LaBl#}-j*>R@ zfrn1h2CSG{jd`AZgwND)`sp`U`XmEqKI&Dsq!~!w5>hs6NHciAzPe`wHdEf*Dva1C zHp$oqWU3+|n$QWe3YqDlQ<=Dv;j@NB%FLvb^)htC;DZB`El#Dj>9KKfxt8x&Rfg|= z(=HLd-~0K|kPRue4XG=!)&Z5J_dtTtEMT{W6!tom%qT-8iXf7Wj3W2ie~y7u-k0#e zOuPEAqI=y*S<{I>R6;h?L`d0O=#BF150)&^gz_;IN%{Qw6fdU6s%z|VbaCq#FvA{D zy}M2R`-iZ)gyRoZuUQi&iapxzt?kxRQL}HPIBt5{t07hIW9El&vR0nGp~_&#ibov<%kq>+rdltmYgFhF;Vk70tUkC{Am+SsRo&kO*ym9yycji zZiihlR79xQ{AyyLDb4xoYknE2xu$eugTCt7hev+1?hpKMPt+rwQfO+?h)LVlU&A^B z0<|~ehj7<>QzeX4HCorUQ#2xAt$|}bl^$O^QuWdX?_$<# zUol_$jfHa+Hs8Pb&qoZhXQIN+v(leWDlIP4{c20UZJ`LrY%W1EwRC*XCLSpt4+y}1P+fz6jdB!BkY#Kq`#WRf%d*lE2X2p{k> zClB_zg!4S(CyW>bKN4lT*zg_x8j1kVr0FrH#gRQM>_-eWx}Cm-%rE2TdC;5YxXtiLuP_}jN{ z_3^5APfTpVn7^0~hT?l;A2EZ40u^0ULBYtax2keA_N}W+#&6nLfO)uRM2Se*M>{Ht zuT}RkRKjP+&x^>*8(zPDy}zx07*;5rr8tNp@XTJe!$BbH6J5TYVflFUk43~Pr?MS+SP8kkj{9Ul6(2B>X5I(I%iz^-ESVoXCkG8_(_NtvdEcv}JMO<-PFbe1;Ur_&@-@V! z<=6uW)7lKvqIy7WfML{CRaNt92bwaQ0IucOHi(67*E$G@M5pWBt<3dA{Y71sQwlRF z_Ntiy&{d!BWG+CI;Kusa$mX+@On>7HlQcJ5Bc}W5-7SIaob%&9YS!;Qb16|hDz#%_ zGGELnCz)f7nB~+KtozC)vLK^C6mN$CAIZ7A1`r$klIl6qPD>?pRzygt9Xs|3T1)Z+ zGapr^Wh*MqtP>PW=T@HAgpM8WG2EKMXXbSPpleP(CmUwA!8L~;JuXR>4T@byz+C!R zjfzmS(38QoxH=rwrR`KqnWlzXY)XHMY};l#+WE?3 zrG+tI0S|h5xHSUZx{ocLR3CaUb?VBt%ZYmzD+Bf7w zbldmpDgU)wx2#yH6T|Ujyxh+7mQNlb_ZZKGvfE0 z>xQfN(6Djx{{W*v0zGG5P{pbnS` z5pskWr{FG;8Po9CcZ+eOMh;!O2!B7jsXwj)r0a6cYf{SFqbxSy!DrfJ!=>Bw}&T z&Xzrb=`_#HXBPibgAVDqEWVm89OD5L_|vlyyVPXyB#*J`-YT$sS-w+_Hh_)A%u9-G z8=vwY!?s6wZa>eCw}G!)fV`b5bWJ$hh}{#@6RVT;dqZ7Lo?gysdjq}kPC@ueGBEBj z=)gZ(3*GuZKZ{!!y{h~pnm(W8zk1i^%?E|m?v!5mz(RojQ=?L+cV14y4lY0Old<^i zys+gntIzMo$K8zWV#CYLXbhZ_i&5%#@g_^ccCr5V|AJBtP=Yh?iS*Ze>|o0AW*kaQ zuZ2++mPUo&aUT4<+XgD}ET{$U1L^r+qDNms!4t2!C#v&Y6FByXK-z$L_WYcNGA&;C z_re`SMT}SN8@Yzv-ti6#V?f~17?>M+A2z^|`kS+p z0B$8BgoEw!8tq)37^f229~Y`rt4yEKc>DHkA2grJgXi)lhTDvR#n!_q2}4Bi;+BwY zjC#?{5oF(lnG`r5NHfUH>-Z)~zaM@7ej+GJv@RjK=B@QIs|5x98(6vc_Z$}T8x3j? zm~-&m@x;FQxyRa9er#CbndO@7j5p5BVFC?Q!ClR+DWl=_WzJkUMQ`7|v-bN)hjJ|) zFzhf!N^nRl+*Ee$VyJ=4ug+uM&` zyMFyy5Xrp6PuOi4Q!Y*-sK&(RcA^}R@cWYHj(iL5eYJ1ZzdyVjv~6{GX(_y8)HTg* z0rL0&P;ZDiz*HG26U>j5)_-Pa6i>nw!dgA|dR{whWReb^uDIN>b3v+({`2S0NJZbg z*x16lE)gqt)VhIwRRMd~P16^5XfHN|Ve15(icj;+B_t;Hr{}jn*O^Vz zPp=j9Z2etpw_A%vP3#f1z{WsmbF(wO(NZ7If5}M!J>qn<1e~q*=+!v7rkJCa9=`kR zhU|js;?~~rzPd@JfM_NE3v}943rkS7;?$$6Xyr_3%T_PwP9@(T@&}cdAKT|{1p7%j!FMU!@MC@V4N?%-CYVzi=fsd)Gx>V%P$=Ed}n-seGe7i0(__o6@VEXGa zpr;yrlH-NNMh1>j*(@a=PP0;JD-sUl$A5n1s2vwYnS~{rn?PD86T+y*WKu7Ynes?L zn~0zA(;~q2iX`G*<7cqj1irA`yCx%yXOrmL+}iDI_;NEJ#w>UiA+8#iBPmXIUd;38=?xM&8F?=y z(X-9{0f;zT9SPmVOrnc~!vc{YkQ-dADy*Pi&WBXj$nJ=&n=HDy;T z*&TYt#J%5Q;26f1m?p=%xZ}`gcNk<`K%@&4r5&Q8s?gE&KHe9Xv94HmGFr)$4n&`! zKmzWIu&r87@fB26#TS-&GqjXrfgGLCjS$c?$~pIBk)|POR>o)i91K=@VkQly=3z~R zbNyG*3Hp5}aKYK`yBdQ+Zk!e%_IL=Q4%br^l{VZ~WCx|_#Z1q`27uvE+#<0~GiB{n z_$wx`LvvWQYE=$&xuO*$MQo>W-U;8y!Dso*dmUTPIq??52R&|)OZ;a3MX)j9#1i-R zJPbT@CN^@fL!=95=P#qk2?A8!98Mw-o$}?B9j3=NEk2<{r!BTCsr1)o4UDZ=M~*=` zupmuNpltUgO#4lgDmxNS3cQ?XG@dl19|>N2p1wdUaU@JL`sR}>F@E^AE#BH$%_3(U z8mcr~9sy_Bblf0@Ob}G`(KRjd&`Z%ykoNv%xvwp{WC)P57LcS<%;D)``xcw70s_i-Tk`?Ixs5)6)X+t<_-d(gew_mMHv(U3$kN}=}pU!S^4qB`YH_P zA#))X$0BS6=(RZ~Y%AeBz0%@ZkmyFV7pT4f{zfL`#c>WuX2w_v_@_4lAoa?sJHH42 zkr{i3Gf(1w=Py7V{LTNR6X^Kou(q>U;lUpK$}sCUm>E3`-Te+0V3Cm*khGplm;r_(UFol$3%yz zR=3c0?_NO{&VLmu6Hi2Zt9Yzv481mIg^nVf-Li<=dnLWTzHk-@k7X?LNi!Wl~ed<$eY2+mp9_j+sk?z8WbVQ1~J zQXH$0!aFKqe09+xN{U5t@9$ewqyZiaV8bs4B)Hb?B14CAde_G-s1X14&DD>7A47wK zb?$CE`CL~V6eG^HJG1h+_Bwot7Ydku)lQeSV`al6Cbu5JISda44Vj{oG$=cN=@RqM z=VynWJ$uH_NeC5E&X9NOIR|9hr#~eLF=}5Y`iJV?=s-t4uEtco;~@Fy1K@0kQ{kQ% zY_0=lN~jMr#Ss~qDja0*L05lg_ARe;|ATHGxy7k)c`q7Z~K<)m{6wrlJF7(wl z>%V_0oUHleH?HN@E+i?e`OdRH(P#NyEId1sbE+#;`LRoM$J5!sq1>hmAoVso{p$H` zxVra)E0De9XWaM}ALay(EoEKdTq{H~27?MpZv26ZtSPY2k<#byAO<-?e^@rNFi^U% zBhI>KV_<0j?cTyuI#^Z+p3Jd55$(OqXQl}jjlzW=;5*FGRIlR|Wm*{c98&74K(82l zs|cw5GRKmg9p@uU~!#^Jem(J`oe12G&Hm;NSA-=S=Y`^^Ng-Np1 zJ`1ze-Dw+$lmVJ*(4TW^T91{gahwq$l6lT;z;!ALC!9(?9?`{`=Zub_tJa~-TNAot zXEoR0hx31@hB8yKMh>pW6)JKkbZKhkQW4DpCVI)AuNK2cBEpZ%j_+3DQ@ZpLfc;?6 zZPvvSSO7mdONA`TwS!124C#`4b!=3u)1rQ{n*}`rq1M&$82jQ7QD}%4H#r!9lyut- zRnZdvxkukWKCtVrPZ86Kz4YQjUo41=U%o`ixg3o4`*j^O(V=Q~6%~~=4inQGAFtDBaazcHIT@*+VS+ZAC;$OKRt-Q* z)1arW!c2aUZ!A9kI>ZELbuiTE%Y*`-f}qxaOSV0$j<#~;%E>$mJ8Ms9#6qTFcH&w| zvlGzo%a-~*A2YN+@RzccraPI$p=H8aG#NX+O!)RT_+hZ$y9x?B2D&SMpbZy=Q}Nj1 z%V6HrX@tr7PCi|rjRe|32{w9hA?3<){xf_;Yoy|8*{r~E7#6ev3DYMOL61tVR+_6& z|JjtHqXP85LIT5kqP)GxRs4les8$Rz$x<|bl42cM`k%R->;K|*F1N#;hgmJdcgsP< zme(ozY(?8aCrMo%Tr#zj zCv$huD+TBkEbV?0CIuEw1V2E@Vwy3O1&}*ZfLnVA5J+47)t>z2>pN$~Coe2z0h+LE zck9Kcb49e)zpjBJ_41&uBRg6#oTa_jB_VhFHOJlaiMOCwjrpA7rAZ0`7~Uhja4fnbo#Kbqi*W^ z+J6R@QrLd_{8$yAx!)6)u6O50+F!2U@0E3hTgdSc)w9FjrrKq=RUVGrQQF*;0o2+r z`A*T_ThTE#^ZR)O5efJH`e!Y`4KuG@V_W$j%*CYW09SZfF(5!3N3?A4Ss55EYlOFL zvwoxq?)61huG;2on>BoVNpMDFj#q9|e{}B68*tDkJ{{t=`l60GXKqP(cS~E@S_B7wx-bU}3+v??itB?9VixiGBs=PD(`w7=rdw z!WeU{-ai0QGb=VGUJ6MDkJLaw28c2aHCL8S_0_2u=h@fvH>A0Pj%uE(UsF?qtQGL< zPk-DszyaRpc_(4;ng)(7S)V*XcC3^)SGfl+aw~lTiM%1*Sk_mvqqS7y`0+Y8EcK~+ zJ6?|09!Ip_@kL)^+T*G6-?u2Z_1qjT9#fByVS(nG_x+D|?;TH1^6q}*!$+WyY1LN+!s#+jT~tc z71(sbJ9T{f7D&QS_Fr<|pNI38s-JFaFhgIMDy^2A1K2Bb;fH3#ngzgJ4T@8(T?UmW zuw9(&bxo_BIscUj|8Z@l`s{chh>PxHm9jRE`~Z&k*Th{#9>9|C*;2AFYX@uax6UU& z)>L$th;Q{#4d9LdrSiu5lA==&UtjeC6lweOeS8xjWq=E-8aUr2H1wACYmVMy9H6Uv zZ}XNdLtPgE)Z}r}QFEa;{Xy{P);N1=X z@%HU`$RE7`j4IqeQyL+m3f?8ta(W6JjL`APhGgW!hwH7si1Be4X_U_@g z0b9=qWL2~UK*O=QL#80@-`~Kb98X=$Rw~sn}z^?AP~?277u>#xUbu zl7~$fbZ6&Z-KsY2#oj*O!wmLF3>&1ChYc`+^qy1nnPDD4SO&=eps%?@SxI7eWxFgW zAQ*Zyd@;3RrACjb98+^iDqJ)$G2&5bG^cZ(Hq=MgZ6HjzbkKh>DR>N`mVZ+QYZhD5 zeVa7k>os$2^=v?sim;7ZSl0M|430spB6|R{pDlk-9X%$+8wLl5>@jzFFA^u~z9_q(D`PXFrJ`)7} z^Vybv$_zpB=O0aU7t^1;GMEUi;IpRlQfS#Jy|9%Z3lTBK0rJvphHhymSj$YJ<($Mi35)BK!b5 z12E;CngTnA;~glaa92b_A1e7orEEts_=y0qqh5kq&Gyjc;1NcJ`xTB@C&X@YAUZMe zqvj9@Ks8{kPV_3%n^&3GwR}Gc5WNAWCgVA5l5Ui%=07`LldKg7+OXfuuds@}9BWI#5**(0PJ&|1Z6;$ZB-hz_0=CxCAivOSVfYz>?U>@IIj)S?bGTNBCK-9-f$%S`A1 zYwaLF3cmOt5@KBI{5ed_pRxQGBPqB_gZ7G9g8(jqk0^)9|>>BW|KN!yVZZ@ z`vb)DAw-i7vQ0BjmQD3WNWrNCThe`Y=IuBX`80_4K*07kggh-**DPlYlEn+tD_)o# zsDhwZ8pO-|A!q6{T-YlO7#mKwI^;eZL5Ps?owSGgdR)M(`I_Lsh4_wHHJLA5!A1WJ%MUKLFnv! zb+HOEC_~>$fFEc<^r5P=h&I_W(bBQ7w`(mK5=U@S^-ybmN*FCC#YHf7Wg+TFS&$Y? zg7kq8yaMFuw0X2R@QcfEF0A6^MF}7V_l}gVp%9qrpB!37Bo7O4*E385>K4>wV0re{ zC22H);W^|VI3{{3D+WcV=BA@(rr?bI08XxZ@ZfJpZ?1a+$6_V6e^2?jZD`YzhtbQ+ zaq4K_9ZEM{*v&@=&7cnoc;xQ0SNv7TkjtE%97=-^P$oEVg4r=-MV_*42L>iv_C-AaB!SMc;9d<@(=?MCWiB!{NEl z+KygFi)4q_^yuky)1tj~3w?8Yn0WSfEw#Sg&_6ptv8V#UalFC6{5<5szCaJVbLWoz zn8059b9CRnT45R-AT@P$eLyMFP~>**2cJV1%AX!kecDtYJ-=*Zw0x9&? zw#bV}*XG%aYB?yNQDC981kXVzH>SM2{3dq0{RPCQ5ursIAY|--$tLXNiUu_wh+G1m z^W0JA0lC7Pyf_!WU54VJpw`Msmd-y1X(2_)f7X&67QHJ!E#78^Bt0D^X`p;62QL=k0O&Y*)5CMKDADj?!m%+(Yd^(;5qyh zRIg@VIyC&^)LZQAiOZ#QvLJ6CVR#w%wgHIiy9qItW=shpQ#Q6sogc8p@NwL$TiI<*A{Ff7Q$b% zvGD5@ZxJd4eI24lG)|n*1=&E#*1C~3Jn%Spm@Rn@3a;JPXg#G6N|yoRZEZ?1JXOB= zpEIP%n1$K$`WNnYsPsJC>+sfDghV#gN7dFB?m z5)lPgQK1F4VO3mQR?kST=I_WK>L~5V;M=9M0LBrrzZ0%*^eG>%T25y3xwjeTU!#Xm zcvXe}z{o+2Ei!}&|I_l{;pD3LZNT$;WG_hIyw2`Omcg5%{3@if>ZTSgLy$ZF*gpb@ z%$U=ZaylLkOvVV*I6;kU#)!q@5TWv**ZD9oe<(`yeEBKOXtXqnnx@JZWL5qV&@&a90<+n z#?6}*Y#79@bURA?A-iJ&ZLDN4*b2i@Ck9E~aoK&pf?-1E zv$BmkfMoC8z71sP_?GK=IF=40morg;vE7S|Oa)2jOBu6q&biZk%pL=cw;*YJ=<)}g zH3$dYUPb|T=(E#Y*bamH-e*VQdWVzbLXRr;m{@-N(9(E!;oVY;C!ES}Z{nAn-Oba} zhDG~NMj+UTvbm6fEce<3b@R~`4tG3Cb)1;NN+F*H&i{X$d4@!px}M+tRhvYG|LBdu zuW>N%2bMRg>sfb-v7MP0Kx?EP`!^KKzlx!t30JZuII5O0xyS+5oP$1SC2@ zYA46ag_AAUEyuR-;4DaB zOQ##F1*DVIf%}LVWIP4u!I}f>(>sYPg}Ox^4seJxP=37jMtJx-0g{mm6H zNVg9Pa6LTah52b05bLVjA&#;O!>eY&Zep_pQF@A&3Ay)2a!-(k1N9^I)U()jp8@eU zmoh;^qi5EY>mx`tKwVLJ0SQ(Ugjb|?f=SUHZoRZ_#o|1=m|WmOG1|?t?OunD+*tiA znCP#_;w+!Z&Wm!JaC;;Hd`xSsSaI^4B6=Ds*J?H~Y!Crz-^qHAwh?fIv70itg=3lk z1#V6dTZw;-vXYXqU0|?IfMVMtN*LQphUnuSF%Kw^MH@*pLk9Fiu|sh5&+#n>d8)l# z;zxZ7uN0Qy`DbD@8X9a2aB?ubf2VDW4(L#({TBE=GKgQw`W#qKFW?%UZq7L^(_$|z z$>P!9pmZF;Ml(Y{bK-of2_=e_ac`^#+nJGC-DOj?A;M|)LExXE)s}px{6NU$r32E@ zgf5@2c<;ZFS!H;GXa9fp2AQa!$)k%^z&cFeh-T&P0}UItVWJDc1e%uWb3PW#|B_!10Zkr~$zflc70SeK8OsAs~y0HP2FBxFyisPRS zF;gsjZl1*}j`IP;NWe8t0*wP*mU|Z>n8rYypJ0cHgBpmckAb;=0^qsrd-sBR7)X}_ z1}~7AY@2EYRChu)$j2rpC!ZjoSQ~$!ETQw)&{Kl*lVwW=FbTEaz7ayfFQQZb-ILgM z{=-r7%=kWIcHQnA$3#)?4Fv-K#=}((F92*1Iz_pcEW1i49qdV;t{Q&%jIK+Gj6IybnZ&9T zQW*p4ka!*eu#}SxS-g1o6g11zZT`B9bPpEP$^07!2KV}^!jhoq%rO{I?q@(Th&bWq z8`(MPofiHkx^Q-TNRaEFS2RV0Tks$ml&a|d>#VAa1YWu zlt&&yf6fLf7s-F61zbn~Sub{rO2~FN98hZCYX`%Pxn>F~Md-2y*l27Sb#jYAmq#4T zf*87R2)H^K0yj6VU#~Hz&o-qszO@ex4K;{Ta32THZ~$nZ9?WN`r#z0oZrR&{*u?s>=Gk_TkXrz#Px0Ui#_{oXl&GOwkEOlqyIe z`oI)WV5JQNScCKmNLXI@_6Iu+e5odg%IU!k2ZRLIgH+Cr3A?otIdGJM1yNXFtzi>i zKtVRRQ(@Oy;F1a+lDUXF*!_jB-+?+JttI52!=LaWDAgB`znL`lV5ea$m>V;CQoPt> zuW#&-l&ol9Wx+);w_m#LH$a4a00O5x>PS!^tV-W^AnLrP1zzb(YLfB*9a6sAAxHo) zq88q>RU>n_3|NzgndAC?wo2F}m|$HbMz#6BqfvRUXb8BbD= zvOPowUvDrPU2GOJDcD7zmMWc*#BqoTA9O~LgTCzU7_T$`;pUwVA@{hC`4MF-+(JtB z^zbR>)c}={FL)I!yNQKAuVt))502VV0-B%m;sv8nAM7BzqANERV?_!;|Hwa5-5Tz| zeJqn+H&+GxD}Uv{Uf1xHytR1cydUX`toRuJqAUJ;c{PN|8|^O6h-2I#a`>IA+dIId zDvT9KUUasa3@Dhh|4Vs+#YZ>@waEgqwN>T|zaE^pB@S1@8#7ElRug(}Y$6LYihl8S zo?qDL&oZHXa0#k0=D$e)DkJW&u>%7pv&#D$MmQPs}PtIWSud%OD3bwAp3*bkLJvPZ{w4bw*$>k2gmv}Yv<7^rCyxBKBc;IV~_`c|E5br zN|Z>kxhlxT_`8A{#uJpxre*`9uZ-Gf0KcORspG-**w`^rFy?e&$_>A~lF4ytKekm^ zSRR>e&}^;D*y;;h&K6;#K*zw#;?7wE&)M08DJncaw-@~pIb$sts{O-HT>sjjF54n*{$#^q90v=c!zCt* z?YLsl`F}M@{MS%2fYyS>0e_}V-}5nI%^7q2B((BEX4_^dkqe%RCV@KtI(o)kd2C0Z zY}jW z=I@Lnc}@)w6LMX@tNms3fs(bo$eI!O9}5?$TuhzsL_HOPn6BE|+S2Dfk%YHyMQsv@ zTXo(m2$ZB6<-&h$g|n~S=BL=dU-B_;v%yk_2=40%cbbQkY9ho|G9l(Lrzg+L5YHPS z#x{TEtO)*s8P#>`wrvX5Z%Ydwbbw~KM%+j`?hFzUAvcO*hwv`~Shcfg!oRRlWRV5u zw;zBIhyd@FQwG}p%=n4GOIioL>g?J{xZ*FvxcsI}GY)`oVFlf@ul5MKhKbUtE?q~t z1QqI)R-J;2cSK5{{~u=f?k|vlA(D;rGtNr%GYG^OG~pEJ8fx^pz=bg(bj=WwoI22! zkrt$vVbZ+u!@r~!k}+y1VaDp?V(z2c2=2aR46PSq{3{O>@((DjPqGs%@ke(}NAjXV z{u9&Dfpd8 a=iXkjHun2!r>z+LNA-yM;f#Y8zx^+Ng8u^m literal 0 HcmV?d00001 diff --git a/test/fixtures/scale.linear/tick-step-min-max.js b/test/fixtures/scale.linear/tick-step-min-max.js new file mode 100644 index 000000000..115549b91 --- /dev/null +++ b/test/fixtures/scale.linear/tick-step-min-max.js @@ -0,0 +1,23 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/4234', + config: { + type: 'line', + options: { + scales: { + y: { + max: 27, + min: -3, + ticks: { + stepSize: 3, + } + }, + x: { + display: false + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/scale.linear/tick-step-min-max.png b/test/fixtures/scale.linear/tick-step-min-max.png new file mode 100644 index 0000000000000000000000000000000000000000..dea42ece524ee5fedfa0a124e4a75e532e11d3b7 GIT binary patch literal 11023 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