From 0f5e49168ffa5640e8877881d4f623bc222c3694 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 12 Nov 2020 11:40:16 -0500 Subject: [PATCH 1/2] fix issue 5267 - pick correct categories and values pluse a bit of optimization --- src/plots/plots.js | 48 ++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/plots/plots.js b/src/plots/plots.js index fe9a2eed65f..2ac82672cee 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -3098,6 +3098,9 @@ function sortAxisCategoriesByValue(axList, gd) { var aggregator = match[1]; var order = match[2]; + var axLetter = ax._id.charAt(0); + var isX = axLetter === 'x'; + // Store values associated with each category var categoriesValue = []; for(j = 0; j < ax._categories.length; j++) { @@ -3108,7 +3111,6 @@ function sortAxisCategoriesByValue(axList, gd) { for(j = 0; j < ax._traceIndices.length; j++) { var traceIndex = ax._traceIndices[j]; var fullTrace = gd._fullData[traceIndex]; - var axLetter = ax._id.charAt(0); // Skip over invisible traces if(fullTrace.visible !== true) continue; @@ -3118,27 +3120,28 @@ function sortAxisCategoriesByValue(axList, gd) { delete fullTrace._xautoBinFinished; delete fullTrace._yautoBinFinished; } + var isSplom = type === 'splom'; + var isScattergl = type === 'scattergl'; var cd = gd.calcdata[traceIndex]; for(k = 0; k < cd.length; k++) { var cdi = cd[k]; - var cat, catIndex, value; + var catIndex, value; - if(type === 'splom') { + if(isSplom) { // If `splom`, collect values across dimensions // Find which dimension the current axis is representing var currentDimensionIndex = fullTrace._axesDim[ax._id]; // Apply logic to associated x axis if it's defined - if(axLetter === 'y') { + if(!isX) { var associatedXAxisID = fullTrace._diag[currentDimensionIndex][0]; if(associatedXAxisID) ax = gd._fullLayout[axisIDs.id2name(associatedXAxisID)]; } var categories = cdi.trace.dimensions[currentDimensionIndex].values; for(l = 0; l < categories.length; l++) { - cat = categories[l]; - catIndex = ax._categoriesMap[cat]; + catIndex = ax._categoriesMap[categories[l]]; // Collect associated values at index `l` over all other dimensions for(o = 0; o < cdi.trace.dimensions.length; o++) { @@ -3147,18 +3150,14 @@ function sortAxisCategoriesByValue(axList, gd) { categoriesValue[catIndex][1].push(dimension.values[l]); } } - } else if(type === 'scattergl') { + } else if(isScattergl) { // If `scattergl`, collect all values stashed under cdi.t for(l = 0; l < cdi.t.x.length; l++) { - if(axLetter === 'x') { - cat = cdi.t.x[l]; - catIndex = cat; + if(isX) { + catIndex = cdi.t.x[l]; value = cdi.t.y[l]; - } - - if(axLetter === 'y') { - cat = cdi.t.y[l]; - catIndex = cat; + } else { + catIndex = cdi.t.y[l]; value = cdi.t.x[l]; } categoriesValue[catIndex][1].push(value); @@ -3181,16 +3180,19 @@ function sortAxisCategoriesByValue(axList, gd) { } } else { // For all other 2d cartesian traces - if(axLetter === 'x') { - cat = cdi.p + 1 ? cdi.p : cdi.x; - value = cdi.s || cdi.v || cdi.y; - } else if(axLetter === 'y') { - cat = cdi.p + 1 ? cdi.p : cdi.y; - value = cdi.s || cdi.v || cdi.x; + catIndex = cdi.p; + if(catIndex === undefined) catIndex = cdi[axLetter]; + + value = cdi.s; + if(value === undefined) value = cdi.v; + if(value === undefined) value = isX ? cdi.y : cdi.x; + + if(!Array.isArray(value)) { + if(value === undefined) value = []; + else value = [value]; } - if(!Array.isArray(value)) value = [value]; for(l = 0; l < value.length; l++) { - categoriesValue[cat][1].push(value[l]); + categoriesValue[catIndex][1].push(value[l]); } } } From b95a0a5406787e8ed6ac91a9eec368c2116df43e Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 12 Nov 2020 12:29:16 -0500 Subject: [PATCH 2/2] add test to lock issue 5267 --- .../baselines/missing-category-order.png | Bin 0 -> 5388 bytes test/image/mocks/missing-category-order.json | 41 ++++++++++++++++++ test/jasmine/tests/mock_test.js | 2 + 3 files changed, 43 insertions(+) create mode 100644 test/image/baselines/missing-category-order.png create mode 100644 test/image/mocks/missing-category-order.json diff --git a/test/image/baselines/missing-category-order.png b/test/image/baselines/missing-category-order.png new file mode 100644 index 0000000000000000000000000000000000000000..de52a7cfc06653ee49391c5c12a0bee228cacbbf GIT binary patch literal 5388 zcmeHLc{tSnw?~#iSwo^?7==LyQT8PnA?w&18NQQ|DErQkEiyFrC6b-VU@TdhRF-K$ zOjEWbOSVw9vE0w}``+jI-uvgh_n&*8`_DX|`8? zSB(uU85kI$z;iE%75KHB9J66yI6i#UK-W6RWw`*AVl#q^60$hwpr`1_qsuA+N_v|{ zvenVJ_(4yfjq@Q!(MZRG@w!p^Ic3mgBVB`H3=iZ4n}L2$Z)nLm-ID^kth~D3%q)sA zmUk|NzNtEnJhnK|Mk^$&?%#G>FR6ZKPjg%h^C?0V`K236g7?H27(qcg#iFG3Vv{Ez zMi86{lx!5m!2Dc13jbVMAW@G2cyapwU;Ov{f#e%~Bx^Ub_U24ho=>N}(SwsL*FZW9 zOlItvSK)c8-dJ<39fKdEwaNH=T;cQaCcq$XKN z!Kj-f+FjhD(z492PYLIK;>t&oM#NqVIZw@e_I;583WbW~AC2P_N;*F3Pf+fV-;49r z22Z=sZ=ZW}XWX9>JWjmMrS|LVbxto}*#_TlMwJ$iV@^5UzFp_k8D{@ur24F^T^%%{ z+e%rFyR?V7yl~@EWCM3fce!@NN$P%N`v~oQn z_VP*?Ns3PIY|MRspf>Ta&bi$rB&2O-W~NtdGEBniscE94JP4MI6~^I?`!c@8r-&8? z&k8F}pC{z5jJLxIH2i03i4$0drdxfB^o!jZ|QG`JN?xm@B(YVQ)20PAc% zg(QkW<<4X17u6vtwX2jUmh|Q!!het0DWQfWgMYqYE3>P2*-;zl+*^mq%4{gtQ;?pX zu=apuciQH%Eqb`zoJe@$8o6&H0|X*XYq#Q2f%-_;TtVPWEVtIf9A!@&+>209dL^xY zez5f0C_ivhJ_PD2uaFWV$3CmI*}BeYkg^8sA!k!%{Y+Wu?(XPgeKypWX77V@DGYP( z3S{4FA3om?^spUmz3Umg@m6iQrlw-D(yH8jti?AV-sZC@G&f!s?%)7|!ID}YvM~>#P;J3Ru#{8qIq$x@iuVyY*!BCameP9wCB70 zXKAOitu9MIH;iLijgTJJvnO$_y|>*xJYeCwzn)QA$#KDi?dV|m^QqOX$w(q)fLw{x z{rZX^&V$2Ak%q8fc^yQ~96sd&8RfD%(NTtY86U}yYt6fO^YzhCp$}t*a91y(3Uk!gY zZF4x0pDK9y6%-Z=fJyTYn4(A~0ox#$BjV3Lai&>kl6mBw_1iKV57`L_G+vN2)XYmi z85h$#5b%`)-A&mC+tDy;PvBAIJJjV{V_&BWK-jSGu{Mw3=*l6H2F2={WfYrIJD=kPoc&oDnQAj(V z{K-83;`Q7MD7UTbygU)o`v$wNhc>2?$qV~$AI7-&#mGrqY+PshO4nDV+ ze+LD6tft(0?#p%>d(5`ZiMpr}&wO)i=v)SVy&+ru?$Zuf&}zq)-?2pnCb`k(1jqE4 zPao#?wYlAhOZ-d_z61w2z$An-uIP^y>El0%lM!C4e7VB5KvCfpBuzhzjZ$X1&N&dq zK1#0Wq^(?{z353vIZCtt(d_*Nm+zkBe9trfdyOac4hKK5lp;Y7u2{-B&8-eO8lypj zK42ipJg}IEOj{oj^?*CzdvtZo0l3eLz~*FE3LGR|>;7ssFT;tSQbi z*19tl1$AsT6_j&uXFn1Bdx>f_T4OJ$DYyxe13xNbGwA7;H;nDBs@Plt)QJ^1KE=w$Ke~j zF?6TU0RvPrLAo6qqbD=4i`@SxoBihv-1tUmt6d6!@Zi~??pE1Ue->cz>Du4KX3XeU zy-S*Rdl_at!eY~GZ_A{}P8Umlli^!^fZjL&*0Rot-Bn5tj;yuOJ3Nhm z99O$!#g}ju5JlsFd>Im2(1Z75F%m}+aiv`DzADj5oQt2H-Bj}bVNFA(@I`_Kswec} zE{|l9Sh) zi%ub6(htLcV+;01P*H=-Zh|;_E`LBc4OLv1SQx3cs|*uKnY6rRntdeo?e1#Dkk_+j zL+dpJr$@X%bJD{!ah?o3AaC|Xn|30L7>}@47=xh#Pd_k=*L=u~G2q||#*l{X2us>`CWA7bT7Uk1{o3sFS|I0S$f!5GvrIooRq~KB@ZfR-B(rTt1QwHX+VVHy*wNW>o zRiL8~P#O(@Y(Ra&Kfd5IA&L+fGy}-_XImc+j`AJ$dFCeHD8LYsnwrkdXetMOwVO}7ErI7 ze*H1zu2=n=cI8k{>uMOXWtVICw zI_W}D3tZ0uFXrKJv%gz-Y#EvI`2;7qDg*4SpL%SEqfIsE0uQ9I;bWfgSH7^OBNs+{`UVub@{2|Q+InL0NM`+mKDRg& z^S#c|`L-~k^@#}4`-ru8urBz-DCdOUtyEch!1?K@z)Apu2l~}`Tf5suG}v4iNHI0 z2R|7>yEaSCk#G%Liz`4r5LLHqXlTfX^u>z<9sUV=N}}g&YvAJA`@b?w3oomqD_^P5 z$vB}E=J;5TPZkH;-?$Y^R0-pW{AZ;u zq!}!e$I?$Lx?z5;j5})Fo4=u;o=ucJdEqZHK(Zv7#O`AfqP9r8^QCD$dsYOGYoX4y zuq=6TlE|br2gd-KO4b0hqcjW$O+E{83DZbD9VM~n9*T!@jH>cBrWE4a1l zkUI?C=>Je+m>lEr1AWL6=f5^>sF;@VvC0Ov`)lDFx=8nSOX$|hX2Hno2O?}atTZlO z#`-v<3rSVMWlpo_)&Vh?qbp*6S6olD%Q^)gaj@eVy6g3NqRK`#G%33#&~vrxFoN2M z$^h7{ha2p;o*P9WeSRKH=t#ZEbz?)BLZDAyX1mQ^yS@;n4aaUsUbe?xB>p z?AijBWjF<)c*@eYZa2?Q2RM)d%?d7*N~<@v8$f5jDIK;^WwEpVJ)@2kSC7b{JU$&X z#i%&_E;Ky7N07r4(1e+&jcn1t}1)%{8FDrB*_bw z4f}xOp8Mkc7j5mkB0BcZ3P;kmR)wt0?+$j*2Miy#fU1gDgV(jr=DLe2-IR%oB9a`M z(K*f;1HF|~@AJWcgJq?Q`ecHR4S=d$Izj@Bf(PV?lHR4O