From 2f9fa3b1a7fe4bebce8ce8726bcc39f5bf4f1261 Mon Sep 17 00:00:00 2001 From: Shumpei Shiina Date: Tue, 15 Oct 2019 23:14:02 -0500 Subject: [PATCH 1/5] Fix width of box plots with log-scale axis --- src/plots/cartesian/autorange.js | 29 +++++--- src/traces/box/cross_trace_calc.js | 4 +- src/traces/box/hover.js | 2 +- src/traces/box/plot.js | 27 +++---- test/image/baselines/box_log_scale.png | Bin 0 -> 16324 bytes test/image/mocks/box_log_scale.json | 94 +++++++++++++++++++++++++ 6 files changed, 130 insertions(+), 26 deletions(-) create mode 100644 test/image/baselines/box_log_scale.png create mode 100644 test/image/mocks/box_log_scale.json diff --git a/src/plots/cartesian/autorange.js b/src/plots/cartesian/autorange.js index 2b8a176d747..ca3b16805cb 100644 --- a/src/plots/cartesian/autorange.js +++ b/src/plots/cartesian/autorange.js @@ -298,6 +298,8 @@ function doAutoRange(gd, ax) { * (unless one end is overridden by tozero) * tozero: (boolean) make sure to include zero if axis is linear, * and make it a tight bound if possible + * vpadLinearized: (boolean) whether or not vpad (or vpadplus/vpadminus) + * is linearized (for log scale axes) * * @return {object} * - min {array of objects} @@ -320,6 +322,7 @@ function findExtremes(ax, data, opts) { var tozero = opts.tozero && (ax.type === 'linear' || ax.type === '-'); var isLog = ax.type === 'log'; var hasArrayOption = false; + var vpadLinearized = opts.vpadLinearized || false; var i, v, di, dmin, dmax, ppadiplus, ppadiminus, vmin, vmax; function makePadAccessor(item) { @@ -371,16 +374,22 @@ function findExtremes(ax, data, opts) { if(!isNumeric(di)) return; ppadiplus = ppadplus(i); ppadiminus = ppadminus(i); - vmin = di - vpadminus(i); - vmax = di + vpadplus(i); - // special case for log axes: if vpad makes this object span - // more than an order of mag, clip it to one order. This is so - // we don't have non-positive errors or absurdly large lower - // range due to rounding errors - if(isLog && vmin < vmax / 10) vmin = vmax / 10; - - dmin = ax.c2l(vmin); - dmax = ax.c2l(vmax); + + if(vpadLinearized) { + dmin = ax.c2l(di) - vpadminus(i); + dmax = ax.c2l(di) + vpadplus(i); + } else { + vmin = di - vpadminus(i); + vmax = di + vpadplus(i); + // special case for log axes: if vpad makes this object span + // more than an order of mag, clip it to one order. This is so + // we don't have non-positive errors or absurdly large lower + // range due to rounding errors + // if(isLog && vmin < vmax / 10) vmin = vmax / 10; + + dmin = ax.c2l(vmin); + dmax = ax.c2l(vmax); + } if(tozero) { dmin = Math.min(0, dmin); diff --git a/src/traces/box/cross_trace_calc.js b/src/traces/box/cross_trace_calc.js index a13f701c47b..b1792cb9794 100644 --- a/src/traces/box/cross_trace_calc.js +++ b/src/traces/box/cross_trace_calc.js @@ -60,7 +60,7 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { for(i = 0; i < boxList.length; i++) { calcTrace = calcdata[boxList[i]]; for(j = 0; j < calcTrace.length; j++) { - pointList.push(calcTrace[j].pos); + pointList.push(posAxis.c2l(calcTrace[j].pos, true)); shownPts += (calcTrace[j].pts2 || []).length; } } @@ -125,7 +125,6 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { t.bPos = bPos; t.bdPos = bdPos; t.wHover = wHover; - // box/violin-only value-space push value var pushplus; var pushminus; @@ -213,6 +212,7 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { padded: padded, vpadminus: vpadminus, vpadplus: vpadplus, + vpadLinearized: true, // N.B. SVG px-space positive/negative ppadminus: {x: ppadminus, y: ppadplus}[axLetter], ppadplus: {x: ppadplus, y: ppadminus}[axLetter], diff --git a/src/traces/box/hover.js b/src/traces/box/hover.js index 0eac65f7669..8e40188841b 100644 --- a/src/traces/box/hover.js +++ b/src/traces/box/hover.js @@ -60,7 +60,7 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) { var boxDelta = t.bdPos; var boxDeltaPos, boxDeltaNeg; var posAcceptance = t.wHover; - var shiftPos = function(di) { return di.pos + t.bPos - pVal; }; + var shiftPos = function(di) { return pAxis.c2l(di.pos) + t.bPos - pAxis.c2l(pVal); }; if(isViolin && trace.side !== 'both') { if(trace.side === 'positive') { diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index 3a1eefdfa85..1f6d3432c66 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -86,16 +86,16 @@ function plotBoxAndWhiskers(sel, axes, trace, t) { paths.each(function(d) { if(d.empty) return 'M0,0Z'; - var pos = d.pos; - var posc = posAxis.c2p(pos + bPos, true) + bPosPxOffset; - var pos0 = posAxis.c2p(pos + bPos - bdPos0, true) + bPosPxOffset; - var pos1 = posAxis.c2p(pos + bPos + bdPos1, true) + bPosPxOffset; - var posw0 = posAxis.c2p(pos + bPos - wdPos, true) + bPosPxOffset; - var posw1 = posAxis.c2p(pos + bPos + wdPos, true) + bPosPxOffset; - var posm0 = posAxis.c2p(pos + bPos - bdPos0 * nw, true) + bPosPxOffset; - var posm1 = posAxis.c2p(pos + bPos + bdPos1 * nw, true) + bPosPxOffset; - var q1 = valAxis.c2p(d.q1, true); - var q3 = valAxis.c2p(d.q3, true); + var lcenter = posAxis.c2l(d.pos + bPos, true); + var posc = posAxis.l2p(lcenter) + bPosPxOffset; + var pos0 = posAxis.l2p(lcenter - bdPos0) + bPosPxOffset; + var pos1 = posAxis.l2p(lcenter + bdPos1) + bPosPxOffset; + var posw0 = posAxis.l2p(lcenter - wdPos) + bPosPxOffset; + var posw1 = posAxis.l2p(lcenter + wdPos) + bPosPxOffset; + var posm0 = posAxis.l2p(lcenter - bdPos0 * nw) + bPosPxOffset; + var posm1 = posAxis.l2p(lcenter + bdPos1 * nw) + bPosPxOffset; + var q1 = valAxis.l2p(d.q1, true); + var q3 = valAxis.l2p(d.q3, true); // make sure median isn't identical to either of the // quartiles, so we can see it var m = Lib.constrain( @@ -288,9 +288,10 @@ function plotBoxMean(sel, axes, trace, t) { paths.exit().remove(); paths.each(function(d) { - var posc = posAxis.c2p(d.pos + bPos, true) + bPosPxOffset; - var pos0 = posAxis.c2p(d.pos + bPos - bdPos0, true) + bPosPxOffset; - var pos1 = posAxis.c2p(d.pos + bPos + bdPos1, true) + bPosPxOffset; + var lcenter = posAxis.c2l(d.pos + bPos, true); + var posc = posAxis.l2p(lcenter) + bPosPxOffset; + var pos0 = posAxis.l2p(lcenter - bdPos0) + bPosPxOffset; + var pos1 = posAxis.l2p(lcenter + bdPos1) + bPosPxOffset; var m = valAxis.c2p(d.mean, true); var sl = valAxis.c2p(d.mean - d.sd, true); var sh = valAxis.c2p(d.mean + d.sd, true); diff --git a/test/image/baselines/box_log_scale.png b/test/image/baselines/box_log_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f6995db35d70623f90ff806ba3010c1a2c9d3c GIT binary patch literal 16324 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 UDEY1M>wLCTx`sL#zg@ijUo>CdK>z>% literal 0 HcmV?d00001 diff --git a/test/image/mocks/box_log_scale.json b/test/image/mocks/box_log_scale.json new file mode 100644 index 00000000000..e9160f2e346 --- /dev/null +++ b/test/image/mocks/box_log_scale.json @@ -0,0 +1,94 @@ +{ + "data": [ + { + "y": [ + 1.0, + 1.1, + 1.0, + 0.9, + 1.2, + 2.0, + 1.5, + 2.3, + 1.7, + 2.2, + 1.0, + 1.1, + 1.2, + 0.9, + 1.1 + ], + "x": [ + 1, + 1, + 1, + 1, + 1, + 10, + 10, + 10, + 10, + 10, + 100, + 100, + 100, + 100, + 100 + ], + "type": "box" + }, + { + "y": [ + 2.2, + 2.3, + 2.0, + 2.5, + 2.1, + 0.1, + 0.5, + 0.8, + 0.3, + 0.3, + 1.1, + 1.2, + 0.9, + 1.0, + 1.0, + 2.4, + 2.0, + 1.5, + 1.6, + 1.9 + ], + "x": [ + 1, + 1, + 1, + 1, + 1, + 10, + 10, + 10, + 10, + 10, + 50, + 50, + 50, + 50, + 50, + 100, + 100, + 100, + 100, + 100 + ], + "type": "box", + "boxmean": true + } + ], + "layout": { + "xaxis": { + "type": "log" + } + } +} From 370e61a25005978d70f716ee38d391dbfa66e21a Mon Sep 17 00:00:00 2001 From: Shumpei Shiina Date: Wed, 16 Oct 2019 19:54:30 -0500 Subject: [PATCH 2/5] Don't use linearized values on value axes in box plots --- src/traces/box/plot.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index 1f6d3432c66..e6e6bec935e 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -94,8 +94,8 @@ function plotBoxAndWhiskers(sel, axes, trace, t) { var posw1 = posAxis.l2p(lcenter + wdPos) + bPosPxOffset; var posm0 = posAxis.l2p(lcenter - bdPos0 * nw) + bPosPxOffset; var posm1 = posAxis.l2p(lcenter + bdPos1 * nw) + bPosPxOffset; - var q1 = valAxis.l2p(d.q1, true); - var q3 = valAxis.l2p(d.q3, true); + var q1 = valAxis.c2p(d.q1, true); + var q3 = valAxis.c2p(d.q3, true); // make sure median isn't identical to either of the // quartiles, so we can see it var m = Lib.constrain( From 1876e8c5caaad78ca7d50fa0282c8e1c780b9d00 Mon Sep 17 00:00:00 2001 From: Shumpei Shiina Date: Tue, 22 Oct 2019 10:20:02 -0500 Subject: [PATCH 3/5] remove unnecessary commentout --- src/plots/cartesian/autorange.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plots/cartesian/autorange.js b/src/plots/cartesian/autorange.js index ca3b16805cb..0843b24666b 100644 --- a/src/plots/cartesian/autorange.js +++ b/src/plots/cartesian/autorange.js @@ -385,7 +385,7 @@ function findExtremes(ax, data, opts) { // more than an order of mag, clip it to one order. This is so // we don't have non-positive errors or absurdly large lower // range due to rounding errors - // if(isLog && vmin < vmax / 10) vmin = vmax / 10; + if(isLog && vmin < vmax / 10) vmin = vmax / 10; dmin = ax.c2l(vmin); dmax = ax.c2l(vmax); From 1e4aa7e9b0c58bde3466fbe7bb0933f9949f771d Mon Sep 17 00:00:00 2001 From: Shumpei Shiina Date: Tue, 22 Oct 2019 10:23:45 -0500 Subject: [PATCH 4/5] restore a deleted new line --- src/traces/box/cross_trace_calc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/traces/box/cross_trace_calc.js b/src/traces/box/cross_trace_calc.js index b1792cb9794..a56cc156f8a 100644 --- a/src/traces/box/cross_trace_calc.js +++ b/src/traces/box/cross_trace_calc.js @@ -125,6 +125,7 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { t.bPos = bPos; t.bdPos = bdPos; t.wHover = wHover; + // box/violin-only value-space push value var pushplus; var pushminus; From 349ef640517fc2429e8fb9364f7c30925507fddc Mon Sep 17 00:00:00 2001 From: Shumpei Shiina Date: Thu, 24 Oct 2019 20:53:59 -0500 Subject: [PATCH 5/5] Also fix violin traces --- src/traces/scatter/line_points.js | 4 +- src/traces/violin/plot.js | 11 +-- test/image/baselines/violin_log_scale.png | Bin 0 -> 25600 bytes test/image/mocks/violin_log_scale.json | 94 ++++++++++++++++++++++ 4 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 test/image/baselines/violin_log_scale.png create mode 100644 test/image/mocks/violin_log_scale.json diff --git a/src/traces/scatter/line_points.js b/src/traces/scatter/line_points.js index 2943f2673bb..89964c92ccd 100644 --- a/src/traces/scatter/line_points.js +++ b/src/traces/scatter/line_points.js @@ -67,8 +67,8 @@ module.exports = function linePoints(d, opts) { function getPt(index) { var di = d[index]; if(!di) return false; - var x = xa.c2p(di.x); - var y = ya.c2p(di.y); + var x = opts.linearized ? xa.l2p(di.x) : xa.c2p(di.x); + var y = opts.linearized ? ya.l2p(di.y) : ya.c2p(di.y); // if non-positive log values, set them VERY far off-screen // so the line looks essentially straight from the previous point. diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index a109fd6cab9..f6ca9ac738a 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -28,7 +28,8 @@ module.exports = function plot(gd, plotinfo, cdViolins, violinLayer) { connectGaps: true, baseTolerance: 0.75, shape: 'spline', - simplify: true + simplify: true, + linearized: true }); return Drawing.smoothopen(segments[0], 1); } @@ -64,8 +65,8 @@ module.exports = function plot(gd, plotinfo, cdViolins, violinLayer) { var pathSel = d3.select(this); var density = d.density; var len = density.length; - var posCenter = d.pos + bPos; - var posCenterPx = posAxis.c2p(posCenter); + var posCenter = posAxis.c2l(d.pos + bPos, true); + var posCenterPx = posAxis.l2p(posCenter); var scale; if(trace.width) { @@ -85,7 +86,7 @@ module.exports = function plot(gd, plotinfo, cdViolins, violinLayer) { for(i = 0; i < len; i++) { pt = pts[i] = {}; pt[t.posLetter] = posCenter + (density[i].v / scale); - pt[t.valLetter] = density[i].t; + pt[t.valLetter] = valAxis.c2l(density[i].t, true); } pathPos = makePath(pts); } @@ -95,7 +96,7 @@ module.exports = function plot(gd, plotinfo, cdViolins, violinLayer) { for(k = 0, i = len - 1; k < len; k++, i--) { pt = pts[k] = {}; pt[t.posLetter] = posCenter - (density[i].v / scale); - pt[t.valLetter] = density[i].t; + pt[t.valLetter] = valAxis.c2l(density[i].t, true); } pathNeg = makePath(pts); } diff --git a/test/image/baselines/violin_log_scale.png b/test/image/baselines/violin_log_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..774b9627036b2539af05824555537ec34423a7a0 GIT binary patch literal 25600 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 E0H%!4Y5)KL literal 0 HcmV?d00001 diff --git a/test/image/mocks/violin_log_scale.json b/test/image/mocks/violin_log_scale.json new file mode 100644 index 00000000000..08fc932aa8f --- /dev/null +++ b/test/image/mocks/violin_log_scale.json @@ -0,0 +1,94 @@ +{ + "data": [ + { + "y": [ + 1.0, + 1.1, + 1.0, + 0.9, + 1.2, + 2.0, + 1.5, + 2.3, + 1.7, + 2.2, + 1.0, + 1.1, + 1.2, + 0.9, + 1.1 + ], + "x": [ + 1, + 1, + 1, + 1, + 1, + 10, + 10, + 10, + 10, + 10, + 100, + 100, + 100, + 100, + 100 + ], + "type": "violin", + "box": { + "visible": true + }, + "meanline": { + "visible": true + }, + "side": "negative" + }, + { + "y": [ + 2.2, + 2.3, + 2.0, + 2.5, + 2.1, + 0.1, + 0.5, + 0.8, + 0.3, + 0.3, + 2.4, + 2.0, + 1.5, + 1.6, + 1.9 + ], + "x": [ + 1, + 1, + 1, + 1, + 1, + 10, + 10, + 10, + 10, + 10, + 100, + 100, + 100, + 100, + 100 + ], + "type": "violin", + "meanline": { + "visible": true + }, + "side": "positive" + } + ], + "layout": { + "xaxis": { + "type": "log" + } + } +}