From c578cde5466930bbc8f5ce8a00ee40eb794f8bfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 24 Oct 2017 11:53:28 -0400 Subject: [PATCH 01/25] replace gd.numboxes by fullLayout._numBoxes --- src/plots/plots.js | 5 ++--- src/traces/box/calc.js | 14 +++++++++----- src/traces/box/plot.js | 7 ++++--- src/traces/box/set_positions.js | 27 +++++++++++++++++---------- test/jasmine/tests/plots_test.js | 2 +- 5 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/plots/plots.js b/src/plots/plots.js index 03799b4c270..d9bbc1966c8 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -1342,7 +1342,6 @@ plots.purge = function(gd) { delete gd.firstscatter; delete gd._hmlumcount; delete gd._hmpixcount; - delete gd.numboxes; delete gd._transitionData; delete gd._transitioning; delete gd._initialAutoSize; @@ -2159,8 +2158,8 @@ plots.doCalcdata = function(gd, traces) { // firstscatter: fill-to-next on the first trace goes to zero gd.firstscatter = true; - // how many box plots do we have (in case they're grouped) - gd.numboxes = 0; + // how many box/violins plots do we have (in case they're grouped) + fullLayout._numBoxes = 0; // for calculating avg luminosity of heatmaps gd._hmpixcount = 0; diff --git a/src/traces/box/calc.js b/src/traces/box/calc.js index 601fd6a47b0..80364e419c0 100644 --- a/src/traces/box/calc.js +++ b/src/traces/box/calc.js @@ -15,11 +15,14 @@ var Axes = require('../../plots/cartesian/axes'); // outlier definition based on http://www.physics.csbsju.edu/stats/box2.html module.exports = function calc(gd, trace) { + var fullLayout = gd._fullLayout; var xa = Axes.getFromId(gd, trace.xaxis || 'x'); var ya = Axes.getFromId(gd, trace.yaxis || 'y'); var orientation = trace.orientation; var cd = []; + var numKey = '_numBoxes'; + var i; var valAxis, valLetter; var posAxis, posLetter; @@ -37,7 +40,7 @@ module.exports = function calc(gd, trace) { } var val = valAxis.makeCalcdata(trace, valLetter); - var pos = getPos(trace, posLetter, posAxis, val, gd.numboxes); + var pos = getPos(trace, posLetter, posAxis, val, fullLayout[numKey]); var dv = Lib.distinctVals(pos); var posDistinct = dv.vals; @@ -115,10 +118,11 @@ module.exports = function calc(gd, trace) { if(cd.length > 0) { cd[0].t = { - boxnum: gd.numboxes, + num: fullLayout[numKey], dPos: dPos }; - gd.numboxes++; + + fullLayout[numKey]++; return cd; } else { return [{t: {emptybox: true}}]; @@ -130,7 +134,7 @@ module.exports = function calc(gd, trace) { // so if you want one box // per trace, set x0 (y0) to the x (y) value or category for this trace // (or set x (y) to a constant array matching y (x)) -function getPos(trace, posLetter, posAxis, val, numboxes) { +function getPos(trace, posLetter, posAxis, val, num) { if(posLetter in trace) { return posAxis.makeCalcdata(trace, posLetter); } @@ -150,7 +154,7 @@ function getPos(trace, posLetter, posAxis, val, numboxes) { )) { pos0 = trace.name; } else { - pos0 = numboxes; + pos0 = num; } var pos0c = posAxis.d2c(pos0, 0, trace[posLetter + 'calendar']); diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index e3fbfd2b90a..4b81d31e418 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -49,12 +49,13 @@ module.exports = function plot(gd, plotinfo, cdbox) { var t = cd0.t; var trace = cd0.trace; var sel = cd0.node3 = d3.select(this); + var numBoxes = fullLayout._numBoxes; - var group = (fullLayout.boxmode === 'group' && gd.numboxes > 1); + var group = (fullLayout.boxmode === 'group' && numBoxes > 1); // box half width - var bdPos = t.dPos * (1 - fullLayout.boxgap) * (1 - fullLayout.boxgroupgap) / (group ? gd.numboxes : 1); + var bdPos = t.dPos * (1 - fullLayout.boxgap) * (1 - fullLayout.boxgroupgap) / (group ? numBoxes : 1); // box center offset - var bPos = group ? 2 * t.dPos * (-0.5 + (t.boxnum + 0.5) / gd.numboxes) * (1 - fullLayout.boxgap) : 0; + var bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numBoxes) * (1 - fullLayout.boxgap) : 0; // whisker width var wdPos = bdPos * trace.whiskerwidth; diff --git a/src/traces/box/set_positions.js b/src/traces/box/set_positions.js index 30580031d4b..fa590dc7a0c 100644 --- a/src/traces/box/set_positions.js +++ b/src/traces/box/set_positions.js @@ -14,10 +14,13 @@ var Lib = require('../../lib'); module.exports = function setPositions(gd, plotinfo) { - var fullLayout = gd._fullLayout, - xa = plotinfo.xaxis, - ya = plotinfo.yaxis, - orientations = ['v', 'h']; + var fullLayout = gd._fullLayout; + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + var orientations = ['v', 'h']; + + var numKey = '_numBoxes'; + var posAxis, i, j, k; for(i = 0; i < orientations.length; ++i) { @@ -63,12 +66,14 @@ module.exports = function setPositions(gd, plotinfo) { // box plots - update dPos based on multiple traces // and then use for posAxis autorange - var boxdv = Lib.distinctVals(boxpointlist), - dPos = boxdv.minDiff / 2; + var boxdv = Lib.distinctVals(boxpointlist); + var dPos = boxdv.minDiff / 2; // if there's no duplication of x points, - // disable 'group' mode by setting numboxes=1 - if(boxpointlist.length === boxdv.vals.length) gd.numboxes = 1; + // disable 'group' mode by setting counter to 1 + if(boxpointlist.length === boxdv.vals.length) { + fullLayout[numKey] = 1; + } // check for forced minimum dtick Axes.minDtick(posAxis, boxdv.minDiff, boxdv.vals[0], true); @@ -79,11 +84,13 @@ module.exports = function setPositions(gd, plotinfo) { gd.calcdata[boxListIndex][0].t.dPos = dPos; } + var gap = fullLayout.boxgap; + var groupgap = fullLayout.boxgroupgap; + // autoscale the x axis - including space for points if they're off the side // TODO: this will overdo it if the outermost boxes don't have // their points as far out as the other boxes - var padfactor = (1 - fullLayout.boxgap) * (1 - fullLayout.boxgroupgap) * - dPos / gd.numboxes; + var padfactor = (1 - gap) * (1 - groupgap) * dPos / fullLayout[numKey]; Axes.expand(posAxis, boxdv.vals, { vpadminus: dPos + minPad * padfactor, vpadplus: dPos + maxPad * padfactor diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js index d529b7363ed..355a7daf07b 100644 --- a/test/jasmine/tests/plots_test.js +++ b/test/jasmine/tests/plots_test.js @@ -435,7 +435,7 @@ describe('Test Plots', function() { var expectedUndefined = [ 'data', 'layout', '_fullData', '_fullLayout', 'calcdata', 'framework', 'empty', 'fid', 'undoqueue', 'undonum', 'autoplay', 'changed', - '_promises', '_redrawTimer', 'firstscatter', 'numboxes', + '_promises', '_redrawTimer', 'firstscatter', '_transitionData', '_transitioning', '_hmpixcount', '_hmlumcount', '_dragging', '_dragged', '_hoverdata', '_snapshotInProgress', '_editing', '_replotPending', '_mouseDownTime', '_legendMouseDownTime' From 8f342277fd25cb4a7d56662655ca84b32c101ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 24 Oct 2017 11:54:24 -0400 Subject: [PATCH 02/25] replace 'emptybox' with 'empty' in box calc item ... in preparation for violin --- src/traces/box/calc.js | 2 +- src/traces/box/plot.js | 2 +- src/traces/box/set_positions.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/traces/box/calc.js b/src/traces/box/calc.js index 80364e419c0..989c7a3f9b8 100644 --- a/src/traces/box/calc.js +++ b/src/traces/box/calc.js @@ -125,7 +125,7 @@ module.exports = function calc(gd, trace) { fullLayout[numKey]++; return cd; } else { - return [{t: {emptybox: true}}]; + return [{t: {empty: true}}]; } }; diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index 4b81d31e418..7c0542fe68a 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -59,7 +59,7 @@ module.exports = function plot(gd, plotinfo, cdbox) { // whisker width var wdPos = bdPos * trace.whiskerwidth; - if(trace.visible !== true || t.emptybox) { + if(trace.visible !== true || t.empty) { d3.select(this).remove(); return; } diff --git a/src/traces/box/set_positions.js b/src/traces/box/set_positions.js index fa590dc7a0c..399aec16adb 100644 --- a/src/traces/box/set_positions.js +++ b/src/traces/box/set_positions.js @@ -44,7 +44,7 @@ module.exports = function setPositions(gd, plotinfo) { trace = cd[0].trace; if(trace.visible === true && Registry.traceIs(trace, 'box') && - !t.emptybox && + !t.empty && trace.orientation === orientation && trace.xaxis === xa._id && trace.yaxis === ya._id) { From c8f38ff45e4052c3c817e1d507b0b045c3108fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 24 Oct 2017 12:02:16 -0400 Subject: [PATCH 03/25] factor out box defaults and boxpoint plot methods ... in preparation for violin --- src/traces/box/defaults.js | 43 +++++-- src/traces/box/index.js | 6 +- src/traces/box/layout_defaults.js | 24 ++-- src/traces/box/plot.js | 202 ++++++++++++++++-------------- 4 files changed, 158 insertions(+), 117 deletions(-) diff --git a/src/traces/box/defaults.js b/src/traces/box/defaults.js index 64a926e4af7..9ea8e7964af 100644 --- a/src/traces/box/defaults.js +++ b/src/traces/box/defaults.js @@ -14,11 +14,25 @@ var Color = require('../../components/color'); var attributes = require('./attributes'); -module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { +function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } + handleSampleDefaults(traceIn, traceOut, coerce, layout); + if(traceOut.visible === false) return; + + coerce('line.color', (traceIn.marker || {}).color || defaultColor); + coerce('line.width'); + coerce('fillcolor', Color.addOpacity(traceOut.line.color, 0.5)); + + coerce('whiskerwidth'); + coerce('boxmean'); + + handlePointsDefaults(traceIn, traceOut, coerce, {prefix: 'box'}); +} + +function handleSampleDefaults(traceIn, traceOut, coerce, layout) { var y = coerce('y'); var x = coerce('x'); @@ -39,25 +53,22 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout handleCalendarDefaults(traceIn, traceOut, ['x', 'y'], layout); coerce('orientation', defaultOrientation); +} - coerce('line.color', (traceIn.marker || {}).color || defaultColor); - coerce('line.width'); - coerce('fillcolor', Color.addOpacity(traceOut.line.color, 0.5)); - - coerce('whiskerwidth'); - coerce('boxmean'); +function handlePointsDefaults(traceIn, traceOut, coerce, opts) { + var prefix = opts.prefix; var outlierColorDflt = Lib.coerce2(traceIn, traceOut, attributes, 'marker.outliercolor'); var lineoutliercolor = coerce('marker.line.outliercolor'); - var boxpoints = coerce( - 'boxpoints', + var points = coerce( + prefix + 'points', (outlierColorDflt || lineoutliercolor) ? 'suspectedoutliers' : undefined ); - if(boxpoints) { - coerce('jitter', boxpoints === 'all' ? 0.3 : 0); - coerce('pointpos', boxpoints === 'all' ? -1.5 : 0); + if(points) { + coerce('jitter', points === 'all' ? 0.3 : 0); + coerce('pointpos', points === 'all' ? -1.5 : 0); coerce('marker.symbol'); coerce('marker.opacity'); @@ -66,7 +77,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('marker.line.color'); coerce('marker.line.width'); - if(boxpoints === 'suspectedoutliers') { + if(points === 'suspectedoutliers') { coerce('marker.line.outliercolor', traceOut.marker.color); coerce('marker.line.outlierwidth'); } @@ -77,4 +88,10 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('hoveron'); +} + +module.exports = { + supplyDefaults: supplyDefaults, + handleSampleDefaults: handleSampleDefaults, + handlePointsDefaults: handlePointsDefaults }; diff --git a/src/traces/box/index.js b/src/traces/box/index.js index 2294107883b..01cb930855d 100644 --- a/src/traces/box/index.js +++ b/src/traces/box/index.js @@ -12,11 +12,11 @@ var Box = {}; Box.attributes = require('./attributes'); Box.layoutAttributes = require('./layout_attributes'); -Box.supplyDefaults = require('./defaults'); -Box.supplyLayoutDefaults = require('./layout_defaults'); +Box.supplyDefaults = require('./defaults').supplyDefaults; +Box.supplyLayoutDefaults = require('./layout_defaults').supplyLayoutDefaults; Box.calc = require('./calc'); Box.setPositions = require('./set_positions'); -Box.plot = require('./plot'); +Box.plot = require('./plot').plot; Box.style = require('./style'); Box.hoverPoints = require('./hover'); Box.selectPoints = require('./select'); diff --git a/src/traces/box/layout_defaults.js b/src/traces/box/layout_defaults.js index 3213f703af8..f9daa6870ef 100644 --- a/src/traces/box/layout_defaults.js +++ b/src/traces/box/layout_defaults.js @@ -12,11 +12,7 @@ var Registry = require('../../registry'); var Lib = require('../../lib'); var layoutAttributes = require('./layout_attributes'); -module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { - function coerce(attr, dflt) { - return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt); - } - +function _supply(layoutIn, layoutOut, fullData, coerce, prefix) { var hasBoxes; for(var i = 0; i < fullData.length; i++) { if(Registry.traceIs(fullData[i], 'box')) { @@ -26,7 +22,19 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { } if(!hasBoxes) return; - coerce('boxmode'); - coerce('boxgap'); - coerce('boxgroupgap'); + coerce(prefix + 'mode'); + coerce(prefix + 'gap'); + coerce(prefix + 'groupgap'); +} + +function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { + function coerce(attr, dflt) { + return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt); + } + _supply(layoutIn, layoutOut, fullData, coerce, 'box'); +} + +module.exports = { + supplyLayoutDefaults: supplyLayoutDefaults, + _supply: _supply }; diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index 7c0542fe68a..76ccec6ae72 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -33,7 +33,7 @@ function rand() { var JITTERCOUNT = 5; // points either side of this to include var JITTERSPREAD = 0.01; // fraction of IQR to count as "dense" -module.exports = function plot(gd, plotinfo, cdbox) { +function plot(gd, plotinfo, cdbox) { var fullLayout = gd._fullLayout; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; @@ -78,9 +78,6 @@ module.exports = function plot(gd, plotinfo, cdbox) { t.bPos = bPos; t.bdPos = bdPos; - // repeatable pseudorandom number generator - seed(); - // boxes and whiskers sel.selectAll('path.box') .data(Lib.identity) @@ -121,95 +118,7 @@ module.exports = function plot(gd, plotinfo, cdbox) { // draw points, if desired if(trace.boxpoints) { - sel.selectAll('g.points') - // since box plot points get an extra level of nesting, each - // box needs the trace styling info - .data(function(d) { - d.forEach(function(v) { - v.t = t; - v.trace = trace; - }); - return d; - }) - .enter().append('g') - .attr('class', 'points') - .selectAll('path') - .data(function(d) { - var i; - - var pts = trace.boxpoints === 'all' ? - d.pts : - d.pts.filter(function(pt) { return (pt.v < d.lf || pt.v > d.uf); }); - - // normally use IQR, but if this is 0 or too small, use max-min - var typicalSpread = Math.max((d.max - d.min) / 10, d.q3 - d.q1); - var minSpread = typicalSpread * 1e-9; - var spreadLimit = typicalSpread * JITTERSPREAD; - var jitterFactors = []; - var maxJitterFactor = 0; - var newJitter; - - // dynamic jitter - if(trace.jitter) { - if(typicalSpread === 0) { - // edge case of no spread at all: fall back to max jitter - maxJitterFactor = 1; - jitterFactors = new Array(pts.length); - for(i = 0; i < pts.length; i++) { - jitterFactors[i] = 1; - } - } else { - for(i = 0; i < pts.length; i++) { - var i0 = Math.max(0, i - JITTERCOUNT); - var pmin = pts[i0].v; - var i1 = Math.min(pts.length - 1, i + JITTERCOUNT); - var pmax = pts[i1].v; - - if(trace.boxpoints !== 'all') { - if(pts[i].v < d.lf) pmax = Math.min(pmax, d.lf); - else pmin = Math.max(pmin, d.uf); - } - - var jitterFactor = Math.sqrt(spreadLimit * (i1 - i0) / (pmax - pmin + minSpread)) || 0; - jitterFactor = Lib.constrain(Math.abs(jitterFactor), 0, 1); - - jitterFactors.push(jitterFactor); - maxJitterFactor = Math.max(jitterFactor, maxJitterFactor); - } - } - newJitter = trace.jitter * 2 / maxJitterFactor; - } - - // fills in 'x' and 'y' in calcdata 'pts' item - for(i = 0; i < pts.length; i++) { - var pt = pts[i]; - var v = pt.v; - - var jitterOffset = trace.jitter ? - (newJitter * jitterFactors[i] * (rand() - 0.5)) : - 0; - - var posPx = d.pos + bPos + bdPos * (trace.pointpos + jitterOffset); - - if(trace.orientation === 'h') { - pt.y = posPx; - pt.x = v; - } else { - pt.x = posPx; - pt.y = v; - } - - // tag suspected outliers - if(trace.boxpoints === 'suspectedoutliers' && v < d.uo && v > d.lo) { - pt.so = true; - } - } - - return pts; - }) - .enter().append('path') - .classed('point', true) - .call(Drawing.translatePoints, xa, ya); + plotPoints(sel, plotinfo, trace, t); } // draw mean (and stdev diamond) if desired @@ -244,4 +153,111 @@ module.exports = function plot(gd, plotinfo, cdbox) { }); } }); +} + +function plotPoints(sel, plotinfo, trace, t) { + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + var bdPos = t.bdPos; + var bPos = t.bPos; + + var mode = trace.boxpoints; + + // repeatable pseudorandom number generator + seed(); + + sel.selectAll('g.points') + // since box plot points get an extra level of nesting, each + // box needs the trace styling info + .data(function(d) { + d.forEach(function(v) { + v.t = t; + v.trace = trace; + }); + return d; + }) + .enter().append('g') + .attr('class', 'points') + .selectAll('path') + .data(function(d) { + var i; + + var pts = mode === 'all' ? + d.pts : + d.pts.filter(function(pt) { return (pt.v < d.lf || pt.v > d.uf); }); + + // normally use IQR, but if this is 0 or too small, use max-min + var typicalSpread = Math.max((d.max - d.min) / 10, d.q3 - d.q1); + var minSpread = typicalSpread * 1e-9; + var spreadLimit = typicalSpread * JITTERSPREAD; + var jitterFactors = []; + var maxJitterFactor = 0; + var newJitter; + + // dynamic jitter + if(trace.jitter) { + if(typicalSpread === 0) { + // edge case of no spread at all: fall back to max jitter + maxJitterFactor = 1; + jitterFactors = new Array(pts.length); + for(i = 0; i < pts.length; i++) { + jitterFactors[i] = 1; + } + } else { + for(i = 0; i < pts.length; i++) { + var i0 = Math.max(0, i - JITTERCOUNT); + var pmin = pts[i0].v; + var i1 = Math.min(pts.length - 1, i + JITTERCOUNT); + var pmax = pts[i1].v; + + if(mode !== 'all') { + if(pts[i].v < d.lf) pmax = Math.min(pmax, d.lf); + else pmin = Math.max(pmin, d.uf); + } + + var jitterFactor = Math.sqrt(spreadLimit * (i1 - i0) / (pmax - pmin + minSpread)) || 0; + jitterFactor = Lib.constrain(Math.abs(jitterFactor), 0, 1); + + jitterFactors.push(jitterFactor); + maxJitterFactor = Math.max(jitterFactor, maxJitterFactor); + } + } + newJitter = trace.jitter * 2 / maxJitterFactor; + } + + // fills in 'x' and 'y' in calcdata 'pts' item + for(i = 0; i < pts.length; i++) { + var pt = pts[i]; + var v = pt.v; + + var jitterOffset = trace.jitter ? + (newJitter * jitterFactors[i] * (rand() - 0.5)) : + 0; + + var posPx = d.pos + bPos + bdPos * (trace.pointpos + jitterOffset); + + if(trace.orientation === 'h') { + pt.y = posPx; + pt.x = v; + } else { + pt.x = posPx; + pt.y = v; + } + + // tag suspected outliers + if(mode === 'suspectedoutliers' && v < d.uo && v > d.lo) { + pt.so = true; + } + } + + return pts; + }) + .enter().append('path') + .classed('point', true) + .call(Drawing.translatePoints, xa, ya); +} + +module.exports = { + plot: plot, + plotPoints: plotPoints }; From 3438eae9199ef5df36a907ccb3b8b54ad16fcd6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 24 Oct 2017 12:07:15 -0400 Subject: [PATCH 04/25] first cut violin --- lib/index-cartesian.js | 3 +- lib/index.js | 7 +- lib/violin.js | 11 +++ src/plots/cartesian/constants.js | 9 +- src/plots/plots.js | 1 + src/traces/box/plot.js | 3 +- src/traces/box/set_positions.js | 9 +- src/traces/violin/attributes.js | 113 +++++++++++++++++++++++++ src/traces/violin/calc.js | 75 ++++++++++++++++ src/traces/violin/defaults.js | 36 ++++++++ src/traces/violin/index.js | 40 +++++++++ src/traces/violin/layout_attributes.js | 19 +++++ src/traces/violin/layout_defaults.js | 20 +++++ src/traces/violin/plot.js | 92 ++++++++++++++++++++ src/traces/violin/style.js | 31 +++++++ 15 files changed, 455 insertions(+), 14 deletions(-) create mode 100644 lib/violin.js create mode 100644 src/traces/violin/attributes.js create mode 100644 src/traces/violin/calc.js create mode 100644 src/traces/violin/defaults.js create mode 100644 src/traces/violin/index.js create mode 100644 src/traces/violin/layout_attributes.js create mode 100644 src/traces/violin/layout_defaults.js create mode 100644 src/traces/violin/plot.js create mode 100644 src/traces/violin/style.js diff --git a/lib/index-cartesian.js b/lib/index-cartesian.js index 4d07f5f5f09..5818a717748 100644 --- a/lib/index-cartesian.js +++ b/lib/index-cartesian.js @@ -19,7 +19,8 @@ Plotly.register([ require('./histogram2dcontour'), require('./pie'), require('./contour'), - require('./scatterternary') + require('./scatterternary'), + require('./violin') ]); module.exports = Plotly; diff --git a/lib/index.js b/lib/index.js index b64ed888557..7dac73a1f64 100644 --- a/lib/index.js +++ b/lib/index.js @@ -21,7 +21,7 @@ Plotly.register([ require('./pie'), require('./contour'), require('./scatterternary'), - require('./sankey'), + require('./violin'), require('./scatter3d'), require('./surface'), @@ -34,10 +34,13 @@ Plotly.register([ require('./pointcloud'), require('./heatmapgl'), require('./parcoords'), - require('./table'), require('./scattermapbox'), + require('./sankey'), + + require('./table'), + require('./carpet'), require('./scattercarpet'), require('./contourcarpet'), diff --git a/lib/violin.js b/lib/violin.js new file mode 100644 index 00000000000..d1d0ea51c3f --- /dev/null +++ b/lib/violin.js @@ -0,0 +1,11 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +module.exports = require('../src/traces/violin'); diff --git a/src/plots/cartesian/constants.js b/src/plots/cartesian/constants.js index b44235855a2..6edfe4fcb9f 100644 --- a/src/plots/cartesian/constants.js +++ b/src/plots/cartesian/constants.js @@ -57,18 +57,13 @@ module.exports = { DFLTRANGEX: [-1, 6], DFLTRANGEY: [-1, 4], - // Layers to keep trace types in the right order. - // from back to front: - // 1. heatmaps, 2D histos and contour maps - // 2. bars / 1D histos - // 3. errorbars for bars and scatter - // 4. scatter - // 5. box plots + // Layers to keep trace types in the right order traceLayerClasses: [ 'imagelayer', 'maplayer', 'barlayer', 'carpetlayer', + 'violinlayer', 'boxlayer', 'scatterlayer' ], diff --git a/src/plots/plots.js b/src/plots/plots.js index d9bbc1966c8..6422242fdc9 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -2160,6 +2160,7 @@ plots.doCalcdata = function(gd, traces) { // how many box/violins plots do we have (in case they're grouped) fullLayout._numBoxes = 0; + fullLayout._numViolins = 0; // for calculating avg luminosity of heatmaps gd._hmpixcount = 0; diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index 76ccec6ae72..4463770863e 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -161,7 +161,8 @@ function plotPoints(sel, plotinfo, trace, t) { var bdPos = t.bdPos; var bPos = t.bPos; - var mode = trace.boxpoints; + // TODO ... unfortunately + var mode = trace.boxpoints || trace.points; // repeatable pseudorandom number generator seed(); diff --git a/src/traces/box/set_positions.js b/src/traces/box/set_positions.js index 399aec16adb..65846100cf5 100644 --- a/src/traces/box/set_positions.js +++ b/src/traces/box/set_positions.js @@ -12,13 +12,14 @@ var Registry = require('../../registry'); var Axes = require('../../plots/cartesian/axes'); var Lib = require('../../lib'); - module.exports = function setPositions(gd, plotinfo) { var fullLayout = gd._fullLayout; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; var orientations = ['v', 'h']; + // TODO figure this out + // should violins and boxes share 'num' fields? var numKey = '_numBoxes'; var posAxis, i, j, k; @@ -84,8 +85,10 @@ module.exports = function setPositions(gd, plotinfo) { gd.calcdata[boxListIndex][0].t.dPos = dPos; } - var gap = fullLayout.boxgap; - var groupgap = fullLayout.boxgroupgap; + // TODO this won't work when both boxes and violins are present + // on same graph + var gap = fullLayout.boxgap || fullLayout.violingap; + var groupgap = fullLayout.boxgroupgap || fullLayout.violingroupgap; // autoscale the x axis - including space for points if they're off the side // TODO: this will overdo it if the outermost boxes don't have diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js new file mode 100644 index 00000000000..91b10e06a7a --- /dev/null +++ b/src/traces/violin/attributes.js @@ -0,0 +1,113 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var boxAttrs = require('../box/attributes'); +var scatterAttrs = require('../scatter/attributes'); +var extendFlat = require('../../lib/extend').extendFlat; + +module.exports = { + y: boxAttrs.y, + x: boxAttrs.x, + x0: boxAttrs.x0, + y0: boxAttrs.y0, + name: boxAttrs.name, + orientation: extendFlat({}, boxAttrs.orientation, { + description: [ + 'Sets the orientation of the violin(s).', + 'If *v* (*h*), the distribution is visualized along', + 'the vertical (horizontal).' + ].join(' ') + }), + + bandwidth: { + valType: 'number', + min: 0, + role: 'info', + editType: 'plot', + description: [ + 'Sets the bandwidth used to compute the kernel density estimate.', + 'By default, the bandwidth is determined by Silverman\'s rule of thumb.' + ].join(' ') + }, + scaleby: { + valType: 'enumerated', + values: ['width', 'area', 'count'], + dflt: 'width', + role: 'info', + editType: 'calc', + description: [ + 'Sets the method by which the width of each violin is determined.', + '*width* means each violin has the same (max) width', + '*area* means each violin has the same area', + '*count* means the violins are scaled by the number of sample points making', + 'up each violin.' + ].join('') + }, + span: { + valType: 'info_array', + items: [ + {valType: 'any', editType: 'plot'}, + {valType: 'any', editType: 'plot'} + ], + role: 'info', + editType: 'plot', + description: [ + 'Sets the span in data space for which the density function will be computed.', + 'By default, the span goes from the minimum value to maximum value in the sample.' + ].join(' ') + }, + side: { + valType: 'enumerated', + values: ['both', 'left', 'right'], + dflt: 'both', + role: 'info', + editType: 'plot', + description: [ + 'Determines which side of the position line the density function making up', + 'one half of a is plotting.', + 'Useful when comparing two violin traces under *overlay* mode, where one trace.' + ].join(' ') + }, + + // TODO update description + points: boxAttrs.boxpoints, + jitter: boxAttrs.jitter, + pointpos: boxAttrs.pointpos, + marker: boxAttrs.marker, + text: boxAttrs.text, + + // TODO need attribute(s) similar to 'boxmean' to toggle lines for: + // - mean + // - median + // - std + // - quartiles + + line: { + color: { + valType: 'color', + role: 'style', + editType: 'style', + description: 'Sets the color of line bounding the violin(s).' + }, + width: { + valType: 'number', + role: 'style', + min: 0, + dflt: 2, + editType: 'style', + description: 'Sets the width (in px) of line bounding the violin(s).' + }, + smoothing: scatterAttrs.line.smoothing, + editType: 'plot' + }, + + fillcolor: boxAttrs.fillcolor, + hoveron: boxAttrs.hoveron +}; diff --git a/src/traces/violin/calc.js b/src/traces/violin/calc.js new file mode 100644 index 00000000000..ac7af521079 --- /dev/null +++ b/src/traces/violin/calc.js @@ -0,0 +1,75 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var Lib = require('../../lib'); +var boxCalc = require('../box/calc'); + +var kernels = { + gaussian: function(v) { + return (1 / Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * v * v); + } +}; + +module.exports = function calc(gd, trace) { + var cd = boxCalc(gd, trace); + + if(cd[0].t.empty) return cd; + + for(var i = 0; i < cd.length; i++) { + var cdi = cd[i]; + var vals = cdi.pts.map(extractVal); + var len = vals.length; + var span = trace.span || [cdi.min, cdi.max]; + var dist = span[1] - span[0]; + // sample standard deviation + var ssd = Lib.stdev(vals, len - 1, cdi.mean); + var bandwidthDflt = ruleOfThumbBandwidth(vals, ssd, cdi.q3 - cdi.q1); + var bandwidth = trace.bandwidth || bandwidthDflt; + var kde = makeKDE(vals, kernels.gaussian, bandwidth); + // step that well covers the bandwidth and is multiple of span distance + var n = Math.ceil(dist / (Math.min(bandwidthDflt, bandwidth) / 3)); + var step = dist / n; + + cdi.density = new Array(n); + cdi.violinMaxWidth = 0; + + for(var k = 0, t = span[0]; t < (span[1] + step / 2); k++, t += step) { + var v = kde(t); + cdi.violinMaxWidth = Math.max(cdi.violinMaxWidth, v); + cdi.density[k] = {v: v, t: t}; + } + } + + return cd; +}; + +// Default to Silveman's rule of thumb: +// - https://en.wikipedia.org/wiki/Kernel_density_estimation#A_rule-of-thumb_bandwidth_estimator +// - https://github.com/statsmodels/statsmodels/blob/master/statsmodels/nonparametric/bandwidths.py +function ruleOfThumbBandwidth(vals, ssd, iqr) { + var a = Math.min(ssd, iqr / 1.349); + return 1.059 * a * Math.pow(vals.length, -0.2); +} + +function makeKDE(vals, kernel, bandwidth) { + var len = vals.length; + var factor = 1 / (len * bandwidth); + + // don't use Lib.aggNums to skip isNumeric checks + return function(x) { + var sum = 0; + for(var i = 0; i < len; i++) { + sum += kernel((x - vals[i]) / bandwidth); + } + return factor * sum; + }; +} + +function extractVal(o) { return o.v; } diff --git a/src/traces/violin/defaults.js b/src/traces/violin/defaults.js new file mode 100644 index 00000000000..9f881051cb2 --- /dev/null +++ b/src/traces/violin/defaults.js @@ -0,0 +1,36 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var Lib = require('../../lib'); +var Color = require('../../components/color'); + +var boxDefaults = require('../box/defaults'); +var attributes = require('./attributes'); + +module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { + function coerce(attr, dflt) { + return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); + } + + boxDefaults.handleSampleDefaults(traceIn, traceOut, coerce, layout); + if(traceOut.visible === false) return; + + coerce('bandwidth'); + coerce('scaleby'); + coerce('span'); + coerce('side'); + + coerce('line.color', (traceIn.marker || {}).color || defaultColor); + coerce('line.width'); + coerce('line.smoothing'); + coerce('fillcolor', Color.addOpacity(traceOut.line.color, 0.5)); + + boxDefaults.handlePointsDefaults(traceIn, traceOut, coerce, {prefix: ''}); +}; diff --git a/src/traces/violin/index.js b/src/traces/violin/index.js new file mode 100644 index 00000000000..5872f3a53fe --- /dev/null +++ b/src/traces/violin/index.js @@ -0,0 +1,40 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +module.exports = { + attributes: require('./attributes'), + layoutAttributes: require('./layout_attributes'), + supplyDefaults: require('./defaults'), + supplyLayoutDefaults: require('./layout_defaults'), + calc: require('./calc'), + setPositions: require('../box/set_positions'), + plot: require('./plot'), + style: require('./style'), + hoverPoints: require('../box/hover'), + selectPoints: require('../box/select'), + + moduleType: 'trace', + name: 'violin', + basePlotModule: require('../../plots/cartesian'), + // TODO + // - should maybe rename 'box' category to something more general + categories: ['cartesian', 'symbols', 'oriented', 'box', 'showLegend'], + meta: { + description: [ + 'In vertical (horizontal) violin plots,', + 'statistics are computed using `y` (`x`) values.', + 'By supplying an `x` (`y`) array, one violin per distinct x (y) value', + 'is drawn', + 'If no `x` (`y`) {array} is provided, a single violin is drawn.', + 'That violin position is then positioned with', + 'with `name` or with `x0` (`y0`) if provided.' + ].join(' ') + } +}; diff --git a/src/traces/violin/layout_attributes.js b/src/traces/violin/layout_attributes.js new file mode 100644 index 00000000000..90adb472163 --- /dev/null +++ b/src/traces/violin/layout_attributes.js @@ -0,0 +1,19 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var boxLayoutAttrs = require('../box/layout_attributes'); + +// TODO update descriptions +// ... or maybe just reuse box* attributes? +module.exports = { + violinmode: boxLayoutAttrs.boxmode, + violingap: boxLayoutAttrs.boxgap, + violingroupgap: boxLayoutAttrs.boxgroupgap +}; diff --git a/src/traces/violin/layout_defaults.js b/src/traces/violin/layout_defaults.js new file mode 100644 index 00000000000..28352b7ec95 --- /dev/null +++ b/src/traces/violin/layout_defaults.js @@ -0,0 +1,20 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var Lib = require('../../lib'); +var layoutAttributes = require('./layout_attributes'); +var boxLayoutDefaults = require('../box/layout_defaults'); + +module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { + function coerce(attr, dflt) { + return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt); + } + boxLayoutDefaults._supply(layoutIn, layoutOut, fullData, coerce, 'violin'); +}; diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js new file mode 100644 index 00000000000..dd31720eed3 --- /dev/null +++ b/src/traces/violin/plot.js @@ -0,0 +1,92 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var d3 = require('d3'); +var Lib = require('../../lib'); +var Drawing = require('../../components/drawing'); +var boxPlot = require('../box/plot'); +var linePoints = require('../scatter/line_points'); + +module.exports = function plot(gd, plotinfo, cd) { + var fullLayout = gd._fullLayout; + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + + var traces = plotinfo.plot.select('.violinlayer') + .selectAll('g.trace.violins') + .data(cd) + .enter().append('g') + .attr('class', 'trace violins'); + + traces.each(function(d) { + var cd0 = d[0]; + var t = cd0.t; + var trace = cd0.trace; + var sel = cd0.node3 = d3.select(this); + var numViolins = fullLayout._numBoxes; + var group = (fullLayout.violinmode === 'group' && numViolins > 1); + // violin max half width + var bdPos = t.bdPos = t.dPos * (1 - fullLayout.violingap) * (1 - fullLayout.violingroupgap) / (group ? numViolins : 1); + // violin center offset + var bPos = t.bPos = group ? 2 * t.dPos * (-0.5 + (t.num + 0.5) / numViolins) * (1 - fullLayout.violingap) : 0; + + if(trace.visible !== true || t.empty) { + d3.select(this).remove(); + return; + } + + sel.selectAll('path.violin') + .data(Lib.identity) + .enter().append('path') + .style('vector-effect', 'non-scaling-stroke') + .attr('class', 'violin') + .each(function(d) { + var density = d.density; + var lineData = []; + var i; + + // TODO add scale by 'area' and by 'count' + var scale = d.violinMaxWidth / bdPos; + + // TODO add support for one-sided violins + for(i = 0; i < density.length; i++) { + lineData.push({ + x: d.pos + bPos + (density[i].v / scale), + y: density[i].t + }); + } + for(i--; i >= 0; i--) { + lineData.push({ + x: d.pos + bPos - (density[i].v / scale), + y: density[i].t + }); + } + + var segments = linePoints(lineData, { + xaxis: xa, + yaxis: ya, + connectGaps: true, + baseTolerance: 0.75, + shape: 'spline', + simplify: true + }); + + var path = Drawing.smoothclosed(segments[0], trace.line.smoothing); + + d3.select(this).attr('d', path); + }); + + if(trace.points) { + boxPlot.plotPoints(sel, plotinfo, trace, t); + } + + // TODO quartile line etc + }); +}; diff --git a/src/traces/violin/style.js b/src/traces/violin/style.js new file mode 100644 index 00000000000..315dc13fa93 --- /dev/null +++ b/src/traces/violin/style.js @@ -0,0 +1,31 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var d3 = require('d3'); +var Drawing = require('../../components/drawing'); +var Color = require('../../components/color'); + +module.exports = function style(gd) { + var traces = d3.select(gd).selectAll('g.trace.violins'); + + traces.style('opacity', function(d) { return d[0].trace.opacity; }) + .each(function(d) { + var trace = d[0].trace; + var sel = d3.select(this); + + sel.selectAll('path.violin') + .style('stroke-width', '2px') + .call(Color.stroke, trace.line.color) + .call(Color.fill, trace.fillcolor); + + sel.selectAll('g.points path') + .call(Drawing.pointStyle, trace, gd); + }); +}; From d77950990ecb395d894babfffd18c7e90916755c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 24 Oct 2017 12:07:24 -0400 Subject: [PATCH 05/25] first cut violin mocks --- test/image/baselines/violin_grouped.png | Bin 0 -> 36549 bytes test/image/baselines/violin_old-faithful.png | Bin 0 -> 41740 bytes test/image/mocks/violin_grouped.json | 74 +++++++++++++++++++ test/image/mocks/violin_old-faithful.json | 7 ++ 4 files changed, 81 insertions(+) create mode 100644 test/image/baselines/violin_grouped.png create mode 100644 test/image/baselines/violin_old-faithful.png create mode 100644 test/image/mocks/violin_grouped.json create mode 100644 test/image/mocks/violin_old-faithful.json diff --git a/test/image/baselines/violin_grouped.png b/test/image/baselines/violin_grouped.png new file mode 100644 index 0000000000000000000000000000000000000000..54454cd6cf1fe2a7ac4de8b6f4679e0dbf740830 GIT binary patch literal 36549 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 X34Ij7#y3s`{;4WGx?g_RBKZFSd#sH1 literal 0 HcmV?d00001 diff --git a/test/image/baselines/violin_old-faithful.png b/test/image/baselines/violin_old-faithful.png new file mode 100644 index 0000000000000000000000000000000000000000..f36a86e15feb30cf1d723d790dc0b44808a588bc GIT binary patch literal 41740 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 z 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

py*0FQ9Po%zLxcp*8Rc`_4IFPAZ27cO#9hDa9 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 Date: Mon, 30 Oct 2017 22:50:41 -0400 Subject: [PATCH 06/25] rename 'box' category 'box-violin' --- src/components/legend/style.js | 2 +- src/components/modebar/manage.js | 4 ++-- src/plots/cartesian/type_defaults.js | 4 ++-- src/traces/box/index.js | 2 +- src/traces/box/set_positions.js | 2 +- src/traces/violin/index.js | 4 +--- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/components/legend/style.js b/src/components/legend/style.js index c6037e79d07..08199c2a888 100644 --- a/src/components/legend/style.js +++ b/src/components/legend/style.js @@ -197,7 +197,7 @@ module.exports = function style(s, gd) { var trace = d[0].trace, pts = d3.select(this).select('g.legendpoints') .selectAll('path.legendbox') - .data(Registry.traceIs(trace, 'box') && trace.visible ? [d] : []); + .data(Registry.traceIs(trace, 'box-violin') && trace.visible ? [d] : []); pts.enter().append('path').classed('legendbox', true) // if we want the median bar, prepend M6,0H-6 .attr('d', 'M6,6H-6V-6H6Z') diff --git a/src/components/modebar/manage.js b/src/components/modebar/manage.js index 783d1bb7f49..bedee3dcb7d 100644 --- a/src/components/modebar/manage.js +++ b/src/components/modebar/manage.js @@ -179,8 +179,8 @@ function isSelectable(fullData) { if(scatterSubTypes.hasMarkers(trace) || scatterSubTypes.hasText(trace)) { selectable = true; } - } else if(Registry.traceIs(trace, 'box')) { - if(trace.boxpoints === 'all') { + } else if(Registry.traceIs(trace, 'box-violin')) { + if(trace.boxpoints === 'all' || trace.points === 'all') { selectable = true; } } diff --git a/src/plots/cartesian/type_defaults.js b/src/plots/cartesian/type_defaults.js index a82712763dd..fa68995066f 100644 --- a/src/plots/cartesian/type_defaults.js +++ b/src/plots/cartesian/type_defaults.js @@ -75,7 +75,7 @@ function setAutoType(ax, data) { for(var i = 0; i < data.length; i++) { trace = data[i]; - if(!Registry.traceIs(trace, 'box') || + if(!Registry.traceIs(trace, 'box-violin') || (trace[axLetter + 'axis'] || axLetter) !== id) continue; if(trace[posLetter] !== undefined) boxPositions.push(trace[posLetter][0]); @@ -113,7 +113,7 @@ function getBoxPosLetter(trace) { function isBoxWithoutPositionCoords(trace, axLetter) { var posLetter = getBoxPosLetter(trace), - isBox = Registry.traceIs(trace, 'box'), + isBox = Registry.traceIs(trace, 'box-violin'), isCandlestick = Registry.traceIs(trace._fullInput || {}, 'candlestick'); return ( diff --git a/src/traces/box/index.js b/src/traces/box/index.js index 01cb930855d..a36dabe1301 100644 --- a/src/traces/box/index.js +++ b/src/traces/box/index.js @@ -24,7 +24,7 @@ Box.selectPoints = require('./select'); Box.moduleType = 'trace'; Box.name = 'box'; Box.basePlotModule = require('../../plots/cartesian'); -Box.categories = ['cartesian', 'symbols', 'oriented', 'box', 'showLegend']; +Box.categories = ['cartesian', 'symbols', 'oriented', 'box-violin', 'showLegend']; Box.meta = { description: [ 'In vertical (horizontal) box plots,', diff --git a/src/traces/box/set_positions.js b/src/traces/box/set_positions.js index 65846100cf5..a81e7a525da 100644 --- a/src/traces/box/set_positions.js +++ b/src/traces/box/set_positions.js @@ -44,7 +44,7 @@ module.exports = function setPositions(gd, plotinfo) { t = cd[0].t; trace = cd[0].trace; - if(trace.visible === true && Registry.traceIs(trace, 'box') && + if(trace.visible === true && trace.type === 'box' && !t.empty && trace.orientation === orientation && trace.xaxis === xa._id && diff --git a/src/traces/violin/index.js b/src/traces/violin/index.js index 5872f3a53fe..e21b4e81d05 100644 --- a/src/traces/violin/index.js +++ b/src/traces/violin/index.js @@ -23,9 +23,7 @@ module.exports = { moduleType: 'trace', name: 'violin', basePlotModule: require('../../plots/cartesian'), - // TODO - // - should maybe rename 'box' category to something more general - categories: ['cartesian', 'symbols', 'oriented', 'box', 'showLegend'], + categories: ['cartesian', 'symbols', 'oriented', 'box-violin', 'showLegend'], meta: { description: [ 'In vertical (horizontal) violin plots,', From a706f2a1dbf8b7b680181e61402bdc9d8f600ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 22:54:31 -0400 Subject: [PATCH 07/25] factor out box/whiskers and mean/sd plotting routine - to make them reusable in violin/plot.js - add support for asymmetric bdPos to support one-sided violins --- src/traces/box/plot.js | 194 ++++++++++++++++++++++++++--------------- 1 file changed, 123 insertions(+), 71 deletions(-) diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index 4463770863e..8050953a13f 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -64,8 +64,8 @@ function plot(gd, plotinfo, cdbox) { return; } - // set axis via orientation var posAxis, valAxis; + if(trace.orientation === 'h') { posAxis = ya; valAxis = xa; @@ -77,91 +77,90 @@ function plot(gd, plotinfo, cdbox) { // save the box size and box position for use by hover t.bPos = bPos; t.bdPos = bdPos; + t.wdPos = wdPos; // boxes and whiskers - sel.selectAll('path.box') - .data(Lib.identity) - .enter().append('path') - .style('vector-effect', 'non-scaling-stroke') - .attr('class', 'box') - .each(function(d) { - var posc = posAxis.c2p(d.pos + bPos, true), - pos0 = posAxis.c2p(d.pos + bPos - bdPos, true), - pos1 = posAxis.c2p(d.pos + bPos + bdPos, true), - posw0 = posAxis.c2p(d.pos + bPos - wdPos, true), - posw1 = posAxis.c2p(d.pos + bPos + wdPos, true), - q1 = valAxis.c2p(d.q1, true), - q3 = valAxis.c2p(d.q3, true), - // make sure median isn't identical to either of the - // quartiles, so we can see it - m = Lib.constrain(valAxis.c2p(d.med, true), - Math.min(q1, q3) + 1, Math.max(q1, q3) - 1), - lf = valAxis.c2p(trace.boxpoints === false ? d.min : d.lf, true), - uf = valAxis.c2p(trace.boxpoints === false ? d.max : d.uf, true); - - if(trace.orientation === 'h') { - d3.select(this).attr('d', - 'M' + m + ',' + pos0 + 'V' + pos1 + // median line - 'M' + q1 + ',' + pos0 + 'V' + pos1 + 'H' + q3 + 'V' + pos0 + 'Z' + // box - 'M' + q1 + ',' + posc + 'H' + lf + 'M' + q3 + ',' + posc + 'H' + uf + // whiskers - ((trace.whiskerwidth === 0) ? '' : // whisker caps - 'M' + lf + ',' + posw0 + 'V' + posw1 + 'M' + uf + ',' + posw0 + 'V' + posw1)); - } else { - d3.select(this).attr('d', - 'M' + pos0 + ',' + m + 'H' + pos1 + // median line - 'M' + pos0 + ',' + q1 + 'H' + pos1 + 'V' + q3 + 'H' + pos0 + 'Z' + // box - 'M' + posc + ',' + q1 + 'V' + lf + 'M' + posc + ',' + q3 + 'V' + uf + // whiskers - ((trace.whiskerwidth === 0) ? '' : // whisker caps - 'M' + posw0 + ',' + lf + 'H' + posw1 + 'M' + posw0 + ',' + uf + 'H' + posw1)); - } - }); + plotBoxAndWhiskers(sel, {pos: posAxis, val: valAxis}, trace, t); // draw points, if desired if(trace.boxpoints) { - plotPoints(sel, plotinfo, trace, t); + plotPoints(sel, {x: xa, y: ya}, trace, t); } // draw mean (and stdev diamond) if desired if(trace.boxmean) { - sel.selectAll('path.mean') - .data(Lib.identity) - .enter().append('path') - .attr('class', 'mean') - .style({ - fill: 'none', - 'vector-effect': 'non-scaling-stroke' - }) - .each(function(d) { - var posc = posAxis.c2p(d.pos + bPos, true), - pos0 = posAxis.c2p(d.pos + bPos - bdPos, true), - pos1 = posAxis.c2p(d.pos + bPos + bdPos, true), - m = valAxis.c2p(d.mean, true), - sl = valAxis.c2p(d.mean - d.sd, true), - sh = valAxis.c2p(d.mean + d.sd, true); - if(trace.orientation === 'h') { - d3.select(this).attr('d', - 'M' + m + ',' + pos0 + 'V' + pos1 + - ((trace.boxmean !== 'sd') ? '' : - 'm0,0L' + sl + ',' + posc + 'L' + m + ',' + pos0 + 'L' + sh + ',' + posc + 'Z')); - } - else { - d3.select(this).attr('d', - 'M' + pos0 + ',' + m + 'H' + pos1 + - ((trace.boxmean !== 'sd') ? '' : - 'm0,0L' + posc + ',' + sl + 'L' + pos0 + ',' + m + 'L' + posc + ',' + sh + 'Z')); - } - }); + plotBoxMean(sel, {pos: posAxis, val: valAxis}, trace, t); } }); } -function plotPoints(sel, plotinfo, trace, t) { - var xa = plotinfo.xaxis; - var ya = plotinfo.yaxis; +function plotBoxAndWhiskers(sel, axes, trace, t) { + var posAxis = axes.pos; + var valAxis = axes.val; + var bPos = t.bPos; + var wdPos = t.wdPos || 0; + var bPosPxOffset = t.bPosPxOffset || 0; + var whiskerWidth = trace.whiskerwidth || 0; + + // to support for one-sided box + var bdPos0; + var bdPos1; + if(Array.isArray(t.bdPos)) { + bdPos0 = t.bdPos[0]; + bdPos1 = t.bdPos[1]; + } else { + bdPos0 = t.bdPos; + bdPos1 = t.bdPos; + } + + sel.selectAll('path.box') + .data(Lib.identity) + .enter().append('path') + .style('vector-effect', 'non-scaling-stroke') + .attr('class', 'box') + .each(function(d) { + 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 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( + valAxis.c2p(d.med, true), + Math.min(q1, q3) + 1, Math.max(q1, q3) - 1 + ); + var lf = valAxis.c2p(trace.boxpoints === false ? d.min : d.lf, true); + var uf = valAxis.c2p(trace.boxpoints === false ? d.max : d.uf, true); + + if(trace.orientation === 'h') { + d3.select(this).attr('d', + 'M' + m + ',' + pos0 + 'V' + pos1 + // median line + 'M' + q1 + ',' + pos0 + 'V' + pos1 + 'H' + q3 + 'V' + pos0 + 'Z' + // box + 'M' + q1 + ',' + posc + 'H' + lf + 'M' + q3 + ',' + posc + 'H' + uf + // whiskers + ((whiskerWidth === 0) ? '' : // whisker caps + 'M' + lf + ',' + posw0 + 'V' + posw1 + 'M' + uf + ',' + posw0 + 'V' + posw1)); + } else { + d3.select(this).attr('d', + 'M' + pos0 + ',' + m + 'H' + pos1 + // median line + 'M' + pos0 + ',' + q1 + 'H' + pos1 + 'V' + q3 + 'H' + pos0 + 'Z' + // box + 'M' + posc + ',' + q1 + 'V' + lf + 'M' + posc + ',' + q3 + 'V' + uf + // whiskers + ((whiskerWidth === 0) ? '' : // whisker caps + 'M' + posw0 + ',' + lf + 'H' + posw1 + 'M' + posw0 + ',' + uf + 'H' + posw1)); + } + }); +} + +function plotPoints(sel, axes, trace, t) { + var xa = axes.x; + var ya = axes.y; var bdPos = t.bdPos; var bPos = t.bPos; - // TODO ... unfortunately + // to support violin innerbox var mode = trace.boxpoints || trace.points; // repeatable pseudorandom number generator @@ -258,7 +257,60 @@ function plotPoints(sel, plotinfo, trace, t) { .call(Drawing.translatePoints, xa, ya); } +function plotBoxMean(sel, axes, trace, t) { + var posAxis = axes.pos; + var valAxis = axes.val; + var bPos = t.bPos; + var bPosPxOffset = t.bPosPxOffset || 0; + + // to support for one-sided box + var bdPos0; + var bdPos1; + if(Array.isArray(t.bdPos)) { + bdPos0 = t.bdPos[0]; + bdPos1 = t.bdPos[1]; + } else { + bdPos0 = t.bdPos; + bdPos1 = t.bdPos; + } + + sel.selectAll('path.mean') + .data(Lib.identity) + .enter().append('path') + .attr('class', 'mean') + .style({ + fill: 'none', + 'vector-effect': 'non-scaling-stroke' + }) + .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 m = valAxis.c2p(d.mean, true); + var sl = valAxis.c2p(d.mean - d.sd, true); + var sh = valAxis.c2p(d.mean + d.sd, true); + + if(trace.orientation === 'h') { + d3.select(this).attr('d', + 'M' + m + ',' + pos0 + 'V' + pos1 + + (trace.boxmean === 'sd' ? + 'm0,0L' + sl + ',' + posc + 'L' + m + ',' + pos0 + 'L' + sh + ',' + posc + 'Z' : + '') + ); + } else { + d3.select(this).attr('d', + 'M' + pos0 + ',' + m + 'H' + pos1 + + (trace.boxmean === 'sd' ? + 'm0,0L' + posc + ',' + sl + 'L' + pos0 + ',' + m + 'L' + posc + ',' + sh + 'Z' : + '') + ); + } + }); +} + module.exports = { plot: plot, - plotPoints: plotPoints + plotBoxAndWhiskers: plotBoxAndWhiskers, + plotPoints: plotPoints, + plotBoxMean: plotBoxMean }; From 1eb453b63e7e0ef854f07842935040a53e5c5d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:05:01 -0400 Subject: [PATCH 08/25] split box hover into onBoxes and onPoints routines - to reuse in violin hover --- src/traces/box/hover.js | 334 +++++++++++++++++++++------------------- src/traces/box/index.js | 2 +- 2 files changed, 177 insertions(+), 159 deletions(-) diff --git a/src/traces/box/hover.js b/src/traces/box/hover.js index d3668a44575..7f1ac5e501d 100644 --- a/src/traces/box/hover.js +++ b/src/traces/box/hover.js @@ -14,190 +14,208 @@ var Fx = require('../../components/fx'); var Color = require('../../components/color'); var fillHoverText = require('../scatter/fill_hover_text'); -module.exports = function hoverPoints(pointData, xval, yval, hovermode) { +function hoverPoints(pointData, xval, yval, hovermode) { var cd = pointData.cd; - var xa = pointData.xa; - var ya = pointData.ya; - var trace = cd[0].trace; var hoveron = trace.hoveron; - var marker = trace.marker || {}; - - // output hover points components var closeBoxData = []; var closePtData; - // x/y/effective distance functions - var dx, dy, distfn; - // orientation-specific fields - var posLetter, valLetter, posAxis, valAxis; - // calcdata item - var di; - // loop indices - var i, j; if(hoveron.indexOf('boxes') !== -1) { - var t = cd[0].t; - - // closest mode: handicap box plots a little relative to others - // adjust inbox w.r.t. to calculate box size - var boxDelta = (hovermode === 'closest') ? 2.5 * t.bdPos : t.bdPos; - - if(trace.orientation === 'h') { - dx = function(di) { - return Fx.inbox(di.min - xval, di.max - xval); - }; - dy = function(di) { - var pos = di.pos + t.bPos - yval; - return Fx.inbox(pos - boxDelta, pos + boxDelta); - }; - posLetter = 'y'; - posAxis = ya; - valLetter = 'x'; - valAxis = xa; - } else { - dx = function(di) { - var pos = di.pos + t.bPos - xval; - return Fx.inbox(pos - boxDelta, pos + boxDelta); - }; - dy = function(di) { - return Fx.inbox(di.min - yval, di.max - yval); - }; - posLetter = 'x'; - posAxis = xa; - valLetter = 'y'; - valAxis = ya; - } - - distfn = Fx.getDistanceFunction(hovermode, dx, dy); - Fx.getClosest(cd, distfn, pointData); + closeBoxData = closeBoxData.concat(hoverOnBoxes(pointData, xval, yval, hovermode)); + } - // skip the rest (for this trace) if we didn't find a close point - // and create the item(s) in closedata for this point - if(pointData.index !== false) { - di = cd[pointData.index]; + if(hoveron.indexOf('points') !== -1) { + closePtData = hoverOnPoints(pointData, xval, yval); + } - var lc = trace.line.color; - var mc = marker.color; + // If there's a point in range and hoveron has points, show the best single point only. + // If hoveron has boxes and there's no point in range (or hoveron doesn't have points), show the box stats. + if(hovermode === 'closest') { + if(closePtData) return [closePtData]; + return closeBoxData; + } - if(Color.opacity(lc) && trace.line.width) pointData.color = lc; - else if(Color.opacity(mc) && trace.boxpoints) pointData.color = mc; - else pointData.color = trace.fillcolor; + // Otherwise in compare mode, allow a point AND the box stats to be labeled + // If there are multiple boxes in range (ie boxmode = 'overlay') we'll see stats for all of them. + if(closePtData) { + closeBoxData.push(closePtData); + return closeBoxData; + } + return closeBoxData; +} - pointData[posLetter + '0'] = posAxis.c2p(di.pos + t.bPos - t.bdPos, true); - pointData[posLetter + '1'] = posAxis.c2p(di.pos + t.bPos + t.bdPos, true); +function hoverOnBoxes(pointData, xval, yval, hovermode) { + var cd = pointData.cd; + var xa = pointData.xa; + var ya = pointData.ya; + var trace = cd[0].trace; + var t = cd[0].t; + var closeBoxData = []; - Axes.tickText(posAxis, posAxis.c2l(di.pos), 'hover').text; - pointData[posLetter + 'LabelVal'] = di.pos; + var pLetter, vLetter, pAxis, vAxis, vVal, pVal, dx, dy; + + // closest mode: handicap box plots a little relative to others + // adjust inbox w.r.t. to calculate box size + var boxDelta = (hovermode === 'closest') ? 2.5 * t.bdPos : t.bdPos; + var shiftPos = function(di) { return di.pos + t.bPos - pVal; }; + + var dPos = function(di) { + var pos = shiftPos(di); + return Fx.inbox(pos - boxDelta, pos + boxDelta); + }; + + var dVal = function(di) { + return Fx.inbox(di.min - vVal, di.max - vVal); + }; + + if(trace.orientation === 'h') { + vVal = xval; + pVal = yval; + dx = dVal; + dy = dPos; + pLetter = 'y'; + pAxis = ya; + vLetter = 'x'; + vAxis = xa; + } else { + vVal = yval; + pVal = xval; + dx = dPos; + dy = dVal; + pLetter = 'x'; + pAxis = xa; + vLetter = 'y'; + vAxis = ya; + } - // box plots: each "point" gets many labels - var usedVals = {}; - var attrs = ['med', 'min', 'q1', 'q3', 'max']; - var prefixes = ['median', 'min', 'q1', 'q3', 'max']; + var distfn = Fx.getDistanceFunction(hovermode, dx, dy); + Fx.getClosest(cd, distfn, pointData); - if(trace.boxmean) { - attrs.push('mean'); - prefixes.push(trace.boxmean === 'sd' ? 'mean ± σ' : 'mean'); - } - if(trace.boxpoints) { - attrs.push('lf', 'uf'); - prefixes.push('lower fence', 'upper fence'); - } + // skip the rest (for this trace) if we didn't find a close point + // and create the item(s) in closedata for this point + if(pointData.index === false) return []; - for(i = 0; i < attrs.length; i++) { - var attr = attrs[i]; + var di = cd[pointData.index]; + var lc = trace.line.color; + var mc = (trace.marker || {}).color; - if(!(attr in di) || (di[attr] in usedVals)) continue; - usedVals[di[attr]] = true; + if(Color.opacity(lc) && trace.line.width) pointData.color = lc; + else if(Color.opacity(mc) && trace.boxpoints) pointData.color = mc; + else pointData.color = trace.fillcolor; - // copy out to a new object for each value to label - var val = di[attr]; - var valPx = valAxis.c2p(val, true); - var pointData2 = Lib.extendFlat({}, pointData); + pointData[pLetter + '0'] = pAxis.c2p(di.pos + t.bPos - t.bdPos, true); + pointData[pLetter + '1'] = pAxis.c2p(di.pos + t.bPos + t.bdPos, true); - pointData2[valLetter + '0'] = pointData2[valLetter + '1'] = valPx; - pointData2[valLetter + 'LabelVal'] = val; - pointData2[valLetter + 'Label'] = prefixes[i] + ': ' + Axes.hoverLabelText(valAxis, val); + Axes.tickText(pAxis, pAxis.c2l(di.pos), 'hover').text; + pointData[pLetter + 'LabelVal'] = di.pos; - if(attr === 'mean' && ('sd' in di) && trace.boxmean === 'sd') { - pointData2[valLetter + 'err'] = di.sd; - } - // only keep name on the first item (median) - pointData.name = ''; + // box plots: each "point" gets many labels + var usedVals = {}; + var attrs = ['med', 'min', 'q1', 'q3', 'max']; + var prefixes = ['median', 'min', 'q1', 'q3', 'max']; - closeBoxData.push(pointData2); - } - } + if(trace.boxmean) { + attrs.push('mean'); + prefixes.push(trace.boxmean === 'sd' ? 'mean ± σ' : 'mean'); + } + if(trace.boxpoints) { + attrs.push('lf', 'uf'); + prefixes.push('lower fence', 'upper fence'); } - if(hoveron.indexOf('points') !== -1) { - var xPx = xa.c2p(xval); - var yPx = ya.c2p(yval); - - dx = function(di) { - var rad = Math.max(3, di.mrc || 0); - return Math.max(Math.abs(xa.c2p(di.x) - xPx) - rad, 1 - 3 / rad); - }; - dy = function(di) { - var rad = Math.max(3, di.mrc || 0); - return Math.max(Math.abs(ya.c2p(di.y) - yPx) - rad, 1 - 3 / rad); - }; - distfn = Fx.quadrature(dx, dy); - - // show one point per trace - var ijClosest = false; - var pt; - - for(i = 0; i < cd.length; i++) { - di = cd[i]; - - for(j = 0; j < (di.pts || []).length; j++) { - pt = di.pts[j]; - - var newDistance = distfn(pt); - if(newDistance <= pointData.distance) { - pointData.distance = newDistance; - ijClosest = [i, j]; - } - } - } + for(var i = 0; i < attrs.length; i++) { + var attr = attrs[i]; + + if(!(attr in di) || (di[attr] in usedVals)) continue; + usedVals[di[attr]] = true; + + // copy out to a new object for each value to label + var val = di[attr]; + var valPx = vAxis.c2p(val, true); + var pointData2 = Lib.extendFlat({}, pointData); + + pointData2[vLetter + '0'] = pointData2[vLetter + '1'] = valPx; + pointData2[vLetter + 'LabelVal'] = val; + pointData2[vLetter + 'Label'] = prefixes[i] + ': ' + Axes.hoverLabelText(vAxis, val); - if(ijClosest) { - di = cd[ijClosest[0]]; - pt = di.pts[ijClosest[1]]; - - var xc = xa.c2p(pt.x, true); - var yc = ya.c2p(pt.y, true); - var rad = pt.mrc || 1; - - closePtData = Lib.extendFlat({}, pointData, { - // corresponds to index in x/y input data array - index: pt.i, - color: marker.color, - name: trace.name, - x0: xc - rad, - x1: xc + rad, - xLabelVal: pt.x, - y0: yc - rad, - y1: yc + rad, - yLabelVal: pt.y - }); - fillHoverText(pt, trace, closePtData); + if(attr === 'mean' && ('sd' in di) && trace.boxmean === 'sd') { + pointData2[vLetter + 'err'] = di.sd; } - } + // only keep name on the first item (median) + pointData.name = ''; - // In closest mode, show only one point or stats for one box, and points have priority - // If there's a point in range and hoveron has points, show the best single point only. - // If hoveron has boxes and there's no point in range (or hoveron doesn't have points), show the box stats. - if(hovermode === 'closest') { - if(closePtData) return [closePtData]; - return closeBoxData; + closeBoxData.push(pointData2); } - // Otherwise in compare mode, allow a point AND the box stats to be labeled - // If there are multiple boxes in range (ie boxmode = 'overlay') we'll see stats for all of them. - if(closePtData) { - closeBoxData.push(closePtData); - return closeBoxData; - } return closeBoxData; +} + +function hoverOnPoints(pointData, xval, yval) { + var cd = pointData.cd; + var xa = pointData.xa; + var ya = pointData.ya; + var trace = cd[0].trace; + var xPx = xa.c2p(xval); + var yPx = ya.c2p(yval); + var closePtData; + + var dx = function(di) { + var rad = Math.max(3, di.mrc || 0); + return Math.max(Math.abs(xa.c2p(di.x) - xPx) - rad, 1 - 3 / rad); + }; + var dy = function(di) { + var rad = Math.max(3, di.mrc || 0); + return Math.max(Math.abs(ya.c2p(di.y) - yPx) - rad, 1 - 3 / rad); + }; + var distfn = Fx.quadrature(dx, dy); + + // show one point per trace + var ijClosest = false; + var di, pt; + + for(var i = 0; i < cd.length; i++) { + di = cd[i]; + + for(var j = 0; j < (di.pts || []).length; j++) { + pt = di.pts[j]; + + var newDistance = distfn(pt); + if(newDistance <= pointData.distance) { + pointData.distance = newDistance; + ijClosest = [i, j]; + } + } + } + + if(!ijClosest) return false; + + di = cd[ijClosest[0]]; + pt = di.pts[ijClosest[1]]; + + var xc = xa.c2p(pt.x, true); + var yc = ya.c2p(pt.y, true); + var rad = pt.mrc || 1; + + closePtData = Lib.extendFlat({}, pointData, { + // corresponds to index in x/y input data array + index: pt.i, + color: (trace.marker || {}).color, + name: trace.name, + x0: xc - rad, + x1: xc + rad, + xLabelVal: pt.x, + y0: yc - rad, + y1: yc + rad, + yLabelVal: pt.y + }); + fillHoverText(pt, trace, closePtData); + + return closePtData; +} + +module.exports = { + hoverPoints: hoverPoints, + hoverOnBoxes: hoverOnBoxes, + hoverOnPoints: hoverOnPoints }; diff --git a/src/traces/box/index.js b/src/traces/box/index.js index a36dabe1301..6a8a3411a83 100644 --- a/src/traces/box/index.js +++ b/src/traces/box/index.js @@ -18,7 +18,7 @@ Box.calc = require('./calc'); Box.setPositions = require('./set_positions'); Box.plot = require('./plot').plot; Box.style = require('./style'); -Box.hoverPoints = require('./hover'); +Box.hoverPoints = require('./hover').hoverPoints; Box.selectPoints = require('./select'); Box.moduleType = 'trace'; From 7769f203a5b7697f682b6c5df19bc65677b72827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:10:01 -0400 Subject: [PATCH 09/25] implement violinmode, violingroup and violingroupgap - totally indenpendent from their box* counterpart --- src/traces/box/calc.js | 10 +- src/traces/box/index.js | 2 +- src/traces/box/layout_defaults.js | 17 ++-- src/traces/box/set_positions.js | 133 +++++++++++++------------ src/traces/violin/index.js | 2 +- src/traces/violin/layout_attributes.js | 1 - src/traces/violin/plot.js | 2 +- src/traces/violin/set_positions.js | 48 +++++++++ 8 files changed, 135 insertions(+), 80 deletions(-) create mode 100644 src/traces/violin/set_positions.js diff --git a/src/traces/box/calc.js b/src/traces/box/calc.js index 989c7a3f9b8..2f79e0c368c 100644 --- a/src/traces/box/calc.js +++ b/src/traces/box/calc.js @@ -18,16 +18,16 @@ module.exports = function calc(gd, trace) { var fullLayout = gd._fullLayout; var xa = Axes.getFromId(gd, trace.xaxis || 'x'); var ya = Axes.getFromId(gd, trace.yaxis || 'y'); - var orientation = trace.orientation; var cd = []; - var numKey = '_numBoxes'; + // N.B. violin reuses same Box.calc + var numKey = trace.type === 'violin' ? '_numViolins' : '_numBoxes'; var i; var valAxis, valLetter; var posAxis, posLetter; - if(orientation === 'h') { + if(trace.orientation === 'h') { valAxis = xa; valLetter = 'x'; posAxis = ya; @@ -119,7 +119,9 @@ module.exports = function calc(gd, trace) { if(cd.length > 0) { cd[0].t = { num: fullLayout[numKey], - dPos: dPos + dPos: dPos, + posLetter: posLetter, + valLetter: valLetter }; fullLayout[numKey]++; diff --git a/src/traces/box/index.js b/src/traces/box/index.js index 6a8a3411a83..3d094a2034b 100644 --- a/src/traces/box/index.js +++ b/src/traces/box/index.js @@ -15,7 +15,7 @@ Box.layoutAttributes = require('./layout_attributes'); Box.supplyDefaults = require('./defaults').supplyDefaults; Box.supplyLayoutDefaults = require('./layout_defaults').supplyLayoutDefaults; Box.calc = require('./calc'); -Box.setPositions = require('./set_positions'); +Box.setPositions = require('./set_positions').setPositions; Box.plot = require('./plot').plot; Box.style = require('./style'); Box.hoverPoints = require('./hover').hoverPoints; diff --git a/src/traces/box/layout_defaults.js b/src/traces/box/layout_defaults.js index f9daa6870ef..4cd9c2b62e3 100644 --- a/src/traces/box/layout_defaults.js +++ b/src/traces/box/layout_defaults.js @@ -8,23 +8,22 @@ 'use strict'; -var Registry = require('../../registry'); var Lib = require('../../lib'); var layoutAttributes = require('./layout_attributes'); -function _supply(layoutIn, layoutOut, fullData, coerce, prefix) { - var hasBoxes; +function _supply(layoutIn, layoutOut, fullData, coerce, traceType) { + var hasTraceType; for(var i = 0; i < fullData.length; i++) { - if(Registry.traceIs(fullData[i], 'box')) { - hasBoxes = true; + if(fullData[i].type === traceType) { + hasTraceType = true; break; } } - if(!hasBoxes) return; + if(!hasTraceType) return; - coerce(prefix + 'mode'); - coerce(prefix + 'gap'); - coerce(prefix + 'groupgap'); + coerce(traceType + 'mode'); + coerce(traceType + 'gap'); + coerce(traceType + 'groupgap'); } function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { diff --git a/src/traces/box/set_positions.js b/src/traces/box/set_positions.js index a81e7a525da..f0a6221b638 100644 --- a/src/traces/box/set_positions.js +++ b/src/traces/box/set_positions.js @@ -8,48 +8,37 @@ 'use strict'; -var Registry = require('../../registry'); var Axes = require('../../plots/cartesian/axes'); var Lib = require('../../lib'); -module.exports = function setPositions(gd, plotinfo) { - var fullLayout = gd._fullLayout; +var orientations = ['v', 'h']; + +function setPositions(gd, plotinfo) { + var calcdata = gd.calcdata; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var orientations = ['v', 'h']; - - // TODO figure this out - // should violins and boxes share 'num' fields? - var numKey = '_numBoxes'; - - var posAxis, i, j, k; - for(i = 0; i < orientations.length; ++i) { - var orientation = orientations[i], - boxlist = [], - boxpointlist = [], - minPad = 0, - maxPad = 0, - cd, - t, - trace; - - // set axis via orientation - if(orientation === 'h') posAxis = ya; - else posAxis = xa; + for(var i = 0; i < orientations.length; i++) { + var orientation = orientations[i]; + var posAxis = orientation === 'h' ? ya : xa; + var boxList = []; + var minPad = 0; + var maxPad = 0; // make list of boxes - for(j = 0; j < gd.calcdata.length; ++j) { - cd = gd.calcdata[j]; - t = cd[0].t; - trace = cd[0].trace; + for(var j = 0; j < calcdata.length; j++) { + var cd = calcdata[j]; + var t = cd[0].t; + var trace = cd[0].trace; if(trace.visible === true && trace.type === 'box' && !t.empty && trace.orientation === orientation && trace.xaxis === xa._id && - trace.yaxis === ya._id) { - boxlist.push(j); + trace.yaxis === ya._id + ) { + boxList.push(j); + if(trace.boxpoints !== false) { minPad = Math.max(minPad, trace.jitter - trace.pointpos - 1); maxPad = Math.max(maxPad, trace.jitter + trace.pointpos - 1); @@ -57,46 +46,64 @@ module.exports = function setPositions(gd, plotinfo) { } } - // make list of box points - for(j = 0; j < boxlist.length; j++) { - cd = gd.calcdata[boxlist[j]]; - for(k = 0; k < cd.length; k++) boxpointlist.push(cd[k].pos); - } - if(!boxpointlist.length) continue; + setPositionOffset('box', gd, boxList, posAxis, [minPad, maxPad]); + } +} - // box plots - update dPos based on multiple traces - // and then use for posAxis autorange +function setPositionOffset(traceType, gd, boxList, posAxis, pad) { + var calcdata = gd.calcdata; + var fullLayout = gd._fullLayout; + var pointList = []; + + // N.B. reused in violin + var numKey = traceType === 'violin' ? '_numViolins' : '_numBoxes'; - var boxdv = Lib.distinctVals(boxpointlist); - var dPos = boxdv.minDiff / 2; + var i, j, calcTrace; - // if there's no duplication of x points, - // disable 'group' mode by setting counter to 1 - if(boxpointlist.length === boxdv.vals.length) { - fullLayout[numKey] = 1; + // make list of box points + for(i = 0; i < boxList.length; i++) { + calcTrace = calcdata[boxList[i]]; + for(j = 0; j < calcTrace.length; j++) { + pointList.push(calcTrace[j].pos); } + } - // check for forced minimum dtick - Axes.minDtick(posAxis, boxdv.minDiff, boxdv.vals[0], true); + if(!pointList.length) return; - // set the width of all boxes - for(i = 0; i < boxlist.length; i++) { - var boxListIndex = boxlist[i]; - gd.calcdata[boxListIndex][0].t.dPos = dPos; - } + // box plots - update dPos based on multiple traces + // and then use for posAxis autorange + var boxdv = Lib.distinctVals(pointList); + var dPos = boxdv.minDiff / 2; - // TODO this won't work when both boxes and violins are present - // on same graph - var gap = fullLayout.boxgap || fullLayout.violingap; - var groupgap = fullLayout.boxgroupgap || fullLayout.violingroupgap; - - // autoscale the x axis - including space for points if they're off the side - // TODO: this will overdo it if the outermost boxes don't have - // their points as far out as the other boxes - var padfactor = (1 - gap) * (1 - groupgap) * dPos / fullLayout[numKey]; - Axes.expand(posAxis, boxdv.vals, { - vpadminus: dPos + minPad * padfactor, - vpadplus: dPos + maxPad * padfactor - }); + // if there's no duplication of x points, + // disable 'group' mode by setting counter to 1 + if(pointList.length === boxdv.vals.length) { + fullLayout[numKey] = 1; } + + // check for forced minimum dtick + Axes.minDtick(posAxis, boxdv.minDiff, boxdv.vals[0], true); + + // set the width of all boxes + for(i = 0; i < boxList.length; i++) { + calcTrace = calcdata[boxList[i]]; + calcTrace[0].t.dPos = dPos; + } + + var gap = fullLayout[traceType + 'gap']; + var groupgap = fullLayout[traceType + 'groupgap']; + var padfactor = (1 - gap) * (1 - groupgap) * dPos / fullLayout[numKey]; + + // autoscale the x axis - including space for points if they're off the side + // TODO: this will overdo it if the outermost boxes don't have + // their points as far out as the other boxes + Axes.expand(posAxis, boxdv.vals, { + vpadminus: dPos + pad[0] * padfactor, + vpadplus: dPos + pad[1] * padfactor + }); +} + +module.exports = { + setPositions: setPositions, + setPositionOffset: setPositionOffset }; diff --git a/src/traces/violin/index.js b/src/traces/violin/index.js index e21b4e81d05..153f90c5a89 100644 --- a/src/traces/violin/index.js +++ b/src/traces/violin/index.js @@ -14,7 +14,7 @@ module.exports = { supplyDefaults: require('./defaults'), supplyLayoutDefaults: require('./layout_defaults'), calc: require('./calc'), - setPositions: require('../box/set_positions'), + setPositions: require('./set_positions'), plot: require('./plot'), style: require('./style'), hoverPoints: require('../box/hover'), diff --git a/src/traces/violin/layout_attributes.js b/src/traces/violin/layout_attributes.js index 90adb472163..09c06616641 100644 --- a/src/traces/violin/layout_attributes.js +++ b/src/traces/violin/layout_attributes.js @@ -11,7 +11,6 @@ var boxLayoutAttrs = require('../box/layout_attributes'); // TODO update descriptions -// ... or maybe just reuse box* attributes? module.exports = { violinmode: boxLayoutAttrs.boxmode, violingap: boxLayoutAttrs.boxgap, diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index dd31720eed3..9598ea4a4f2 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -30,7 +30,7 @@ module.exports = function plot(gd, plotinfo, cd) { var t = cd0.t; var trace = cd0.trace; var sel = cd0.node3 = d3.select(this); - var numViolins = fullLayout._numBoxes; + var numViolins = fullLayout._numViolins; var group = (fullLayout.violinmode === 'group' && numViolins > 1); // violin max half width var bdPos = t.bdPos = t.dPos * (1 - fullLayout.violingap) * (1 - fullLayout.violingroupgap) / (group ? numViolins : 1); diff --git a/src/traces/violin/set_positions.js b/src/traces/violin/set_positions.js new file mode 100644 index 00000000000..b18376d485a --- /dev/null +++ b/src/traces/violin/set_positions.js @@ -0,0 +1,48 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var setPositionOffset = require('../box/set_positions').setPositionOffset; +var orientations = ['v', 'h']; + +module.exports = function setPositions(gd, plotinfo) { + var calcdata = gd.calcdata; + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + + for(var i = 0; i < orientations.length; i++) { + var orientation = orientations[i]; + var posAxis = orientation === 'h' ? ya : xa; + var violinList = []; + var minPad = 0; + var maxPad = 0; + + for(var j = 0; j < calcdata.length; j++) { + var cd = calcdata[j]; + var t = cd[0].t; + var trace = cd[0].trace; + + if(trace.visible === true && trace.type === 'violin' && + !t.empty && + trace.orientation === orientation && + trace.xaxis === xa._id && + trace.yaxis === ya._id + ) { + violinList.push(j); + + if(trace.points !== false) { + minPad = Math.max(minPad, trace.jitter - trace.pointpos - 1); + maxPad = Math.max(maxPad, trace.jitter + trace.pointpos - 1); + } + } + } + + setPositionOffset('violin', gd, violinList, posAxis, [minPad, maxPad]); + } +}; From ad51966b2c72b59633415f711349b6836a9cf3e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:18:11 -0400 Subject: [PATCH 10/25] 2nd cut violin calc/plot attributes + improve violin curve paths - add 'kernel' enumerated - implement 'scalegroup & 'scalemode' (instead of 'scaleby') - implement 'spanmode' & 'span' - make 'side' an enumerated w/ vals 'both', 'negative' and 'positive' to be general enough for horizontal and vertical violin - :hocho: 'line.smoothing' --- src/plots/plots.js | 3 + src/traces/violin/attributes.js | 90 +++++++++++++++++++----------- src/traces/violin/calc.js | 90 +++++++++++++++++++++--------- src/traces/violin/defaults.js | 14 +++-- src/traces/violin/helpers.js | 38 +++++++++++++ src/traces/violin/plot.js | 99 ++++++++++++++++++++++++--------- 6 files changed, 245 insertions(+), 89 deletions(-) create mode 100644 src/traces/violin/helpers.js diff --git a/src/plots/plots.js b/src/plots/plots.js index 6422242fdc9..7e0973196f6 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -2162,6 +2162,9 @@ plots.doCalcdata = function(gd, traces) { fullLayout._numBoxes = 0; fullLayout._numViolins = 0; + // initialize violin per-scale-group stats container + fullLayout._violinScaleGroupStats = {}; + // for calculating avg luminosity of heatmaps gd._hmpixcount = 0; gd._hmlumcount = 0; diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index 91b10e06a7a..016ef722356 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -9,7 +9,6 @@ 'use strict'; var boxAttrs = require('../box/attributes'); -var scatterAttrs = require('../scatter/attributes'); var extendFlat = require('../../lib/extend').extendFlat; module.exports = { @@ -26,62 +25,79 @@ module.exports = { ].join(' ') }), + kernel: { + valType: 'enumerated', + values: ['gaussian', 'epanechnikov'], + dflt: 'gaussian', + role: 'info', + editType: 'calc', + description: [ + 'Determines which kernel is used to compute the kernel density estimation.' + ].join(' ') + }, bandwidth: { valType: 'number', min: 0, role: 'info', - editType: 'plot', + editType: 'calc', description: [ 'Sets the bandwidth used to compute the kernel density estimate.', 'By default, the bandwidth is determined by Silverman\'s rule of thumb.' ].join(' ') }, - scaleby: { + + scalegroup: { + valType: 'string', + role: 'info', + dflt: '', + editType: 'calc', + description: [ + 'If there are multiple violins that should be sized according to', + 'to some metric (see `scalemode`), link them by providing a non-empty group id here', + 'shared by every trace in the same group.' + ].join(' ') + }, + scalemode: { valType: 'enumerated', - values: ['width', 'area', 'count'], + values: ['width', 'count'], dflt: 'width', role: 'info', editType: 'calc', description: [ - 'Sets the method by which the width of each violin is determined.', + 'Sets the metric by which the width of each violin is determined.', '*width* means each violin has the same (max) width', - '*area* means each violin has the same area', '*count* means the violins are scaled by the number of sample points making', 'up each violin.' ].join('') }, + + spanmode: { + valType: 'enumerated', + values: ['soft', 'hard', 'manual'], + dflt: 'soft', + role: 'info', + editType: 'calc', + description: [ + 'Sets the method by which the span in data space where the density function will be computed.', + '*soft* means the span goes from the sample\'s minimum value minus two bandwidths', + 'to the sample\'s maximum value plus two bandwidths.', + '*hard* means the span goes from the sample\'s minimum to its maximum value.', + 'For custom span settings, use mode *manual* and fill in the `span` attribute.' + ].join(' ') + }, span: { valType: 'info_array', items: [ - {valType: 'any', editType: 'plot'}, - {valType: 'any', editType: 'plot'} + {valType: 'any', editType: 'calc'}, + {valType: 'any', editType: 'calc'} ], role: 'info', - editType: 'plot', + editType: 'calc', description: [ 'Sets the span in data space for which the density function will be computed.', - 'By default, the span goes from the minimum value to maximum value in the sample.' + 'Has an effect only when `spanmode` is set to *manual*.' ].join(' ') }, - side: { - valType: 'enumerated', - values: ['both', 'left', 'right'], - dflt: 'both', - role: 'info', - editType: 'plot', - description: [ - 'Determines which side of the position line the density function making up', - 'one half of a is plotting.', - 'Useful when comparing two violin traces under *overlay* mode, where one trace.' - ].join(' ') - }, - - // TODO update description - points: boxAttrs.boxpoints, - jitter: boxAttrs.jitter, - pointpos: boxAttrs.pointpos, - marker: boxAttrs.marker, - text: boxAttrs.text, // TODO need attribute(s) similar to 'boxmean' to toggle lines for: // - mean @@ -104,10 +120,22 @@ module.exports = { editType: 'style', description: 'Sets the width (in px) of line bounding the violin(s).' }, - smoothing: scatterAttrs.line.smoothing, editType: 'plot' }, - fillcolor: boxAttrs.fillcolor, hoveron: boxAttrs.hoveron + + side: { + valType: 'enumerated', + values: ['both', 'positive', 'negative'], + dflt: 'both', + role: 'info', + editType: 'plot', + description: [ + 'Determines on which side of the position value the density function making up', + 'one half of a violin is plotted.', + 'Useful when comparing two violin traces under *overlay* mode, where one trace', + 'has `side` set to *positive* and the other to *negative*.' + ].join(' ') + }, }; diff --git a/src/traces/violin/calc.js b/src/traces/violin/calc.js index ac7af521079..e4b0332824e 100644 --- a/src/traces/violin/calc.js +++ b/src/traces/violin/calc.js @@ -9,48 +9,72 @@ 'use strict'; var Lib = require('../../lib'); +var Axes = require('../../plots/cartesian/axes'); var boxCalc = require('../box/calc'); - -var kernels = { - gaussian: function(v) { - return (1 / Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * v * v); - } -}; +var helpers = require('./helpers'); +var BADNUM = require('../../constants/numerical').BADNUM; module.exports = function calc(gd, trace) { var cd = boxCalc(gd, trace); if(cd[0].t.empty) return cd; + var fullLayout = gd._fullLayout; + var valAxis = Axes.getFromId( + gd, + trace[trace.orientation === 'h' ? 'xaxis' : 'yaxis'] + ); + + var violinScaleGroupStats = fullLayout._violinScaleGroupStats; + var scaleGroup = trace.scalegroup; + var groupStats = violinScaleGroupStats[scaleGroup]; + if(!groupStats) { + groupStats = violinScaleGroupStats[scaleGroup] = { + maxWidth: 0, + maxCount: 0 + }; + } + for(var i = 0; i < cd.length; i++) { var cdi = cd[i]; - var vals = cdi.pts.map(extractVal); + var vals = cdi.pts.map(helpers.extractVal); var len = vals.length; - var span = trace.span || [cdi.min, cdi.max]; - var dist = span[1] - span[0]; + // sample standard deviation var ssd = Lib.stdev(vals, len - 1, cdi.mean); var bandwidthDflt = ruleOfThumbBandwidth(vals, ssd, cdi.q3 - cdi.q1); - var bandwidth = trace.bandwidth || bandwidthDflt; - var kde = makeKDE(vals, kernels.gaussian, bandwidth); + var bandwidth = cdi.bandwidth = trace.bandwidth || bandwidthDflt; + var span = cdi.span = calcSpan(trace, cdi, valAxis, bandwidth); + // step that well covers the bandwidth and is multiple of span distance + var dist = span[1] - span[0]; var n = Math.ceil(dist / (Math.min(bandwidthDflt, bandwidth) / 3)); var step = dist / n; + if(!isFinite(step) || !isFinite(n)) { + Lib.error('Something went wrong with computing the violin span'); + cd[0].t.empty = true; + return cd; + } + + var kde = helpers.makeKDE(cdi, trace, vals); cdi.density = new Array(n); - cdi.violinMaxWidth = 0; for(var k = 0, t = span[0]; t < (span[1] + step / 2); k++, t += step) { var v = kde(t); - cdi.violinMaxWidth = Math.max(cdi.violinMaxWidth, v); + groupStats.maxWidth = Math.max(groupStats.maxWidth, v); cdi.density[k] = {v: v, t: t}; } + + Axes.expand(valAxis, span, {padded: true}); + groupStats.maxCount = Math.max(groupStats.maxCount, vals.length); } return cd; }; // Default to Silveman's rule of thumb: +// - https://stats.stackexchange.com/a/6671 // - https://en.wikipedia.org/wiki/Kernel_density_estimation#A_rule-of-thumb_bandwidth_estimator // - https://github.com/statsmodels/statsmodels/blob/master/statsmodels/nonparametric/bandwidths.py function ruleOfThumbBandwidth(vals, ssd, iqr) { @@ -58,18 +82,34 @@ function ruleOfThumbBandwidth(vals, ssd, iqr) { return 1.059 * a * Math.pow(vals.length, -0.2); } -function makeKDE(vals, kernel, bandwidth) { - var len = vals.length; - var factor = 1 / (len * bandwidth); +function calcSpan(trace, cdi, valAxis, bandwidth) { + var spanmode = trace.spanmode; + var spanIn = trace.span || []; + var spanTight = [cdi.min, cdi.max]; + var spanLoose = [cdi.min - 2 * bandwidth, cdi.max + 2 * bandwidth]; + var spanOut; - // don't use Lib.aggNums to skip isNumeric checks - return function(x) { - var sum = 0; - for(var i = 0; i < len; i++) { - sum += kernel((x - vals[i]) / bandwidth); - } - return factor * sum; + function calcSpanItem(index) { + var s = spanIn[index]; + var sc = valAxis.d2c(s, 0, trace[cdi.valLetter + 'calendar']); + return sc === BADNUM ? spanLoose[index] : sc; + } + + if(spanmode === 'soft') { + spanOut = spanLoose; + } else if(spanmode === 'hard') { + spanOut = spanTight; + } else { + spanOut = [calcSpanItem(0), calcSpanItem(1)]; + } + + // to reuse the equal-range-item block + var dummyAx = { + type: 'linear', + range: spanOut }; -} + Axes.setConvert(dummyAx); + dummyAx.cleanRange(); -function extractVal(o) { return o.v; } + return spanOut; +} diff --git a/src/traces/violin/defaults.js b/src/traces/violin/defaults.js index 9f881051cb2..ab90a834f4a 100644 --- a/src/traces/violin/defaults.js +++ b/src/traces/violin/defaults.js @@ -22,15 +22,17 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout boxDefaults.handleSampleDefaults(traceIn, traceOut, coerce, layout); if(traceOut.visible === false) return; + coerce('kernel'); coerce('bandwidth'); - coerce('scaleby'); - coerce('span'); + coerce('scalegroup', traceOut.name); + coerce('scalemode'); coerce('side'); - coerce('line.color', (traceIn.marker || {}).color || defaultColor); - coerce('line.width'); - coerce('line.smoothing'); - coerce('fillcolor', Color.addOpacity(traceOut.line.color, 0.5)); + var span = coerce('span'); + var spanmodeDflt; + if(Array.isArray(span)) spanmodeDflt = 'manual'; + coerce('spanmode', spanmodeDflt); + boxDefaults.handlePointsDefaults(traceIn, traceOut, coerce, {prefix: ''}); }; diff --git a/src/traces/violin/helpers.js b/src/traces/violin/helpers.js new file mode 100644 index 00000000000..771a2171383 --- /dev/null +++ b/src/traces/violin/helpers.js @@ -0,0 +1,38 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var Lib = require('../../lib'); + +var kernels = { + gaussian: function(v) { + return (1 / Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * v * v); + }, + epanechnikov: function(v) { + return Math.abs(v) <= 1 ? 0.75 * (1 - v * v) : 0; + } +}; + +exports.makeKDE = function(calcItem, trace, vals) { + var len = vals.length; + var kernel = kernels[trace.kernel]; + var bandwidth = calcItem.bandwidth; + var factor = 1 / (len * bandwidth); + + // don't use Lib.aggNums to skip isNumeric checks + return function(x) { + var sum = 0; + for(var i = 0; i < len; i++) { + sum += kernel((x - vals[i]) / bandwidth); + } + return factor * sum; + }; +}; + +exports.extractVal = function(o) { return o.v; }; diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index 9598ea4a4f2..3cb0a7f57a7 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -19,6 +19,18 @@ module.exports = function plot(gd, plotinfo, cd) { var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; + function makePath(pts) { + var segments = linePoints(pts, { + xaxis: xa, + yaxis: ya, + connectGaps: true, + baseTolerance: 0.75, + shape: 'spline', + simplify: true + }); + return Drawing.smoothopen(segments[0], 1); + } + var traces = plotinfo.plot.select('.violinlayer') .selectAll('g.trace.violins') .data(cd) @@ -42,45 +54,78 @@ module.exports = function plot(gd, plotinfo, cd) { return; } + var valAxis = plotinfo[t.valLetter + 'axis']; + var posAxis = plotinfo[t.posLetter + 'axis']; + var hasBothSides = trace.side === 'both'; + var hasPositiveSide = hasBothSides || trace.side === 'positive'; + var hasNegativeSide = hasBothSides || trace.side === 'negative'; + var groupStats = fullLayout._violinScaleGroupStats[trace.scalegroup]; + sel.selectAll('path.violin') .data(Lib.identity) .enter().append('path') .style('vector-effect', 'non-scaling-stroke') .attr('class', 'violin') .each(function(d) { + var pathSel = d3.select(this); var density = d.density; - var lineData = []; - var i; - - // TODO add scale by 'area' and by 'count' - var scale = d.violinMaxWidth / bdPos; - - // TODO add support for one-sided violins - for(i = 0; i < density.length; i++) { - lineData.push({ - x: d.pos + bPos + (density[i].v / scale), - y: density[i].t - }); + var len = density.length; + var posCenter = d.pos + bPos; + var posCenterPx = posAxis.c2p(posCenter); + var scale; + + switch(trace.scalemode) { + case 'width': + scale = groupStats.maxWidth / bdPos; + break; + case 'count': + scale = (groupStats.maxWidth / bdPos) * (groupStats.maxCount / len); + break; + } + + var pathPos, pathNeg, path; + var i, k, pts, pt; + + if(hasPositiveSide) { + pts = new Array(len); + for(i = 0; i < len; i++) { + pt = pts[i] = {}; + pt[t.posLetter] = posCenter + (density[i].v / scale); + pt[t.valLetter] = density[i].t; + } + pathPos = makePath(pts); } - for(i--; i >= 0; i--) { - lineData.push({ - x: d.pos + bPos - (density[i].v / scale), - y: density[i].t - }); + + if(hasNegativeSide) { + pts = new Array(len); + 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; + } + pathNeg = makePath(pts); } - var segments = linePoints(lineData, { - xaxis: xa, - yaxis: ya, - connectGaps: true, - baseTolerance: 0.75, - shape: 'spline', - simplify: true - }); + if(hasBothSides) { + path = pathPos + 'L' + pathNeg.substr(1) + 'Z'; + } + else { + var startPt = [posCenterPx, valAxis.c2p(density[0].t)]; + var endPt = [posCenterPx, valAxis.c2p(density[len - 1].t)]; - var path = Drawing.smoothclosed(segments[0], trace.line.smoothing); + if(trace.orientation === 'h') { + startPt.reverse(); + endPt.reverse(); + } + + if(hasPositiveSide) { + path = 'M' + startPt + 'L' + pathPos.substr(1) + 'L' + endPt; + } else { + path = 'M' + endPt + 'L' + pathNeg.substr(1) + 'L' + startPt; + } + } + pathSel.attr('d', path); - d3.select(this).attr('d', path); }); if(trace.points) { From 4a40fc726cc42c161b2866a5f732b8c6b309c224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:23:00 -0400 Subject: [PATCH 11/25] add findPointOnPath geometry2d util function - to be used to find pt on violin bezier curves --- src/lib/geometry2d.js | 49 +++++++++++++++++++++++++++++++++++++++++++ src/lib/index.js | 1 + 2 files changed, 50 insertions(+) diff --git a/src/lib/geometry2d.js b/src/lib/geometry2d.js index a946ccf5e23..fbd10b935ba 100644 --- a/src/lib/geometry2d.js +++ b/src/lib/geometry2d.js @@ -193,3 +193,52 @@ exports.getVisibleSegment = function getVisibleSegment(path, bounds, buffer) { Math.abs(pt0.y - ptTotal.y) < 0.1 }; }; + +/** + * Find point on SVG path corresponding to a given constraint coordinate + * + * @param {SVGPathElement} path + * @param {Number} val : constraint coordinate value + * @param {String} coord : 'x' or 'y' the constraint coordinate + * @param {Object} opts : + * - {Number} pathLength : supply total path length before hand + * - {Number} tolerance + * - {Number} iterationLimit + * @return {SVGPoint} + */ +exports.findPointOnPath = function findPointOnPath(path, val, coord, opts) { + opts = opts || {}; + + var pathLength = opts.pathLength || path.getTotalLength(); + var tolerance = opts.tolerance || 1e-3; + var iterationLimit = opts.iterationLimit || 30; + + // if path starts at a val greater than the path tail (like on vertical violins), + // we must flip the sign of the compute diff. + var mul = path.getPointAtLength(0)[coord] > path.getPointAtLength(pathLength)[coord] ? -1 : 1; + + var i = 0; + var b0 = 0; + var b1 = pathLength; + var mid; + var pt; + var diff; + + while(i < iterationLimit) { + mid = (b0 + b1) / 2; + pt = path.getPointAtLength(mid); + diff = pt[coord] - val; + + if(Math.abs(diff) < tolerance) { + return pt; + } else { + if(mul * diff > 0) { + b1 = mid; + } else { + b0 = mid; + } + i++; + } + } + return pt; +}; diff --git a/src/lib/index.js b/src/lib/index.js index 563541ed5fe..b34099227d6 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -82,6 +82,7 @@ lib.segmentDistance = geom2dModule.segmentDistance; lib.getTextLocation = geom2dModule.getTextLocation; lib.clearLocationCache = geom2dModule.clearLocationCache; lib.getVisibleSegment = geom2dModule.getVisibleSegment; +lib.findPointOnPath = geom2dModule.findPointOnPath; var extendModule = require('./extend'); lib.extendFlat = extendModule.extendFlat; From 6ffc3797d6af88169e9ba280f9d833d0a204910d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:24:29 -0400 Subject: [PATCH 12/25] implement violin 'inner' style options - i.e. showinnerbox & showmeanline and friends. --- src/traces/violin/attributes.js | 70 ++++++++++++++++++++++++++++++--- src/traces/violin/defaults.js | 28 +++++++++++++ src/traces/violin/helpers.js | 27 +++++++++++++ src/traces/violin/plot.js | 65 ++++++++++++++++++++++++++++-- src/traces/violin/style.js | 16 +++++++- 5 files changed, 196 insertions(+), 10 deletions(-) diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index 016ef722356..04175acab28 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -99,12 +99,6 @@ module.exports = { ].join(' ') }, - // TODO need attribute(s) similar to 'boxmean' to toggle lines for: - // - mean - // - median - // - std - // - quartiles - line: { color: { valType: 'color', @@ -123,6 +117,70 @@ module.exports = { editType: 'plot' }, fillcolor: boxAttrs.fillcolor, + + // TODO update description + points: boxAttrs.boxpoints, + jitter: boxAttrs.jitter, + pointpos: boxAttrs.pointpos, + marker: boxAttrs.marker, + text: boxAttrs.text, + + showinnerbox: { + valType: 'boolean', + dflt: false, + role: 'info', + editType: 'plot', + description: '.' + }, + innerboxwidth: { + valType: 'number', + min: 0, + max: 1, + dflt: 0.25, + role: 'info', + editType: 'plot', + description: '...' + }, + innerboxlinecolor: { + valType: 'color', + role: 'style', + editType: 'style', + description: '' + }, + innerboxfillcolor: { + valType: 'color', + role: 'style', + editType: 'style', + description: '' + }, + innerboxlinewidth: { + valType: 'number', + min: 0, + role: 'style', + editType: 'style', + description: '' + }, + + showmeanline: { + valType: 'boolean', + dflt: false, + role: 'info', + editType: 'plot', + description: 'Toggle' + }, + meanlinecolor: { + valType: 'color', + role: 'style', + editType: 'style', + description: '' + }, + meanlinewidth: { + valType: 'number', + min: 0, + role: 'style', + editType: 'style', + description: '' + }, hoveron: boxAttrs.hoveron side: { diff --git a/src/traces/violin/defaults.js b/src/traces/violin/defaults.js index ab90a834f4a..507ddbe97d1 100644 --- a/src/traces/violin/defaults.js +++ b/src/traces/violin/defaults.js @@ -18,6 +18,9 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } + function coerce2(attr, dflt) { + return Lib.coerce2(traceIn, traceOut, attributes, attr, dflt); + } boxDefaults.handleSampleDefaults(traceIn, traceOut, coerce, layout); if(traceOut.visible === false) return; @@ -33,6 +36,31 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(Array.isArray(span)) spanmodeDflt = 'manual'; coerce('spanmode', spanmodeDflt); + var lineColor = coerce('line.color', (traceIn.marker || {}).color || defaultColor); + var lineWidth = coerce('line.width'); + var fillColor = coerce('fillcolor', Color.addOpacity(traceOut.line.color, 0.5)); boxDefaults.handlePointsDefaults(traceIn, traceOut, coerce, {prefix: ''}); + + var show; + + var innerBoxWidth = coerce2('innerboxwidth'); + var innerBoxFillColor = coerce2('innerboxfillcolor', fillColor); + var innerBoxLineColor = coerce2('innerboxlinecolor', lineColor); + var innerBoxLineWidth = coerce2('innerboxlinewidth', lineWidth); + show = coerce('showinnerbox', Boolean(innerBoxWidth || innerBoxFillColor || innerBoxLineColor || innerBoxLineWidth)); + if(!show) { + delete traceOut.innerboxwidth; + delete traceOut.innerboxfillcolor; + delete traceOut.innerboxlinecolor; + delete traceOut.innerboxlinewidth; + } + + var meanLineColor = coerce2('meanlinecolor', lineColor); + var meanLineWidth = coerce2('meanlinewidth', lineWidth); + show = coerce('showmeanline', Boolean(meanLineColor || meanLineWidth)); + if(!show) { + delete traceOut.meanlinecolor; + delete traceOut.meanlinewidth; + } }; diff --git a/src/traces/violin/helpers.js b/src/traces/violin/helpers.js index 771a2171383..cd9b978c4b7 100644 --- a/src/traces/violin/helpers.js +++ b/src/traces/violin/helpers.js @@ -35,4 +35,31 @@ exports.makeKDE = function(calcItem, trace, vals) { }; }; +exports.getPositionOnKdePath = function(calcItem, trace, valuePx) { + var posLetter, valLetter; + + if(trace.orientation === 'h') { + posLetter = 'y'; + valLetter = 'x'; + } else { + posLetter = 'x'; + valLetter = 'y'; + } + + var pointOnPath = Lib.findPointOnPath( + calcItem.path, + valuePx, + valLetter, + {pathLength: calcItem.pathLength} + ); + + var posCenterPx = calcItem.posCenterPx; + var posOnPath0 = pointOnPath[posLetter]; + var posOnPath1 = trace.side === 'both' ? + 2 * posCenterPx - posOnPath0 : + posCenterPx; + + return [posOnPath0, posOnPath1]; +}; + exports.extractVal = function(o) { return o.v; }; diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index 3cb0a7f57a7..063c4df3c0e 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -13,6 +13,7 @@ var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); var boxPlot = require('../box/plot'); var linePoints = require('../scatter/line_points'); +var helpers = require('./helpers'); module.exports = function plot(gd, plotinfo, cd) { var fullLayout = gd._fullLayout; @@ -128,10 +129,68 @@ module.exports = function plot(gd, plotinfo, cd) { }); - if(trace.points) { - boxPlot.plotPoints(sel, plotinfo, trace, t); + if(trace.showinnerbox) { + var innerBoxWidth = trace.innerboxwidth; + var innerBoxLineWidth = trace.innerboxlinewidth; + var bdPosScaled; + var bPosPxOffset; + + if(hasBothSides) { + bdPosScaled = bdPos * innerBoxWidth; + bPosPxOffset = 0; + } else if(hasPositiveSide) { + bdPosScaled = [0, bdPos * innerBoxWidth / 2]; + bPosPxOffset = -innerBoxLineWidth; + } else { + bdPosScaled = [bdPos * innerBoxWidth / 2, 0]; + bPosPxOffset = innerBoxLineWidth; + } + + // do not draw whiskers on inner boxes + trace.whiskerwidth = 0; + + boxPlot.plotBoxAndWhiskers(sel, {pos: posAxis, val: valAxis}, trace, { + bPos: bPos, + bdPos: bdPosScaled, + bPosPxOffset: bPosPxOffset + }); + + // if both showinnerbox and showmeanline are turned on, show mean + // line inside inner box + + if(trace.showmeanline) { + boxPlot.plotBoxMean(sel, {pos: posAxis, val: valAxis}, trace, { + bPos: bPos, + bdPos: bdPosScaled, + bPosPxOffset: bPosPxOffset + }); + } + } + else { + if(trace.showmeanline) { + sel.selectAll('path.mean') + .data(Lib.identity) + .enter().append('path') + .attr('class', 'mean') + .style({ + fill: 'none', + 'vector-effect': 'non-scaling-stroke' + }) + .each(function(d) { + var v = valAxis.c2p(d.mean, true); + var p = helpers.getPositionOnKdePath(d, trace, v); + + d3.select(this).attr('d', + trace.orientation === 'h' ? + 'M' + v + ',' + p[0] + 'V' + p[1] : + 'M' + p[0] + ',' + v + 'H' + p[1] + ); + }); + } } - // TODO quartile line etc + if(trace.points) { + boxPlot.plotPoints(sel, {x: xa, y: ya}, trace, t); + } }); }; diff --git a/src/traces/violin/style.js b/src/traces/violin/style.js index 315dc13fa93..8a962794b83 100644 --- a/src/traces/violin/style.js +++ b/src/traces/violin/style.js @@ -21,11 +21,25 @@ module.exports = function style(gd) { var sel = d3.select(this); sel.selectAll('path.violin') - .style('stroke-width', '2px') + .style('stroke-width', trace.line.width + 'px') .call(Color.stroke, trace.line.color) .call(Color.fill, trace.fillcolor); + sel.selectAll('path.box') + .style('stroke-width', trace.innerboxlinewidth + 'px') + .call(Color.stroke, trace.innerboxlinecolor) + .call(Color.fill, trace.innerboxfillcolor); + sel.selectAll('g.points path') .call(Drawing.pointStyle, trace, gd); + + var meanLineWidth = trace.meanlinewidth; + + sel.selectAll('path.mean') + .style({ + 'stroke-width': meanLineWidth + 'px', + 'stroke-dasharray': (2 * meanLineWidth) + 'px,' + meanLineWidth + 'px' + }) + .call(Color.stroke, trace.meanlinecolor); }); }; From dfa918fa174de09a89bc269223cfdbf82c52eb42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:26:02 -0400 Subject: [PATCH 13/25] pass hoverlayer to trace module hoverPoints - in preparation for violin 'kde' hover handling --- src/components/fx/hover.js | 2 +- src/traces/contour/hover.js | 5 ++--- src/traces/heatmap/hover.js | 2 +- src/traces/histogram2d/hover.js | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/fx/hover.js b/src/components/fx/hover.js index fc219542914..37d80fbc126 100644 --- a/src/components/fx/hover.js +++ b/src/components/fx/hover.js @@ -381,7 +381,7 @@ function _hover(gd, evt, subplot, noHoverEvent) { // Now find the points. if(trace._module && trace._module.hoverPoints) { - var newPoints = trace._module.hoverPoints(pointData, xval, yval, mode); + var newPoints = trace._module.hoverPoints(pointData, xval, yval, mode, fullLayout._hoverlayer); if(newPoints) { var newPoint; for(var newPointNum = 0; newPointNum < newPoints.length; newPointNum++) { diff --git a/src/traces/contour/hover.js b/src/traces/contour/hover.js index d53393d9ed8..0bf4fdb4884 100644 --- a/src/traces/contour/hover.js +++ b/src/traces/contour/hover.js @@ -11,7 +11,6 @@ var heatmapHoverPoints = require('../heatmap/hover'); - -module.exports = function hoverPoints(pointData, xval, yval, hovermode) { - return heatmapHoverPoints(pointData, xval, yval, hovermode, true); +module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLayer) { + return heatmapHoverPoints(pointData, xval, yval, hovermode, hoverLayer, true); }; diff --git a/src/traces/heatmap/hover.js b/src/traces/heatmap/hover.js index 310f92c0b84..f8ccaaf0bd9 100644 --- a/src/traces/heatmap/hover.js +++ b/src/traces/heatmap/hover.js @@ -15,7 +15,7 @@ var Axes = require('../../plots/cartesian/axes'); var MAXDIST = Fx.constants.MAXDIST; -module.exports = function hoverPoints(pointData, xval, yval, hovermode, contour) { +module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLayer, contour) { // never let a heatmap override another type as closest point if(pointData.distance < MAXDIST) return; diff --git a/src/traces/histogram2d/hover.js b/src/traces/histogram2d/hover.js index 87972380b61..ccce7d3d712 100644 --- a/src/traces/histogram2d/hover.js +++ b/src/traces/histogram2d/hover.js @@ -12,8 +12,8 @@ var heatmapHover = require('../heatmap/hover'); var hoverLabelText = require('../../plots/cartesian/axes').hoverLabelText; -module.exports = function hoverPoints(pointData, xval, yval, hovermode, contour) { - var pts = heatmapHover(pointData, xval, yval, hovermode, contour); +module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLayer, contour) { + var pts = heatmapHover(pointData, xval, yval, hovermode, hoverLayer, contour); if(!pts) return; From bc6bc025ce3717c3e640f43eb71dd3ab2f719e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:27:51 -0400 Subject: [PATCH 14/25] implement violin hover - with three flags: 'violins', 'points' (similar to box traces) and 'kde' which show the point on the kde line along with the line to crosses the hovered-on violin --- src/traces/box/hover.js | 45 +++++++++++---- src/traces/violin/attributes.js | 14 ++++- src/traces/violin/helpers.js | 6 ++ src/traces/violin/hover.js | 99 +++++++++++++++++++++++++++++++++ src/traces/violin/index.js | 2 +- src/traces/violin/plot.js | 7 +++ 6 files changed, 161 insertions(+), 12 deletions(-) create mode 100644 src/traces/violin/hover.js diff --git a/src/traces/box/hover.js b/src/traces/box/hover.js index 7f1ac5e501d..c396e3206eb 100644 --- a/src/traces/box/hover.js +++ b/src/traces/box/hover.js @@ -51,23 +51,48 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) { var ya = pointData.ya; var trace = cd[0].trace; var t = cd[0].t; + var isViolin = trace.type === 'violin'; var closeBoxData = []; var pLetter, vLetter, pAxis, vAxis, vVal, pVal, dx, dy; // closest mode: handicap box plots a little relative to others // adjust inbox w.r.t. to calculate box size - var boxDelta = (hovermode === 'closest') ? 2.5 * t.bdPos : t.bdPos; + var boxDelta = (hovermode === 'closest' && !isViolin) ? 2.5 * t.bdPos : t.bdPos; var shiftPos = function(di) { return di.pos + t.bPos - pVal; }; + var dPos; + + if(isViolin && trace.side !== 'both') { + if(trace.side === 'positive') { + dPos = function(di) { + var pos = shiftPos(di); + return Fx.inbox(pos, pos + boxDelta); + }; + } + if(trace.side === 'negative') { + dPos = function(di) { + var pos = shiftPos(di); + return Fx.inbox(pos - boxDelta, pos); + }; + } + } else { + dPos = function(di) { + var pos = shiftPos(di); + return Fx.inbox(pos - boxDelta, pos + boxDelta); + }; + } - var dPos = function(di) { - var pos = shiftPos(di); - return Fx.inbox(pos - boxDelta, pos + boxDelta); - }; + var dVal; - var dVal = function(di) { - return Fx.inbox(di.min - vVal, di.max - vVal); - }; + if(isViolin) { + dVal = function(di) { + return Fx.inbox(di.span[0] - vVal, di.span[1] - vVal); + }; + } else { + dVal = function(di) { + return Fx.inbox(di.min - vVal, di.max - vVal); + }; + } if(trace.orientation === 'h') { vVal = xval; @@ -115,11 +140,11 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) { var attrs = ['med', 'min', 'q1', 'q3', 'max']; var prefixes = ['median', 'min', 'q1', 'q3', 'max']; - if(trace.boxmean) { + if(trace.boxmean || trace.showmeanline) { attrs.push('mean'); prefixes.push(trace.boxmean === 'sd' ? 'mean ± σ' : 'mean'); } - if(trace.boxpoints) { + if(trace.boxpoints || trace.points) { attrs.push('lf', 'uf'); prefixes.push('lower fence', 'upper fence'); } diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index 04175acab28..6d596302fef 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -181,7 +181,6 @@ module.exports = { editType: 'style', description: '' }, - hoveron: boxAttrs.hoveron side: { valType: 'enumerated', @@ -196,4 +195,17 @@ module.exports = { 'has `side` set to *positive* and the other to *negative*.' ].join(' ') }, + + hoveron: { + valType: 'flaglist', + flags: ['violins', 'points', 'kde'], + dflt: 'violins+points+kde', + extras: ['all'], + role: 'info', + editType: 'style', + description: [ + 'Do the hover effects highlight individual violins', + 'or sample points or the kernel density estimate or any combination of them?' + ].join(' ') + } }; diff --git a/src/traces/violin/helpers.js b/src/traces/violin/helpers.js index cd9b978c4b7..f8ad343726f 100644 --- a/src/traces/violin/helpers.js +++ b/src/traces/violin/helpers.js @@ -62,4 +62,10 @@ exports.getPositionOnKdePath = function(calcItem, trace, valuePx) { return [posOnPath0, posOnPath1]; }; +exports.getKdeValue = function(calcItem, trace, valueDist) { + var vals = calcItem.pts.map(exports.extractVal); + var kde = exports.makeKDE(calcItem, trace, vals); + return kde(valueDist) / calcItem.posDensityScale; +}; + exports.extractVal = function(o) { return o.v; }; diff --git a/src/traces/violin/hover.js b/src/traces/violin/hover.js new file mode 100644 index 00000000000..32ea61ba63a --- /dev/null +++ b/src/traces/violin/hover.js @@ -0,0 +1,99 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var Lib = require('../../lib'); +var Axes = require('../../plots/cartesian/axes'); +var boxHoverPoints = require('../box/hover'); +var helpers = require('./helpers'); + +module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLayer) { + var cd = pointData.cd; + var trace = cd[0].trace; + var hoveron = trace.hoveron; + var hasHoveronViolins = hoveron.indexOf('violins') !== -1; + var hasHoveronKDE = hoveron.indexOf('kde') !== -1; + var closeData = []; + var closePtData; + var violinLineAttrs; + + if(hasHoveronViolins || hasHoveronKDE) { + var closeBoxData = boxHoverPoints.hoverOnBoxes(pointData, xval, yval, hovermode); + + if(hasHoveronViolins) { + closeData = closeData.concat(closeBoxData); + } + + if(hasHoveronKDE && closeBoxData.length > 0) { + var xa = pointData.xa; + var ya = pointData.ya; + var pLetter, vLetter, pAxis, vAxis, vVal; + + if(trace.orientation === 'h') { + vVal = xval; + pLetter = 'y'; + pAxis = ya; + vLetter = 'x'; + vAxis = xa; + } else { + vVal = yval; + pLetter = 'x'; + pAxis = xa; + vLetter = 'y'; + vAxis = ya; + } + + var di = cd[pointData.index]; + + if(vVal >= di.span[0] && vVal <= di.span[1]) { + var kdePointData = Lib.extendFlat({}, pointData); + var vValPx = vAxis.c2p(vVal, true); + var kdeVal = helpers.getKdeValue(di, trace, vVal); + var pOnPath = helpers.getPositionOnKdePath(di, trace, vValPx); + var paOffset = pAxis._offset; + var paLength = pAxis._length; + + kdePointData[pLetter + '0'] = pOnPath[0]; + kdePointData[pLetter + '1'] = pOnPath[1]; + kdePointData[vLetter + '0'] = kdePointData[vLetter + '1'] = vValPx; + kdePointData[vLetter + 'Label'] = vLetter + ': ' + Axes.hoverLabelText(vAxis, vVal) + ', kde: ' + kdeVal.toFixed(3); + closeData.push(kdePointData); + + violinLineAttrs = {stroke: pointData.color}; + violinLineAttrs[pLetter + '1'] = Lib.constrain(paOffset + pOnPath[0], paOffset, paOffset + paLength); + violinLineAttrs[pLetter + '2'] = Lib.constrain(paOffset + pOnPath[1], paOffset, paOffset + paLength); + violinLineAttrs[vLetter + '1'] = violinLineAttrs[vLetter + '2'] = vAxis._offset + vValPx; + } + } + } + + if(hoveron.indexOf('points') !== -1) { + closePtData = boxHoverPoints.hoverOnPoints(pointData, xval, yval); + } + + // update violin line (if any) + var violinLine = hoverLayer.selectAll('.violinline-' + trace.uid) + .data(violinLineAttrs ? [0] : []); + violinLine.enter().append('line') + .classed('violinline-' + trace.uid, true) + .attr('stroke-width', 1.5); + violinLine.exit().remove(); + violinLine.attr(violinLineAttrs); + + // same combine logic as box hoverPoints + if(hovermode === 'closest') { + if(closePtData) return [closePtData]; + return closeData; + } + if(closePtData) { + closeData.push(closePtData); + return closeData; + } + return closeData; +}; diff --git a/src/traces/violin/index.js b/src/traces/violin/index.js index 153f90c5a89..75212b5335e 100644 --- a/src/traces/violin/index.js +++ b/src/traces/violin/index.js @@ -17,7 +17,7 @@ module.exports = { setPositions: require('./set_positions'), plot: require('./plot'), style: require('./style'), - hoverPoints: require('../box/hover'), + hoverPoints: require('./hover'), selectPoints: require('../box/select'), moduleType: 'trace', diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index 063c4df3c0e..bb2827ebfae 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -127,6 +127,13 @@ module.exports = function plot(gd, plotinfo, cd) { } pathSel.attr('d', path); + // save a few things used in getPositionOnKdePath, getKdeValue + // on hover and for showmeanline + d.posCenterPx = posCenterPx; + d.posDensityScale = scale * bdPos; + d.path = pathSel.node(); + d.pathLength = d.path.getTotalLength() / (hasBothSides ? 2 : 1); + }); if(trace.showinnerbox) { From e73766452f7795baca74a82c9433fbb9b6aa4025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:29:57 -0400 Subject: [PATCH 15/25] 2nd cut violin mocks --- test/image/baselines/violin_box_overlay.png | Bin 0 -> 42484 bytes test/image/baselines/violin_grouped.png | Bin 36549 -> 41464 bytes test/image/baselines/violin_non-linear.png | Bin 0 -> 30470 bytes test/image/baselines/violin_old-faithful.png | Bin 41740 -> 39917 bytes test/image/baselines/violin_side-by-side.png | Bin 0 -> 42508 bytes test/image/mocks/violin_box_overlay.json | 21 + test/image/mocks/violin_grouped.json | 10 +- test/image/mocks/violin_non-linear.json | 58 +++ test/image/mocks/violin_old-faithful.json | 2 + test/image/mocks/violin_side-by-side.json | 495 +++++++++++++++++++ 10 files changed, 582 insertions(+), 4 deletions(-) create mode 100644 test/image/baselines/violin_box_overlay.png create mode 100644 test/image/baselines/violin_non-linear.png create mode 100644 test/image/baselines/violin_side-by-side.png create mode 100644 test/image/mocks/violin_box_overlay.json create mode 100644 test/image/mocks/violin_non-linear.json create mode 100644 test/image/mocks/violin_side-by-side.json diff --git a/test/image/baselines/violin_box_overlay.png b/test/image/baselines/violin_box_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..bf60201ef43d4d5a96b43bcf9dbaf8cb01fb2dce GIT binary patch literal 42484 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 literal 36549 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 X34Ij7#y3s`{;4WGx?g_RBKZFSd#sH1 diff --git a/test/image/baselines/violin_non-linear.png b/test/image/baselines/violin_non-linear.png new file mode 100644 index 0000000000000000000000000000000000000000..3609f3890e76b3a8b8a3cdb3df2a931e446a823a GIT binary patch literal 30470 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 literal 0 HcmV?d00001 diff --git a/test/image/baselines/violin_old-faithful.png b/test/image/baselines/violin_old-faithful.png index f36a86e15feb30cf1d723d790dc0b44808a588bc..26d9b81943abb9141ce10b4ac0b01efd4e5788a2 100644 GIT binary patch literal 39917 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 HDWM4frd-Jh literal 41740 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 z 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

py*0FQ9Po%zLxcp*8Rc`_4IFPAZ27cO#9hDa9 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 by number of bills per gender", + "legend": { + "tracegroupgap": 0 + }, + "violingap": 0.05, + "violingroupgap": 0, + "violinmode": "overlay", + "height": 700 + }, + "data": [ + { + "legendgroup": "F", + "scalegroup": "F", + "points": "all", + "pointpos": 0.1, + "jitter": 0, + "scalemode": "count", + "marker": { + "line": { + "width": 2, + "color": "#bebada" + }, + "symbol": "line-ns" + }, + "showlegend": false, + "side": "positive", + "type": "violin", + "name": "F", + "span": [ + 0 + ], + "line": { + "color": "#bebada" + }, + "y0": "Thursday", + "x": [ + 10.07, + 34.83, + 10.65, + 12.43, + 24.08, + 13.42, + 12.48, + 29.8, + 14.52, + 11.38, + 20.27, + 11.17, + 12.26, + 18.26, + 8.51, + 10.33, + 14.15, + 13.16, + 17.47, + 27.05, + 16.43, + 8.35, + 18.64, + 11.87, + 19.81, + 43.11, + 13.0, + 12.74, + 13.0, + 16.4, + 16.47, + 18.78 + ], + "orientation": "h" + }, + { + "legendgroup": "M", + "scalegroup": "M", + "points": "all", + "pointpos": -0.1, + "jitter": 0, + "scalemode": "count", + "marker": { + "line": { + "width": 2, + "color": "#8dd3c7" + }, + "symbol": "line-ns" + }, + "showlegend": false, + "side": "negative", + "type": "violin", + "name": "M", + "span": [ + 0 + ], + "line": { + "color": "#8dd3c7" + }, + "y0": "Thursday", + "x": [ + 27.2, + 22.76, + 17.29, + 19.44, + 16.66, + 32.68, + 15.98, + 13.03, + 18.28, + 24.71, + 21.16, + 11.69, + 14.26, + 15.95, + 8.52, + 22.82, + 19.08, + 16.0, + 34.3, + 41.19, + 9.78, + 7.51, + 28.44, + 15.48, + 16.58, + 7.56, + 10.34, + 13.51, + 18.71, + 20.53 + ], + "orientation": "h" + }, + { + "legendgroup": "F", + "scalegroup": "F", + "points": "all", + "pointpos": 0.1, + "jitter": 0, + "scalemode": "count", + "marker": { + "line": { + "width": 2, + "color": "#bebada" + }, + "symbol": "line-ns" + }, + "showlegend": false, + "side": "positive", + "type": "violin", + "name": "F", + "span": [ + 0 + ], + "line": { + "color": "#bebada" + }, + "y0": "Friday", + "x": [ + 5.75, + 16.32, + 22.75, + 11.35, + 15.38, + 13.42, + 15.98, + 16.27, + 10.09 + ], + "orientation": "h" + }, + { + "legendgroup": "M", + "scalegroup": "M", + "points": "all", + "pointpos": -0.1, + "jitter": 0, + "scalemode": "count", + "marker": { + "line": { + "width": 2, + "color": "#8dd3c7" + }, + "symbol": "line-ns" + }, + "showlegend": false, + "side": "negative", + "type": "violin", + "name": "M", + "span": [ + 0 + ], + "line": { + "color": "#8dd3c7" + }, + "y0": "Friday", + "x": [ + 28.97, + 22.49, + 40.17, + 27.28, + 12.03, + 21.01, + 12.46, + 12.16, + 8.58, + 13.42 + ], + "orientation": "h" + }, + { + "legendgroup": "F", + "scalegroup": "F", + "points": "all", + "pointpos": 0.1, + "jitter": 0, + "scalemode": "count", + "marker": { + "line": { + "width": 2, + "color": "#bebada" + }, + "symbol": "line-ns" + }, + "showlegend": true, + "side": "positive", + "type": "violin", + "name": "F", + "span": [ + 0 + ], + "line": { + "color": "#bebada" + }, + "y0": "Saturday", + "x": [ + 20.29, + 15.77, + 19.65, + 15.06, + 20.69, + 16.93, + 26.41, + 16.45, + 3.07, + 17.07, + 26.86, + 25.28, + 14.73, + 44.3, + 22.42, + 20.92, + 14.31, + 7.25, + 10.59, + 10.63, + 12.76, + 13.27, + 28.17, + 12.9, + 30.14, + 22.12, + 35.83, + 27.18 + ], + "orientation": "h" + }, + { + "legendgroup": "M", + "scalegroup": "M", + "points": "all", + "pointpos": -0.1, + "jitter": 0, + "scalemode": "count", + "marker": { + "line": { + "width": 2, + "color": "#8dd3c7" + }, + "symbol": "line-ns" + }, + "showlegend": true, + "side": "negative", + "type": "violin", + "name": "M", + "span": [ + 0 + ], + "line": { + "color": "#8dd3c7" + }, + "y0": "Saturday", + "x": [ + 20.65, + 17.92, + 39.42, + 19.82, + 17.81, + 13.37, + 12.69, + 21.7, + 9.55, + 18.35, + 17.78, + 24.06, + 16.31, + 18.69, + 31.27, + 16.04, + 38.01, + 11.24, + 48.27, + 20.29, + 13.81, + 11.02, + 18.29, + 17.59, + 20.08, + 20.23, + 15.01, + 12.02, + 10.51, + 17.92, + 15.36, + 20.49, + 25.21, + 18.24, + 14.0, + 50.81, + 15.81, + 26.59, + 38.73, + 24.27, + 30.06, + 25.89, + 48.33, + 28.15, + 11.59, + 7.74, + 20.45, + 13.28, + 24.01, + 15.69, + 11.61, + 10.77, + 15.53, + 10.07, + 12.6, + 32.83, + 29.03, + 22.67, + 17.82 + ], + "orientation": "h" + }, + { + "legendgroup": "F", + "scalegroup": "F", + "points": "all", + "pointpos": 0.1, + "jitter": 0, + "scalemode": "count", + "marker": { + "line": { + "width": 2, + "color": "#bebada" + }, + "symbol": "line-ns" + }, + "showlegend": false, + "side": "positive", + "type": "violin", + "name": "F", + "span": [ + 0 + ], + "line": { + "color": "#bebada" + }, + "y0": "Sunday", + "x": [ + 16.99, + 24.59, + 35.26, + 14.83, + 10.33, + 16.97, + 10.29, + 34.81, + 25.71, + 17.31, + 29.85, + 25.0, + 13.39, + 16.21, + 17.51, + 9.6, + 20.9, + 18.15 + ], + "orientation": "h" + }, + { + "legendgroup": "M", + "scalegroup": "M", + "points": "all", + "pointpos": -0.1, + "jitter": 0, + "scalemode": "count", + "marker": { + "line": { + "width": 2, + "color": "#8dd3c7" + }, + "symbol": "line-ns" + }, + "showlegend": false, + "side": "negative", + "type": "violin", + "name": "M", + "span": [ + 0 + ], + "line": { + "color": "#8dd3c7" + }, + "y0": "Sunday", + "x": [ + 10.34, + 21.01, + 23.68, + 25.29, + 8.77, + 26.88, + 15.04, + 14.78, + 10.27, + 15.42, + 18.43, + 21.58, + 16.29, + 17.46, + 13.94, + 9.68, + 30.4, + 18.29, + 22.23, + 32.4, + 28.55, + 18.04, + 12.54, + 9.94, + 25.56, + 19.49, + 38.07, + 23.95, + 29.93, + 14.07, + 13.13, + 17.26, + 24.55, + 19.77, + 48.17, + 16.49, + 21.5, + 12.66, + 13.81, + 24.52, + 20.76, + 31.71, + 7.25, + 31.85, + 16.82, + 32.9, + 17.89, + 14.48, + 34.63, + 34.65, + 23.33, + 45.35, + 23.17, + 40.55, + 20.69, + 30.46, + 23.1, + 15.69 + ], + "orientation": "h" + } + ] +} From e625c44e31dcb5d6097d527be7252fe4f986f668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Mon, 30 Oct 2017 23:30:08 -0400 Subject: [PATCH 16/25] 1st cut violin jasmine tests --- test/jasmine/tests/select_test.js | 52 +++++ test/jasmine/tests/violin_test.js | 354 ++++++++++++++++++++++++++++++ 2 files changed, 406 insertions(+) create mode 100644 test/jasmine/tests/violin_test.js diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index 72f29593e3f..3bf53a8337e 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -971,6 +971,58 @@ describe('Test select box and lasso per trace:', function() { .catch(fail) .then(done); }); + + it('should work for violin traces', function(done) { + var assertPoints = makeAssertPoints(['curveNumber', 'y', 'x']); + var assertRanges = makeAssertRanges(); + var assertLassoPoints = makeAssertLassoPoints(); + + var fig = Lib.extendDeep({}, require('@mocks/violin_grouped')); + fig.layout.dragmode = 'lasso'; + fig.layout.width = 600; + fig.layout.height = 500; + addInvisible(fig); + + Plotly.plot(gd, fig) + .then(function() { + return _run( + [[200, 200], [400, 200], [400, 350], [200, 350], [200, 200]], + function() { + assertPoints([ + [0, 0.3, 'day 2'], [0, 0.5, 'day 2'], [0, 0.7, 'day 2'], [0, 0.9, 'day 2'], + [1, 0.5, 'day 2'], [1, 0.7, 'day 2'], [1, 0.7, 'day 2'], [1, 0.8, 'day 2'], + [1, 0.9, 'day 2'], + [2, 0.3, 'day 1'], [2, 0.6, 'day 1'], [2, 0.6, 'day 1'], [2, 0.9, 'day 1'] + ]); + assertLassoPoints([ + ['day 1', 'day 2', 'day 2', 'day 1', 'day 1'], + [1.02, 1.02, 0.27, 0.27, 1.02] + ]); + }, + null, LASSOEVENTS, 'violin lasso' + ); + }) + .then(function() { + return Plotly.relayout(gd, 'dragmode', 'select'); + }) + .then(function() { + return _run( + [[200, 200], [400, 350]], + function() { + assertPoints([ + [0, 0.3, 'day 2'], [0, 0.5, 'day 2'], [0, 0.7, 'day 2'], [0, 0.9, 'day 2'], + [1, 0.5, 'day 2'], [1, 0.7, 'day 2'], [1, 0.7, 'day 2'], [1, 0.8, 'day 2'], + [1, 0.9, 'day 2'], + [2, 0.3, 'day 1'], [2, 0.6, 'day 1'], [2, 0.6, 'day 1'], [2, 0.9, 'day 1'] + ]); + assertRanges([['day 1', 'day 2'], [0.27, 1.02]]); + }, + null, BOXEVENTS, 'violin select' + ); + }) + .catch(fail) + .then(done); + }); }); // to make sure none of the above tests fail with extraneous invisible traces, diff --git a/test/jasmine/tests/violin_test.js b/test/jasmine/tests/violin_test.js new file mode 100644 index 00000000000..d9082607b58 --- /dev/null +++ b/test/jasmine/tests/violin_test.js @@ -0,0 +1,354 @@ +var Plotly = require('@lib'); +var Lib = require('@src/lib'); +var Plots = require('@src/plots/plots'); + +var Violin = require('@src/traces/violin'); + +var createGraphDiv = require('../assets/create_graph_div'); +var destroyGraphDiv = require('../assets/destroy_graph_div'); +var fail = require('../assets/fail_test'); +var mouseEvent = require('../assets/mouse_event'); + +var customAssertions = require('../assets/custom_assertions'); +var assertHoverLabelContent = customAssertions.assertHoverLabelContent; + +describe('Test violin defaults', function() { + var traceOut; + + function _supply(traceIn, layout) { + traceOut = {}; + Violin.supplyDefaults(traceIn, traceOut, '#444', layout || {}); + } + + it('should set visible to false when x and y are empty', function() { + _supply({ + x: [], + y: [] + }); + + expect(traceOut.visible).toBe(false); + }); + + it('should inherit layout.calendar', function() { + _supply({y: [1, 2, 3]}, {calendar: 'islamic'}); + + // we always fill calendar attributes, because it's hard to tell if + // we're on a date axis at this point. + expect(traceOut.xcalendar).toBe('islamic'); + expect(traceOut.ycalendar).toBe('islamic'); + }); + + it('should take its own calendars', function() { + _supply({ + y: [1, 2, 3], + xcalendar: 'coptic', + ycalendar: 'ethiopian' + }, { + calendar: 'islamic' + }); + + // we always fill calendar attributes, because it's hard to tell if + // we're on a date axis at this point. + expect(traceOut.xcalendar).toBe('coptic'); + expect(traceOut.ycalendar).toBe('ethiopian'); + }); + + it('should not coerce point attributes when *points* is false', function() { + _supply({ + y: [1, 1, 2], + points: false + }); + + expect(traceOut.points).toBe(false); + expect(traceOut.jitter).toBeUndefined(); + expect(traceOut.pointpos).toBeUndefined(); + expect(traceOut.marker).toBeUndefined(); + expect(traceOut.text).toBeUndefined(); + }); + + it('should default *points* to suspectedoutliers when marker.outliercolor is set & valid', function() { + _supply({ + y: [1, 1, 2], + marker: { outliercolor: 'blue' } + }); + + expect(traceOut.points).toBe('suspectedoutliers'); + }); + + it('should default *points* to suspectedoutliers when marker.line.outliercolor is set & valid', function() { + _supply({ + y: [1, 1, 2], + marker: { line: {outliercolor: 'blue'} } + }); + + expect(traceOut.points).toBe('suspectedoutliers'); + expect(traceOut.marker).toBeDefined(); + expect(traceOut.text).toBeDefined(); + }); + + it('should default *spanmode* to manual when *span* is set to an array', function() { + _supply({ + y: [1, 1, 2], + span: [0, 1] + }); + expect(traceOut.span).toEqual([0, 1]); + expect(traceOut.spanmode).toBe('manual'); + + _supply({ + x: [1, 1, 2], + span: 'not-gonna-work' + }); + expect(traceOut.span).toBeUndefined(); + expect(traceOut.spanmode).toBe('soft'); + }); + + it('should default show* attributes when one of their corresponding style attributes is set & valid', function() { + _supply({ + y: [1, 2, 1], + innerboxwidth: 0.1, + meanlinecolor: 'red' + }); + expect(traceOut.showinnerbox).toBe(true); + expect(traceOut.showmeanline).toBe(true); + + _supply({ + y: [1, 2, 1], + showinnerbox: false, + showmeanline: false, + innerboxwidth: 0.1, + meanlinecolor: 'red' + }); + expect(traceOut.showinnerbox).toBe(false); + expect(traceOut.innerboxwidth).toBeUndefined(); + expect(traceOut.showmeanline).toBe(false); + expect(traceOut.meanlinecolor).toBeUndefined(); + }); + + it('should use violin style settings to default inner style attribute', function() { + _supply({ + y: [1, 2, 1], + fillcolor: 'red', + line: {color: 'blue', width: 10}, + showinnerbox: true, + showmeanline: true, + }); + expect(traceOut.innerboxfillcolor).toBe('red'); + expect(traceOut.innerboxlinecolor).toBe('blue'); + expect(traceOut.innerboxlinewidth).toBe(10); + expect(traceOut.meanlinecolor).toBe('blue'); + expect(traceOut.meanlinewidth).toBe(10); + }); +}); + +describe('Test violin calc:', function() { + var cd, fullLayout; + + function _calc(attrs, layout) { + var gd = { + data: [Lib.extendFlat({type: 'violin'}, attrs)], + layout: layout || {}, + calcdata: [] + }; + Plots.supplyDefaults(gd); + Plots.doCalcdata(gd); + cd = gd.calcdata[0]; + fullLayout = gd._fullLayout; + } + + it('should compute bandwidth and span based on the sample and *spanmode*', function() { + var y = [1, 1, 2, 2, 3]; + + _calc({y: y}); + expect(cd[0].bandwidth).toBeCloseTo(0.64); + expect(cd[0].span).toBeCloseToArray([-0.28, 4.28]); + + _calc({ + y: y, + spanmode: 'hard' + }); + expect(cd[0].span).toBeCloseToArray([1, 3]); + + _calc({ + y: y, + span: [0, 0] + }); + expect(cd[0].span).toBeCloseToArray([-1, 1], 'cleans up invalid range'); + + _calc({ + y: y, + span: [null, 5] + }); + expect(cd[0].span).toBeCloseToArray([-0.28, 5], 'defaults to soft bound'); + + _calc({ + y: y, + span: [0, null] + }); + expect(cd[0].span).toBeCloseToArray([0, 4.28], 'defaults to soft bound'); + }); + + it('should fill in scale-group stats', function() { + _calc({ + name: 'one', + y: [0, 0, 0, 0, 10, 10, 10, 10] + }); + expect(fullLayout._violinScaleGroupStats.one.maxWidth).toBeCloseTo(0.055); + expect(fullLayout._violinScaleGroupStats.one.maxCount).toBe(8); + }); +}); + +describe('Test violin hover:', function() { + var gd; + + afterEach(destroyGraphDiv); + + function run(specs) { + gd = createGraphDiv(); + + var fig = Lib.extendDeep( + {width: 700, height: 500}, + specs.mock || require('@mocks/violin_grouped.json') + ); + + if(specs.patch) { + fig = specs.patch(fig); + } + + var pos = specs.pos || [200, 200]; + + return Plotly.plot(gd, fig).then(function() { + mouseEvent('mousemove', pos[0], pos[1]); + assertHoverLabelContent(specs); + }); + } + + [{ + desc: 'base', + nums: [ + 'median: 0.55', 'min: 0', 'q1: 0.3', 'q3: 0.6', 'max: 0.7', + 'y: 0.9266848, kde: 0.182' + ], + name: ['radishes', '', '', '', '', ''], + axis: 'day 1' + }, { + desc: 'with mean', + patch: function(fig) { + fig.data.forEach(function(trace) { + trace.showmeanline = true; + }); + return fig; + }, + nums: [ + 'median: 0.55', 'min: 0', 'q1: 0.3', 'q3: 0.6', 'max: 0.7', 'mean: 0.45', + 'y: 0.9266848, kde: 0.182' + ], + name: ['radishes', '', '', '', '', '', ''], + axis: 'day 1' + }, { + desc: 'with overlaid violins', + patch: function(fig) { + fig.layout.violinmode = 'overlay'; + return fig; + }, + nums: [ + 'q3: 0.6', 'median: 0.45', 'q3: 0.6', 'max: 1', 'y: 0.9266848, kde: 0.383', + 'median: 0.55', 'max: 0.7', 'y: 0.9266848, kde: 0.182', + 'median: 0.45', 'q3: 0.6', 'max: 0.9', 'y: 0.9266848, kde: 0.435', + 'q3: 0.6', 'max: 0.9' + ], + name: [ + '', 'kale', '', '', '', 'radishes', '', + '', 'carrots', '', '', '' + ], + axis: 'day 1' + }, { + desc: 'hoveron points | hovermode closest', + patch: function(fig) { + fig.data.forEach(function(trace) { + trace.points = 'all'; + trace.hoveron = 'points'; + }); + fig.layout.hovermode = 'closest'; + return fig; + }, + pos: [220, 200], + nums: '(day 1, 0.9)', + name: 'carrots' + }, { + desc: 'hoveron points | hovermode x', + patch: function(fig) { + fig.data.forEach(function(trace) { + trace.points = 'all'; + trace.hoveron = 'points'; + }); + fig.layout.hovermode = 'x'; + return fig; + }, + pos: [220, 200], + nums: '0.9', + name: 'carrots', + axis: 'day 1' + }, { + desc: 'hoveron violins+points | hovermode x (hover on violin only - same result as base)', + patch: function(fig) { + fig.data.forEach(function(trace) { + trace.points = 'all'; + trace.hoveron = 'points+violins'; + }); + fig.layout.hovermode = 'x'; + return fig; + }, + nums: ['median: 0.55', 'min: 0', 'q1: 0.3', 'q3: 0.6', 'max: 0.7'], + name: ['radishes', '', '', '', ''], + axis: 'day 1' + }, { + desc: 'hoveron violins+points | hovermode x (violin AND closest point)', + patch: function(fig) { + fig.data.forEach(function(trace) { + trace.points = 'all'; + trace.hoveron = 'points+violins'; + trace.pointpos = 0; + }); + fig.layout.hovermode = 'x'; + return fig; + }, + pos: [207, 240], + nums: ['0.7', 'median: 0.55', 'min: 0', 'q1: 0.3', 'q3: 0.6', 'max: 0.7'], + name: ['radishes', 'radishes', '', '', '', ''], + axis: 'day 1' + }, { + desc: 'text items on hover', + patch: function(fig) { + fig.data.forEach(function(trace) { + trace.points = 'all'; + trace.hoveron = 'points'; + trace.text = trace.y.map(function(v) { return 'look:' + v; }); + }); + fig.layout.hovermode = 'closest'; + return fig; + }, + pos: [180, 240], + nums: '(day 1, 0.7)\nlook:0.7', + name: 'radishes' + }, { + desc: 'only text items on hover', + patch: function(fig) { + fig.data.forEach(function(trace) { + trace.points = 'all'; + trace.hoveron = 'points'; + trace.text = trace.y.map(function(v) { return 'look:' + v; }); + trace.hoverinfo = 'text'; + }); + fig.layout.hovermode = 'closest'; + return fig; + }, + pos: [180, 240], + nums: 'look:0.7', + name: '' + }] + .forEach(function(specs) { + it('should generate correct hover labels ' + specs.desc, function(done) { + run(specs).catch(fail).then(done); + }); + }); +}); From 14bded32842e2dfbcec16a8efc89def42fdf2e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 31 Oct 2017 09:34:52 -0400 Subject: [PATCH 17/25] fill violin attribute descriptions + fix typo in comment --- src/lib/geometry2d.js | 2 +- src/traces/violin/attributes.js | 58 ++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/lib/geometry2d.js b/src/lib/geometry2d.js index fbd10b935ba..8cb21eae047 100644 --- a/src/lib/geometry2d.js +++ b/src/lib/geometry2d.js @@ -214,7 +214,7 @@ exports.findPointOnPath = function findPointOnPath(path, val, coord, opts) { var iterationLimit = opts.iterationLimit || 30; // if path starts at a val greater than the path tail (like on vertical violins), - // we must flip the sign of the compute diff. + // we must flip the sign of the computed diff. var mul = path.getPointAtLength(0)[coord] > path.getPointAtLength(pathLength)[coord] ? -1 : 1; var i = 0; diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index 6d596302fef..3df8ef13d85 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -118,10 +118,33 @@ module.exports = { }, fillcolor: boxAttrs.fillcolor, - // TODO update description - points: boxAttrs.boxpoints, - jitter: boxAttrs.jitter, - pointpos: boxAttrs.pointpos, + points: extendFlat({}, boxAttrs.boxpoints, { + description: [ + 'If *outliers*, only the sample points lying outside the whiskers', + 'are shown', + 'If *suspectedoutliers*, the outlier points are shown and', + 'points either less than 4*Q1-3*Q3 or greater than 4*Q3-3*Q1', + 'are highlighted (see `outliercolor`)', + 'If *all*, all sample points are shown', + 'If *false*, only the violins are shown with no sample points' + ].join(' ') + }), + jitter: extendFlat({}, boxAttrs.jitter, { + description: [ + 'Sets the amount of jitter in the sample points drawn.', + 'If *0*, the sample points align along the distribution axis.', + 'If *1*, the sample points are drawn in a random jitter of width', + 'equal to the width of the violins.' + ].join(' ') + }), + pointpos: extendFlat({}, boxAttrs.pointpos, { + description: [ + 'Sets the position of the sample points in relation to the violins.', + 'If *0*, the sample points are places over the center of the violins.', + 'Positive (negative) values correspond to positions to the', + 'right (left) for vertical violins and above (below) for horizontal violins.' + ].join(' ') + }), marker: boxAttrs.marker, text: boxAttrs.text, @@ -130,7 +153,9 @@ module.exports = { dflt: false, role: 'info', editType: 'plot', - description: '.' + description: [ + 'Determines if an miniature box plot is drawn inside the violins. ' + ].join(' ') }, innerboxwidth: { valType: 'number', @@ -139,26 +164,30 @@ module.exports = { dflt: 0.25, role: 'info', editType: 'plot', - description: '...' + description: [ + 'Sets the width of the inner box plots relative to', + 'the violins\' width.', + 'For example, with 1, the inner box plots are as wide as the violins.' + ].join(' ') }, innerboxlinecolor: { valType: 'color', role: 'style', editType: 'style', - description: '' + description: 'Sets the inner box plot bounding line color.' }, innerboxfillcolor: { valType: 'color', role: 'style', editType: 'style', - description: '' + description: 'Sets the inner box plot fill color.' }, innerboxlinewidth: { valType: 'number', min: 0, role: 'style', editType: 'style', - description: '' + description: 'Sets the inner box plot bounding line width.' }, showmeanline: { @@ -166,20 +195,25 @@ module.exports = { dflt: false, role: 'info', editType: 'plot', - description: 'Toggle' + description: [ + 'Determines if a line corresponding to the sample\'s mean is shown', + 'inside the violins.', + 'If `showinnerbox` is turned on, the mean line is drawn inside the inner box.', + 'Otherwise, the mean line is drawn from one side of the violin to other.' + ].join(' ') }, meanlinecolor: { valType: 'color', role: 'style', editType: 'style', - description: '' + description: 'Sets the mean line color.' }, meanlinewidth: { valType: 'number', min: 0, role: 'style', editType: 'style', - description: '' + description: 'Sets the mean line width.' }, side: { From 48758d8522609006cc8e3fe3323a4c38a0510fd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Tue, 31 Oct 2017 10:41:52 -0400 Subject: [PATCH 18/25] fixup scalemode 'count' calculation --- src/traces/violin/plot.js | 3 +-- test/image/baselines/violin_side-by-side.png | Bin 42508 -> 40787 bytes test/image/mocks/violin_side-by-side.json | 18 +++++++++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index bb2827ebfae..36333b28710 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -80,7 +80,7 @@ module.exports = function plot(gd, plotinfo, cd) { scale = groupStats.maxWidth / bdPos; break; case 'count': - scale = (groupStats.maxWidth / bdPos) * (groupStats.maxCount / len); + scale = (groupStats.maxWidth / bdPos) * (groupStats.maxCount / d.pts.length); break; } @@ -133,7 +133,6 @@ module.exports = function plot(gd, plotinfo, cd) { d.posDensityScale = scale * bdPos; d.path = pathSel.node(); d.pathLength = d.path.getTotalLength() / (hasBothSides ? 2 : 1); - }); if(trace.showinnerbox) { diff --git a/test/image/baselines/violin_side-by-side.png b/test/image/baselines/violin_side-by-side.png index e4c7ad1222ec5923cafae2b72c8064e089ebcada..73e782eb1127d4bcbd8c76839fd02e3576ff8201 100644 GIT binary patch literal 40787 zcmeFZXH-<%)-Ad!P-H1UQjtocl5-HmA_yoTk|YPoNRnLS0t7)aNX{Ujl2I}!2$GRt zAW6=WK?x%87JGl^T=%)({qx#=?X}n5{RI?j%`oPebB@t_uMu(Yt`aE`iU&I^0MNi~1zByZ$wn3-_PI{dnYyOV_@TSpwut+r2s$IY`Uu}8 zQ=?5|yo(&-@?aF=0%Lpt*ENbWre(0QF$>c{S|gQgFbcA^l|fF8YrIog{_5;HJ?Gxe zOZNj`mfy)TG}X~e^4Z>Byshc+cC)2#Tk7yzp{2RGxm@ZCfGQWNjU$rax+jN|;8Jws z!r+0Q2@oOCJOtq9_aIzx@ld$3V)ZWi?|-2&dWgT@LbKu##6?*y$o~Bt23JV}J`TQ* zQ3PM7>*);nuhxMFbbobnFDU9V8Y7etjj!?7a{%PM&|lr>wtNmi65<`C!!O2&!6QH>|J^24w=x9E#yXBg z{yj5rBCx*)`2WL+^bZR?T28a+EmF%U@^36DZ@hC!VirfIF&i8ByTHh`huwAX#-Xy7 zmez>he$2+`BB%>jcsrB->*MJ(x~X@BpC$VJU<@Xn++lBT}m-6m+3@VQ=;RQ z72fV=ZFk@1%wj9KU)C#$0b*%P{f04jG6K%_b5#8OTNna=@4k{38GL?S165#on6xo5 zUQazJcu0lDEC(=UaQ>crcWSurc{WEDD6znKwi_GBbK}MhNxW|1L21_WUlr%y{bCz_ zV2qp*q~<}aI)33)Wezcj8V!{+0n6#!E@|Eu#-UZE!I3)zx@I6Vxv|1nWHcU@5T6$uV1Yj zy-l!lcx$VxagB}FC4cXe@XhAsV zSoOEjPU(qqz6B?+o`>-`B=^5mOH&wr0*x zXO?!mn8kgPl9GD1nzo&!r85`$OwXz%bHt~-X8bkv_3gG!Xx<%#{ysZ=mvXZG&J=-< zPbxr9Pp>6I`SE%BMIcHT}Oo_~=t4bW_&4k9O-R(JNKZ-j) zsd|~3+;GVjpT^3cZO)vj-LEj=y~^5`%scrZ^48mc!={;}?ZESsWl0n7C8}$@yh%yi zy6Hl%SF(MJ_%q*J)dNi#JaD~^KIanJ_UiCaLA>IJnYaE;xg{2Ue&2qa6wJxrJg$3p z>gc8+BBG3gp@>E5fuWP>LmB=0M|sT$6ZS>2Qge?fRbk6eB+j-cfqid$FyKBlj~;q` zv?67_;+@I#@kg&--M4#GZsiUTI1opNYCf6Tj_JZs zK=wcbr_=V`qA_Ok-Kcu<dEc4vNq0}rbUq1@ z4T(#n?m}0~^Gc(VUN-Ew?00h4#QV8lORMzG0;ecz8je6hTD1s88 zPWA_H&bX_z*;f)quW{ZyzWu2_8#^Ddyx<(LpRruWfq;&+(nFMuAi;|G$f~u#vz0(q zi%Tzf4c=Vk2I%PN6SeM2-jdk~B1;vw%9thp-G1|T2%S+}FRWoX-F~qm@U+CpYsy1Y zQ!_!tOXi>|w#TkGORSK%4+jw-5|9=|4P@{&Z3ulT1YfMY zCC+S4d;Zh(+-kaG*cd-mFV1%6$EJtY4a&w2zUH0x&!dmj#HTD9`$dfP_<$fU&wjx! zHb(a)rJP)$|?LCKykJmR%$@_kgH&y}mClJJ8SktXje0)CblPv_4C z<;r%%jcWt4W{mzbtDH)(>(0~C3q85(Fo=sT89c}ip4rkPra1lsgRGOyTmn5TVxwvM ztycMyE!qx_B3O9c96oLrafx*H3)+epO^|L;87zLfeSTJv`{3?M5SlN%4VTP_S|x^&X*+LMx! z_HfGV62hoRF&jbQq^&Ud9a_S42n)e;^%X1CL&mUO^TjWlbu)ZzW�B?oE)7M+}5P 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 Date: Tue, 31 Oct 2017 10:51:34 -0400 Subject: [PATCH 19/25] add inner box and mean line to side-by-side violin mock --- test/image/baselines/violin_side-by-side.png | Bin 40787 -> 42616 bytes test/image/mocks/violin_side-by-side.json | 48 ++++++++++++------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/test/image/baselines/violin_side-by-side.png b/test/image/baselines/violin_side-by-side.png index 73e782eb1127d4bcbd8c76839fd02e3576ff8201..591ff342f6c1f0d308d6fc3712ed6e5049ae949a 100644 GIT binary patch literal 42616 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.@9)6LU<>fA`U`Z9A=fn!9!P%rna8_GLI>6M?N~NoG*ZsY?dd4ojKg zhco=f)`2ye$2l|XtU@P5IJA_nB8oEzXC7z~?b%YD>DbkEx-0W7*wT@Z=<#8khwai{ zQhS>>5!&^Aa0GhcDKw$jbtXBXVdu*>w;(B;xGiHAV1@X)jT1n0o`f z05aq)*Te4|Ti4cU=(fX;fBAr4cuxUYaOddd{3|JnQ=pDyc#p=5AkVJWdmM)Ic7hs} zeD>)>&FaN377`{n!L~`m4>L2MAosB^vuGPPGJKl0WW7^U58avSC%561z=0VM;cv}* zN-k4nKfWOd!5^vp)Q=60$I-_Xewa;xL;HJL1$CwqwX~0Ffnp)88VhfZU~ZU=e4qL! z)iTNtRtU#)0$cK(!M@kV2wh6VKzs&uDA^;Y6-)+jlwwY$p8kWe> z*fNO#+pXmJ{5@A7q4%%QARP}8{KRmOirvWgTYfX=Bg5bz8c}%rJ$?%Nh$P%FF==A? z0da_>VTcrwJ|y_npTgb`4ff_tDu);sG1HeCyg+y!l3=g-8JGL1e5`7LkJMrVd6 zF@MphNV8t#)Sx+2Lf`J#9mo0Y!_8nb@ZXLF5HmYC(Mp#_*|@ zqY>M8$(rOc(r0ACCM)2UY?jgzZOBcJXpw(wEslBgr-5mpoGIelk8R{22;-od_RRK4 zwC|X_P4&C54qncSz+Z*&b5D>uf!R@M^0Bt;8zKesO&$ga8Xm!b#51&R@E2+t9Bt zj-u@KCxmr4p%)fj2?L#tKyyNTf$kQv za>7u(9Cr%w)K)oaN{9E48?&c4M~-5x0=HfoaH3fn@ag`FNnaV2!GQSsHj20;1-$D=vLM>fFh3o_F%Ry*!godc4-Dm?J0@m#aS;vfCQ)5|Tbu)%*d(=uPx;SXm$Z35GQ`p}q`~Ma zd5OCiV;F(UbHOz2&OP9MFn0sUK3CS=tbgHgQ~+};4^ItssN5m&D*$DmPef|`1;;V9 z!I12X%Ji_mgr{>2K-DRwDb4;1WZ%JRF$+;5r8|(l53u@6215FOA?}Bk02d$d&6g?d z4yi8~0P4|K*T&etVEgbLY)`$G7ruk-Enfk}$#2J<@$Moc1Lzc{;AOJ=9rj1~0V>t) z^nvVOM1UC3DPreSo&x~gzXaa`ZQOiWj=#I`4^T&dST?pTmi`*c|AK*i)42IP@s)4l zqtEHow+Yfw)CUh9jE;{pB9X|T_cjJrH00#bnVIzYMMcLhKA&_uxJeWhiC~KxAC5~< zLKSV)T~igy=;6-Vbi7_35jb-q%uKd4KAaJ}l&KEafk-gJSQ`|X zArhrT{qOZz$>bm%lEsK>;K}g2C!>VwGbgY#sk0}bgobN_ZSUcyB8s*JQ!((H6pa${ z{rx}N%#0RC4cN)af7P#5syuS3a|Q!^#!ndB**HXN%7v?kj#Y7ad{r&UtRT-z=H_5P zs+C7q+~;`?wc~f;L^-E#37}r%1bmoad3(`zJ^4x$2{^OAkh7l{bhtf6m0i>*@p|jg zsI;X-c2<)CM)a}rNE;w;X0qZMsk`c7A9lY3jodZf2g%N?P}R1WNJ#}VVP0Rqnri+s z!w)Z$YfrXFV;LVGH;HqdGZHr1Vg01VaVQ{{KYJVRy-LLFUB=C`wsLX zZ+PSEpHFzr4Qk`U*K1Z{VTDK}rvCGn|5J~@>jk{0KKi#=d9yMF$wE265XzSI`Yu_y4>3 z(ad!gtkZU+2`w}RZv)fneiu=Ol8B8eAeJ{*UP~fsACb1Cfkwi*|0iQv1&B6QZiarL znd6u#TP-$8r{jpH-zHW^QBh<_-vk0J)BJ161*+_rq(|nOGPUKUau^Twuc!aZ3xKaTH}bj$ zIKWCCzWvum0M<~$D1ikl`geuXQvi3p8>6a=WEB1z}5V8t*g6DC`vf||0921}Dj;J35#p)#xFDQymb z&}+t;{qY!R2cITfL(eBj-ah}tM-BuD~J`#mEFCXRe&x0rN(>u#Rq z?1s}vAU#M0?dk8YrkbR7*q7J(QlSu>50MPgVO$YU++ zL|H|JU7Dr=o;n5UDbP3_hX2R+a6L`)l_K7G2cRqJpc zyreJhbcqRJxCF7Vu*Yh8OJGF*ETJ;$wtECw$xX3~#q-?{beeUUc%h;a=e>w!5RJuN z3*Y^E>${xlfX%S29KU)=1Vh27FWc}pty>E6mOnH_`v3Gk8g#londpz8;8{6ej!Nw3 z`1-SDt&>y@`eiqXG*y?%P~UFBYM zFN^V_XgugX93y&vOY1%u#p=3)`Pu!XX|H7@zwGnpP%!sXNw%vzLZAa+LSGS9Uc^tw zZkh_4Dej9OHO*$R-`I*F4OAu`U!Hqb-J z)_U?3i}k=`lbdy{vdreU02XWNVcmrfUwv5_VN;HBIiZh)DO4kK-CV49RdbaRuFf`N zzVZ&I8&EU)Ba-W_8i#I8;_7xM{j_+Q&WQZ9tbIk#qkoiJHJ(=bB*^nXyFooNF@Stj zK9DvBn{g}M+n+-}lljfm|At19(9kFm3(iIgHa03zc#LL(yy`ZC|uY|)C*!rvqEUAhmK(@I% zLh~r$Ak0b@lWxTJ&yg*i(io{Ys4oeCTS^kGIpA~&3AB8Ba`)6s-f;V|y=Ts=0&RuPG z$r;H2C1EBj4bTx_Sdb32a?t4ocC@WdJ!<&E_K&@2@JzW0&b|8V{V}_t-A4rVO=!O# zP9F#6SR4EAe~~iM+T%67Ui*Gnd}bo_&X(?o?D0ZWz92;?S8w zC}lG4!FlNM32t(w5PeMTf;|d3n4(RbV*DC%a>xaX`|WROLrYYFRY=t> z#=zI;giNjr!ejlRg(XxU3I>bvZBRMj+dN=AXx!ZWH)V1BAbRq*936J-K&pH6=QO?{ zf%Uc+SxChv#G}ZRf0c^^cX;K685%d#Nkx?x@00lp*8{oQj1-(X);sA#}K2J!YDZqfQat`mB6@Ahw6q(pY3@FW{YICe9FP z>=q7$>VKt}Pz|e{RT#ZT4)YK0Pb);7f)jcZeFj|?H zhy~xz+vS?_vT}i?B9360f})_jrP+3@@Z~SFEGuP7VdgGTaY{+J0m zH282dg@erowe|NhW|9{F_~j|>?idz4ltbKZhYmaWM}6RELv|S^Q0$|AE-MhNoG>ZB ze*fhBxo|I2OxPLMGFw^+m#7IlkgvrF|B6mbTG*X_{?mOKIXXPNP>@>blM4zcf!U-- z(l|EFd|t+>X)f<`&O4u-9De$$fun~Q{&J+D0gdq)H$4(LuC>#4nBw}_Fxvh+-LC6H zDuH>oE)%8weYkU-)L$L%(?T2{ANMHv{Z{b+iVjBFs5>XkO25HP#Xu5Q`x7M5^g0%N z!79W05dozP^_=O5%lp9{DMHCX26(+7`he=3H@ZxHz^@(3%CAbi(e{TPXYl4AOmM8? z>d4;TTjePheoIzut>!nOJz*uJ?KyP$$Leu1{xjii!q)-l0-dL36J7Y&vk;q+j?g|qGH5euEZ(z71zwY zt}lKD_|f`+;XI;5RDJoOGA9fSO_caiR&tc$<;Ij8zF318O?dL@I2&CEIjP~AUI zlEmjIYb%@Hu&*GrG#MGE=I;s2^LC%ZAj0NUnMo9U^xV7xf;`xM53q5NH}cpgI3!Lj ztz&QKH)Gu8U2$=eYLB}zM`@4|oz@zrFN2MkGk0Wu(&p8BewQ=Z&x0#M zJD4_e67^#NL(R+~(%$<) z8$lSx-gnjKn>Upo0jt{Kovn=4eZjx{t)c4=mb{PLX!wm*8R0AhFa(Bh?49>=O-S{b zJB*yam5Mqeu=Ud8Xf3%d80;$aBfv2h6^pc|9Z!_)PI;Y7dMD@cd!!;S_Jc-Zg4`R) z9Qne}#8+wg`zw(O$@OZxKhbw+6Y`=WQ1s|yg{=Bs%10)1@jrLN^i8>048`tT8Wp0B zk@40H4mKGj8E>)~ET-5|EaWJR4n7pIsIO90my_&G>&!WFov||RXJ6E8Fx$pmFn$;zSm$xs??GFU_;yz-d1jXQNthEy<*-zFW7FVO+dze0HazzTx?g<0`C2jF1Iz zl&PIdV7|=-K3mx~Rra1hR7B7IZm~Q_n^*a9{1Ykk#?DjeEC2}e?e2UZs$^@doZbH& zW?f)CJRVYBD{phTDYC?XmUBp(E@ zG>h?Tvq>N{Ik7uK2FXz%!ssZ-vxUcaAi);9h7ZG?Z`ql>6RiC~_n4(I@N-I{L~m-7 z!%&BM?1w=ea}7e=3`*OR46K4PUBZNogJ0CgfBSfEOqfAolS?SK@3LjyK?zMCK~ZL9 zeA-`ahU2ENGa>Tz`ih6r1UWR4;-Fk91Xq=9YCOep)YsBzN z5P~MKMPz%y`B{LN4%t2YVr4s5l+YA?|DtP9$1{9A9lz#{< zKw=NH5;>oDN8w&<`*$okT18>^l(d2?)gfahP2iVs4Z`~OoJ>#R7c+VR@R1eUfCFAC zN#0`(0HNS@8ge(rJej3o!UgrTedzi~L3JPQO@?z4MDsjwly)ALSfq< z6Pi`?IbyMqLA;HtLy-}vXKJ#3iI_|Q2%xy`>SCTbjNI$pdCteo^;H#IwgM4Wjdjnk zu;#iVKlx5g&-2)w5*e0f6sVu(TfI-H&u=1mG5lH9i`q(If6gj52F{S_5i`1ymzzztU~;Uqo;eunBpHQaYpDuMdO2 z@7b-Fu;%{>NssqDDJYKi9#TE)pXS!RV?0;Wa$Ls4q~o)638wRQS((CP8A~IiF)~Ngh(r z2Z8X}PG^43h*WRjjX5a2*0aoAs7C=x-G2ZNJ`gvFa7;dSbO+d}2t(BBhxpUa`JEcQ z0Pv{z6AD>i!9p`>h+4Oc0-X%sm4@4>5Wrj!-ZSvhso&J#u@J7xM?IMUb)!-7=S)@J z!{?B2GD{6rug^z|?r_B20o6%y06|CijgE>dFK$UfId}kg$HP>yzsjwT4^DXBN#dyJ zoby|GuGbI+2RSTcVo~rLR}8SHre9lN|M>`JC`{AFeSMn5yi>4Rr1jlN z1~Uy>G~C6i8Oq>@pf2nN<9=PHMhPvLl(&>XpiFR1(O^V7I4gKg^nx(xmx3_V3-%^B zABX3=`l&WU7zn7zVRSU>mM&ys9;hPtsW1PGpg2@~35x4|z&DA7(Qs~@DpL~d4VB?` z08xse_dL0Hj<8fUCQDFcbOS)J9?!gnJQJKv!cOZtHq4KmgLi-oA)xOT?N`PBGg%GmTYdWE@aDTNTgB<&E^00r>=Y*-|DQ(?sZ zZ2%z67@*Rcl?A%}WWX4W{~Y5TlaZDj&kE`_b8x`!D5fWb*?C$4ba$~bMOi;10`_z^ z=6;>oV7R%ty0uy{TTwq!tv(JXx&sxlQ6QM_(yAZw)GR{=rTK35-u|OyG<*hBov>TG z9n81_-Q?saS|G4Yxf3-=4C4*h5Mj)_s|-ZvKlT7S1f{o}r_#x6xf56|_`58Bf{Jnw zC!C8O?j0(PILB9Tya&$2XHj7SAVc=h?p(O7B9qrpkqv~QyaAJnW(l4L6IwAZXtdmY zjt4{?8R0Kgry6?r&nHJdlI&2Fur^tj#vrBBfg&5Qsh(1z4b2AE#pW5Dc|Pd=b20#I z-QV>81JiDS4!#Y17}!y4LzB66kWhC4N)dWPS@xTC6F}hj7kK(xl1bkJiH$aTnJfGl zDB=WHxMWPYYYBY67r3&gSElN7E;NR>_@=S|6dUBUjzjfJX&HeO>6RoW~Rl0)fBL`7idp?=`V6?#V)KF z()t)@EqJv7Kxowme?|~90+y__J861j;pJ)11g1T24Uvq@kOpQow~HyMOcU-aX|1ruc4P^9=;kKFZprLP|_rlD+@R??jO{K0XTqRzT&s!n-W1%%HW+a6flNx+m&(HxhXqyA8Ztj5p3H5x$j`Zw1w1Ue`oxJO0r3yPgIi??U(yCww$l052v^aG00 z`;AmW7pyF!rykZB1sYM40lxEZvI$*=UV>A|+N!-Of-Zaug1^TU8Z>Msi8wDrpoEIf zj_OGwvQ-`i&MToJG@ov7vt1$INR+)6Q4s^km>rqizBaf94iGKGf6iFCEXW`G)W+p1 zGAJ0xN&_&jVNL=#=Z|u;Ggk(8-0BA&mp?nXOLL!Xm>eB?0(yY$pBqL62NrGY;?{6w zb@ZWJZ7zH(1?py%1Hm}m)Sj7PL|}-2@}!xg2e^iRB#vuU6pWRYk=ipm_fGkvFLOO@ z(^8eTq3O{W(H)h&>p#Ay@Ca!?vcCH1E35Y$u~8BC2fgH50O^oD{8>_LzD2bCGzjr{ zk&ADs-jgQ2$-)pmZSrc0>pTCN<4QY0CHP%PsT=_1ZT`_=8rTmi594kot&u6dTw>vv zwZqp|C7<7a7_G=&WQCF|6R!d@sb3&1`6`ZL{-LEuHg z8$Td2Wig*lWEw}okK#LXMybLhJ;>+w`oqJ`UR?7&HU7=!s;2OA?LVn64hDp~S%vkJ zeWGQGUPQny%XVz|lxp}EWsbL{Ch*b-^s^p$A|b5ao9T~D!J&#^h{L9p)o_+ES5@D0 z`Ao#x&>a1roGdfkd8xc&%Q*m$CCA>G$^JWjY=AdTN`)NTt!*lu+{ z3sIPNP?eI%mXRm}FV3uQS88BRIJ@=uP#HW)*NA^F>-Z{$t;j0ctO32xk#%KEzWXL)YLvwejbsu<|~o#V-MW(KM0$Z&J|y1SNnCCFOXq`~x~==o6kSpq{n7(ZA8C-n zCW?KHO0QfWPlI~=ntnI(zSrpKPH6UR>jy`ZqzbLlyh+4|m53|d_W~^a$u9s+2hcQG zKd!$zhPRERg6>Icc*6EAH~fd8y~fucHeLa>HH8>JBC!JcPZ<_#xC`rS*4>eMahV1> z$V(|LoDAw@XLB{WC=m4Lpoc@`l8({t>hZN8bYt}C9X7Tdm>{8>gGo5s7PV+-TGEEI zo~EmVPo~&09fzN+)b_*MU33QA%v;N;xMj2>qg)D!noT^xP`kY>N(qAlx43t@v=Y)+ zjd2{YB<8r87UhdQi_!!zt$~laNAL=q=%yUn)YK;ga2x8T32nq=FncocOE+5)*-TB8 z-fn78JSOb)$h5L-8`)S{1^@w7q$hc08Adc4AEw96Ltq9dk`xfaFwq!1~tx7Ap;b&$W=9#yn`E)3DU}76LU4BR-Au+QDME?i&w8=0Qw<8#%A)T zo9S6WY{e2`J_}1+$wtO89$rfRrzGwOL-SSAuqr$p86T~>uBfz(!hS~wLbyK!(Sjj(*wf|>z z>c37xdib#*;6?f3RL%g`{f=n~6dNd}|Es+yY$~3`x@`CG$-Y3QfhrCR2=0OeFwa!Y z++*!JO+py^Yt$;BriN4iNBRFx1BkV24*oAM!2dgA&Hsjj`Tu?ZE?^m@v*F3HU%yyC zrrVTG=r{Q2MD_G+n3z}p*g0w3EfJ#t3<(P@WxPtI37PaUfT-E}#<)BQTUwfdG+fR_ zq3(SGNxuW{vt3#}nm}cBeVgX=hl;iHmS%eiU0rCKTQsr2Td|H4t+`)0jGvVjJ&OMw z+;{J!Tw8VG{fieb%ENft7T~H&2Lx~IJBk4lgr^t%T7#)$)dV1d%1D~!ze!_gXqg-P zwdpzL@9+PL<`MG`*tm~gf0*@^Q)e2$C^7$yDmBOuMV>hde6}0!ea@_7>W-*VO)fUt z3kRM6qPM~L7Y^YDEkVKGIiJdvaYdcx^e2kEiuHb!Ofd#iKX_2#d`p_lQ~FBZ+c$iB zdWys3m>?z)*D8LM!!CZ!Y8(xXW(TTVH3OMgm{x7=@{+RtvOW3ka`ztJV-AiPrkU!~ zBo5NYX-rsWR%x8b(==(inwJFy{iYXkGp6W>&3n?+Pln)&VWOo9`6*39i_+iXgS#HZ zmuyDp>(xEyv)_)*xg3gqdPF&zym#V*kLWOYaCrWpFtso24a%Dp2!!Ed1i;^qxX40Q zzC39dn6Z0=(3D|7m3bB8|3VNUeAMB&xfLD?T$lIA=tj6XY~Kry0A4Ee_+`HparPbq zKO5Cid>_(r$!0J0?CeZobo?m{sBk+OC7qU15=_gPOmFX!(}z2=n=FFC6Ubwu+%Z_R z7=V9F%J7}YJK(SiUh^U&6~Xs}X%(?k_z;UkNAx{)A`*j1Rao7(v+b_7UX z6!CE;u*III2YPzK`0NZT;^GPvI2E`kXY1nP$iAu^z32t<6o5w z58=m3efDw*`3{FsK$4zl(bLq5Q17B0pW$IhrGbu)@t9WMYuzIX>dGA%|EVxIuB@$X zQ!UkMQMCP=4XBp?;r|mI7mi+BtOewLR$E)2(WyC(b0H!yEWd<3A-Pxq?I8l|xzn9* zs~142{}zZJf&4AXUF2%~L&zvCH>CMh*tm3}498lRjIq<1@d5+e*TVg8LhFPZ=61{}ymB z9G_zM?C)EL@S+{t&Ly^eBs92rFc4k)=oayc!5M?QgP%1 zSir*QKPRgW8{he!(MPB#K|x`E!~{VXxwPOtfYS9+8dz!5CeB8c{xJ;-ZQ&{3QX1`i zK-Uap+d9DA`ESS@4r-mLKM{=PZOo||DB`IsU}8l<4dtIBci-EjeSdQ!QdyT9t04|B zkO0p9H^Tt<3>;la%+-yeg;QqLdRGP*;M><+=XOnmGo5DWb7VVXYzWzBXaEwm{zrEq z(H&xkhwqfFtnvx227>U>;Dk-FB_*wn*7C!}L8(4R#a`ini9qvDM6C(VxY8R5h zEq#zEJ_$PTWTc^in)`&&u=+DYqEMC@FYtj`W&d*}l$hXUnN$m9)`G(?+qRM-#15Sa z&9Pv7v=RHm1=OTfJ`J3gX@V~1$yt;3xQ-%xnsLj6e!G% zgWcJBbs8ZAjxFIGfsU}O488liOs+tU?$|BRP5Q7!54_Lcfkh|}t==-(e|kFKw$!0Z z?f|S9WB8vepAi&gLGx1kvi7kIWlCWVU`K%$Rr*=6gFA9*#}Hf#yQud-#x?T2&9Yfa z07ckG^oJ281Qj0(ckhDQsC085R{%YlVH04i|FR>rC#&n~2zi=^r5mFE1SJ0M!Ji+B zc9id?^>44h-$aoGB`k~?LZXe?LaRBfY{H2{Sh2ZXs~^Dhf@LbEBA)a`%i>0z}d__q~ zsr%(kwGtXWD658_-d4zSkncelbPOS-U@N)N-BZuR#D)NlOIcpZ#9zOZ^FI%;J*?dH z&mJXO=0sz<9&waD)b`ran?70tlV568cmYI4EKqa~lBM$27D!l>@MKO$4IDQ^XMb5!3?^gDK^@mA-;2mr%*aL6k)wS+grJyK*pRMA5< zp3B2RC5*X;=?JhpX2fp7Fl*cn==oX!cZBl)#ok+nRh_o&qcjL23#4;NBPHFqM7pIL z=@JlW$%S-xNJ$F<(nyOE(kVzwcO#ALo0(_kVdi~5{EuVrV}IHE(;N=JxYr%m?~3z0 zFEusV>gog!clP^m1``5CB|CBO*?bm<6kSupD{y^zxLow1G&TT>h&0&A)wKu6k8l}1 zoM+mqo%6m?&oPyc03rQQkmfdlJpyuN^j+?Ua-Ft?kx#UD_lrs7oY3s5Y&2V}_JCE) z%f-KMKZ9KFV$9)2=CK3sz_;pvYnUyk=%X8F25swg_izb)?GgFqQ3`u%U!br1{w_8) z)&Z3-Mb*QvyWD$S^6=rqUa#GTT~Y0(*VQ+GU&T6OL_Y~{0)o7J z+|;$Z_lh~n8de2G7zZNybfT&6=C8Vo#Sck+EuK-K%D@y8CM1HPQP!Oav3WGT@IOOB zD*K_zjQH58Zo>BtI=q0iPyW2* z>E-HU`xif*J%P$n0s!8+^di>*IVpO8E^Ut#++h3zP+VWHGl=TaMVCYjsjjN}HsdE@lvs!h1x|S_<|+t&mh-IFW4iVUEr1Dpkk8j7BYHWHvx|!NV+J5#RSXT;Ez%qU zxnPO{%lOE?0*))hbUTfQiX-~R>q zef7!+c(gu)kEq|Vm~*{LR5iG zdFP<7_@cvl@IBI0iWoS@6b+fVw2j%p`p^%`f?QM2ak@!Dv};UxQrL_5i;D}?jJ9Kt z@9Sp%$W4hrx~ggD^<53qNv`Q)W|wzHZCyATC@A%qCF%2y1)%!Ao3BmSTz!09$IZ*z z4Wz<;bF?Gefng%J&j%1K0Wk^=2bfmPiae45$eba?V8Y!%`}yh{9x*oTLL6I1aVz_v(-%r+ZM| zZEtV$+;?ewkm)3sw9|F!Jq*yoG$upubIPyV*}aWih?@W)rf&*~^y)_A4B>2<-N&jv zp9P{(to7hV3#=1y2?q#}B$w`S3knL#pO7HUru~H9$a?YEH&6kAouwO9rruP(fi^_s zEd>4w*+6oAW_by!R0R)@vip@cIhm)HR;bGc=zm+@Ln}V;)$MZE>}DJe80MsZtyJ z7T!(Ty8A>7V|nE$`L_|BXSfie04N(@av<`%wa27+{#4(f&-=@{ zXJhA{D*T0INl~0TkFy`2;^QnIerg+!hD$xcd7h_VIY5d_&gxnD?kDVaNp$}q;&2=- zY5qx8F7ha>#`nVu#!O7ZR*;C!USe5itCTvshkih&L z&?^QB9|5~j88OWp32{NH`e1DJb4K;o*Zug74(Oz1AH?&LM~g6Dl38f9skJB0wfFocBi_wG&h=$ z*lxS86mOB~H5P7*Aiw8QCYo1NB&#U$OU)g;q}PJ?-PA_1NhC)`=nb|c^1^OwGjW;1 zwj$ec)Db~gIYj4!$_ds*h*Go-f>7Iig8JrO!@Ld=NTYr9%9|KmlG&zoAyOiQtj1jN zD{?m{-x0V1>+nx5yC+p$E7hfM)@EWt7|ak>o;1yd3`ebgW!{;%8nFpm&1QL593@6` zs=oFz2HnKVMroxL<`(ej;h+;WQ&q#L#=29xoSdypin}|UK~r0WnxH*TMOE-Th5p^; z7rAW!R9U4F4QWL(k?~TMgvXqcBZdS8xbM7hpXXviT-^EiG(unm2CM<>Ug+2P1xpJGk}nqdymr025>Aygyug#IVC9Y_#$8c%uR?9{m@Hs zWBy)ie(I)jOBF4*&U=GR7~3k?Yy}T7YCd!!nRPzTL`0_dvNRW)Z}vr5@GHl{3jd5c zu!@ZV$^4R67k(3J=elAeK|H=PxW2%uZ#NENg zihf(cIk%~?b!6sb6OKhgU4FWj{c+Y(4bAx3$Vp_go5I?($XClv4e>?9!eMg} zOivso;{onn>kuhPKGn9~CxN4Yk2N2E?q471@SkgS3qZ zH6GQS=7g^7Nwh+?zO5AM^;qBiP>QEl71b>k(^_!X(1-a2^^r2Uuh|e|*`y>}Krr)n z-e7fG}#%v#ka389$xbLHow(Kl~(#8R_m zLAZ6>qxK?3c;a*e>tPXWn>ucd82Ns9giK2}DtCAXO1w4;5G!^OUyWfopmHhrxHyKaCuWyV*{ z*dO1r6+cZiUujEZ@LuXx_kBL|wFW+0&O_GOn=EAYv#cJt;&^`|sQ&~3Q1QYb)gF9} z#u^_?o)G1iub6z}@qM0#JfrS{%G<%Om{I-cgT8vr}`CwX`q9wya) zh+TdFcpVeB<7@DbT4v^{52MJ^rflgfzVAL@>T8T`x?QBTYisx5iUV*@0p;z-^CJ3L ziq_hE5Uz1 z1+ak1&x4c;_o3(74cw^+t-VDF`VAe5TSA4-PZT4abMbEYU~=HzzYF?Z2*DJ}QdJxn zVI>CESg7Y$$u#01W~&1B$=_KhZ%#0clT8%| zW-t*lgx35Zo7a;HcE;~6DI5t`C6d4*eMG{8{&tdc1!7%_S$Dl3Ya{I6d#`j%LP9F= z6%C`2GtGi?BcYGeM(BWN5P4|%HWJ~=6cOcF%~Z2V=j_u|3lwRI)1<&V5H|{!9_QYQ zFB+R?`FABJu~@omU?P7mvJaiKeJ z&zg-Z5Eo`%><6!C3ka3)-Su^wcNoh?KC~+nR?h<9g#U>>qR?&5xqh5f@XMSOs!Bll zO$orb9{hvRf(UidVUPSQLMv74IY0}`=M=_(c$v|{{##Ay1E{1sE{{xRPIT4T%~IfEu&p(~hCSLTZ*(lU+qtOfUH(&C zBJ$tx8a;H3*hH*`U)BhI2`j$R4_F9kVMuEAGf8;RRvvj5^#6S8s1Oz?lrxLHDu!?H zSOox&m2h5xdA1ijPSEx`O07K}P_&S4XU0~MVbP79HKlQ@F1B2$EQ%fbwf7NonFRri zcT%1Wf%3<*PtnMLLhf~YLOc;M&_+2*h&tyKJ6cr>5&W1Mt}W-xkLv`@JM<1)2Eh%? zh_|gCppwxJQ3?mlRn8=U67)x>?N|WKO3_uduX$+nGsJ(A6Xt7~@T!sqHhqL?ny!S9 z(py?=im-2|elXu2B<XeH6yl7B_#COD&m17TeKtsz#OsXD+qOu zs@ZPV=5{tK(;nf8N>gP;MfK-FtZ1>hB3gY18UUB(J{P&Y*F*tgt{UsETxi(x&yMvh zD)=U9FvZDd!tH=h>N52Uk^sXLjBqQBc|ZV_-fAKm5QTk#$$I~c7m>>yDZuNYj z{>33`$@)IDUPT(`mSOco!{~TgCfj6NHn$ZQuv1)y^zb4v!*1fy4--mRnh2vnTF2J8ii*q}^!eXRcnv+!o~@HJrU_^oNXUPW3nfhe3~bdd zK!0}_?>!*^HH8;26t2>jr2=RJSYDaT3QuTY+z-KFNSFp3J=Z=@LklVox|tOV*%&F9yn{Ql3zrRF+A37$ zl{*|njblg8Xx9PyR+s#(EFxgP#{NhTn9#l$<2!%55VkEdcI1>?DKcp5JY0On`D04T zm$91^fDl7AVNTR%K%2occ;zIv5DkKbOCA(9p`F*>&iSE8!(8)wQ6p}+WAV=VqYK>! zKR9qe9Z2rxOZN{LQ6UE88=R^62Ax;qEA_cPVr)auitQt33j>-j02qH17(s6Nx{|An zwfruh(4_l+<$pee71I*yb!t=ZNxp!MYuIWR#uFvU0`L`@35R3sJ8a@zx6ZWoMP4aT zrzheB2jf44)IXVeGaxB11uoseV4+&iRbcfKWM`;$Gt{t>_U7Z#wN zy9&k_)~;~Q%*^~oxZ_Nxw{ePxU-0U+i-LalW(nap^fr$QBt*Q(gBuhMfY{d{`b{X; z7JCo1Eib%@q9kIFuWJu4)c#&wQPSc%;A&YSIij7Z#rh_; zr}uuhBh&Y)0Uve!E7Avs8#xcCMn56=4DCiR|J+HEa5cp1N@oT$(+ zu$*JFf7>K|&nCmFwADN+^}N1s*FLlIM|kb@(Z=D*E^uMGA5Ycxq*}1YUQbnwc^*@t zH$4k|LRP80FEVOYZjH0aG`S+@V3XaCbykaen^~7r0XsZ zOpW!B<=0|*OSw&LwI2*7@~oU35>W{(H*+;l0!aiTgrO!eTXtVj9sL(xX!tcD1h)Y8yo3x^wvG~yA z-w4#gKpFdCsN9ktaum0f3~KaTiN4V>Ru4Cf_v9qmvkU?8Qpr|dxDWw;;yCogUS2!Q zPX930oe2u7_%Ud@4{F9Z$Szbo^#~Z||Exwc5T@l5jg{ zYfU|3Q{40rG7}H&#h2?H=p5TVKcM?a- zD{LHowBp>y)higydeu}>UaMOlNW;lb&SAr#^I@YGoW=29E?tXLV_kc}$?Y#km_L{r zI5+kFuzeHYSms{m)gT^P{<2*BxX>orL}w+rJ<_dI0cQ(RW?=ez=SXCvrahNrU$D%f z{S`n$8kouc0O+@mY5b_ieRl&r600}R}3pRTa=qY6fX7Td{3XT zUh$wvzmDKEkFmv}HNhP?h|rq&<>$zJKV5@G^}qfla8&lS0Q9I8_~=&coOyrOVZkT+ ze$@Zd0zChpzzO}ojN1Bt9_WOP4DB(Pwl@Agsz&Fy!Xw!E5@@8XZ;?M5r|^{iaAvhD zU}2ZT&7&F7U?D6@&75dUX0gjtHlB!2B&Vs_B2MkV#LAjza%~nPXgAqC+x)?>=EaUI z3DGa)!yhl7KZk{ehJt)AXOt?g_h_}*!^>p(5(Wr>R}MTvIN0dsooFmqP28DVAcKA| zu!;ldB(u3Iop4h2OOrUKDx7adQoRb8(Vf@!)#XBGB^Nt+vyU^USS){7RFC!4u81c;2GR05L#x+hbO}18r}=LG}Q2Dq{Cj`Wt`t;q8j_ z&Dp3*pvbr<0&y|2l1-?Qx7v|N6# zF(Sj_TUl57pJpRP3B44g_GGlAezb@0v)@u?Ju3;CMR zO%TkHo~wV{;Wi=1@C~4PNgEmfcbU54v2kgd5Ea!32EZ?)a%~6 zY{KYoHczdPnHw}@z&nSe@c2+YJnH*=qNOII{IiY+I9#k#PRY0f76D-z0F0oGSg zJBo}f6|eogzD~()LI%`2Rva(W??KDR$jKA8bsIXz!m4_UfrNoYAt7ac*s9uZAoaD( zb~~sAw8pQt$NAQ~RI66d?mb?FyWCq^0vQiKA<#~UfC9pa?A9>S+TgDMrj`&BM#Ksu zS$&YY`3JK_6y(A9xQ-&N+_Ijjs@na`x&xYUp!*$)KKhM2ioD-}J@u|?cO&kb@{28# zX{s4r;sQi@jQD3(7!ZZRmA1R-vO5~6IMJ2;f^v3^`;wqv(M!#N{ZM%X6#ZuisADR$ zNXSD^o?_u350))L*oK@CrMdBvW@n!;F|)@^P7YapdLj%VQ)*YUFl_rRy(BT)Ccdzhl!4r@c>`grK4=AQ@AlS!h4^QZ(0}C0qMP^o90R^dY_c->euPd=5c&1tK9cm(U*^> z?32K^?ndEb`G2Z&z=Pg6HnM;EiFDI&YWcq~3rVupi=74~jgJPbKnkEdZg!T9h1+E< zQtS;n!n^s7xsX+x&pD4~xV|r|sOl#=o#^gzYZYLia(4(u#|+I(GO*I7&YLw6T>3Y6 z^|Q!~U70ns(z9}iQi7y`_@CS_1p(i8WSdnZig7reKao{bRH%JJQNMxKUCXg@Y%w;a zb&{YRKsdVNS8Tp-pplaqLWRvZ+sKKi$MFky04?eLf$`hW`)v7-Zc{hNi6c~g(8uS6 zz*gDU-Xbeox4o0==mX9dII-t_q@Nkt*-0pReu!km?EFqSf(?r>>(1fem;{`+QDQ8_ zzDV#eCg*6tf`*72n|#h-r1-()mObNFnFn7HsJj=f;FWVxWF_XM9Wa`-DWcvdQljwC z7eD2D*$PL6GQ@tgkjfj@h31yysr*{!51tXaX$?MQBq@RO-*UU@V)zz2PA?$VoGAwx$d zL4AEWPr$I*FB@a_IOo!Ty~7aQ_Uj(o z^8<|B%E~x4aEMe-ExD~Fp*OlR+K2o=>}IX`VkZYk$E05UYJ3`o`XyvsW~Ddf>BpvH zQhlIxUu8K&?Hn=PvY~*f*&VpXl4xz{uJ?#QlnS-cjJxo~l6^`(K|?B+2)AqJb_xNv z4NINSrvKv+EyER6<|4+Qav}?)N(hS-nwF0qL~o5s%iJ;D94m1GaIGO^9ATJ(f`U0m z+I8wUOp6$Zcre}QShP(^WqO}maVfNOq`5H=eN5krCy3JGlnDu2D{1w{l%yWz5*8Q9 zdO#ZLZ{_;(^JN1Me>ATLWeG~R=h8{yGv|~{Ps%9ErR4}A1>VP=uE3T(WKpX9zO*>x1nx@nB~kjwz7-4&t#CiAH?Rs-IyyRt z+yh84M1fN1Rx1QjFZ=MEGXJSl?oyqZCJK{=gOog^x$2Y$>#B5Pw zzTRJAeo4ZZuXzj03s?UuTWUE(+GUL}4_5Jp+N*Rm-Ia3YRS&CqD05sc?l-qHhMs_N z9$K2DB`c0qBIaw4;=*!0thV^nU2&YCkl5LV4B^_{V&rf<@lYOr`HfJsu3@L)E&sYp zraP*lcGA$eO~*($%=8EfAz`q^N1>)YUP-loo37gag^e$%oexyWloEk87zhHpGk@fQib%om_6zVrv@NfK9InZeCHka*5iE%y02=^D= zprOz69o#PNWicpT9e)mi1?|^P{x4lsFYKr~ZK%G>*g(5-XbGPkEZ8r^$1J^d(}|$- z=pEHw$uyRO1Q&Pw=ci=Tnd4^K!=>40w12Li^0{~$FD!ra3JaUbc| z#&Np2>gRcdkuD2?4H->y3|fk;kbMD^*!0)_u!^rdW~J@a(QRQq<~``<^WN5G2^0Hf zak*h@Lg*fSY{lyd-}lMHZ2N^~%Nw5$sCpB_O~YOqEn&e;3n-z{TQAdJB6U5;KP{Zr zLXI)uL!qWqPjdi^xq*$;b#MF*O|)}*$$tATd3N^mN0vLCUFr+lwIM_uKgc%$`k$<49N}<-CEJ77yl|rd2(I1Scj-2!nYH>StSQ1OE&s zn2ZmP3OPMD=ZAp#6lOajabv?$qGW+bWh@E25TJaj)k7D=kbW(+>E z-Pz79ormtfIV43&;LfRdTXhz!mJTNo`L*$NE2_}T z+OEfYk=K5ncR5|7GpmEQ^G3olW*hsZH+zv2 z+gfPPR$8trmys*?uBzS9ZIp1M3`d5#`Q$YF_h4 z)~x0pd90gyQs>QgkRc5QGEu02K`W$(r2+N+7{w-X%J{6X^FGGol#>Q@AC34ZUdFo0 zRWQJ{ID2+MJzf8__NP$JQ81r>%_X}(E(Qu`J<>=73LE-+$2HBpZ0LpKv2F& zd}b?dB1o~r7XR8);cn{04<7mA)+5=0N)#2lLvzjkY{N0DBX(iU{-k&7Qz#*Jeek^i zVBNIA_WG3H%ae&TkF`Ne%00e39iCLW=9x3w4>#Dr#!fXk4N&yt%Hqv*T9x@NTvsWy zx_FX!n2IZa?f-P2>`vaz0xQmT>79D5dm`rr{;{sRYdhRgjW{Ss3$L9Q8`~4n!SNsk zw)AT?X!P|pTPGbeT|W|M;7e?|SZeIwJNAqcuBG={@n**^2L9jMvA{|oWLNg^gV|EF zRQ-F#2$5nC#VwK?{9sFIgZWFv+%b^gz(g|^6l&yPa2{^vH%p;Q+lu-D1e>)-3oHjD zUBBZFQj8-QXXUWC7?e~eu^g-hRInlZJ__}!KQEm{UWh-8yNbo+0fYqRMz- zR<>XE{vEibrFMrHl+$-@i&GI2oOXXQJ}rSB4{2zyB0KwSo9jFK-3+%_fm>5+QsyR{SCa1GcNfO4-QD&4C%}i<(#c>xFf7*&6 zVZw3nx(Po_vTu%F9o=&Fl73+k{XD49IyN)W+x+oE_LGS0s>^EZm1_Z)9mI&LjS{84 zYbu8&7M&{>F4Q+hp_18ZJ10ZsnW<7U`frZ*rAqMc-cywb$jn##kOk<8ZA-ek=a!p^ z_wM_QR$O(8l;(K(^4eO;kotX-E(C-N%3im@&6sxph)I;TCuzIQLSb1@4fMyuvC zU#!2IVf7m2cE_VAd&gvZDURt2>{IIB_UUYuER~5oRM|w8fWoECI|rr0S&rcui}`O2 zRkC-p84nKU2olV=xry_WJD*M?o`rRXEDqr43&zbFR=#O8z}ZjQa$uk=`w078181z! zgkEbkhfvQmQuqveE?o2ShPH>7MP5gpNkTtp@~GC$$z_4Rl|8S}f!fSX$*AV5k36{M zr73~U>Nj~&(RZOcOw3+hNFJ`n{r1RG4>N){wwN<0WT+?vu~A%~(=rTWnjUtzyyg0c zixl%&LS6?6BCR97gDOu8FXK+UoC=S{!$>;wzt(&H9SVgody-Iv<4Sj|0SxOOANt2g za2TfzKSbJm`bCroRB~VQXpV?8+v%`s2{@V75inKiw$^ zD@WL=CtJ1!HH57wh;f^(*a0=RDnj!iq|!M|SYRSx`I}8~QC|mJvD0ciFBgWmZ+~I0?;qf}Kmsg(# zALn{8%WA}?_gJ$zDf@#>^u{K$)$C=5SIz$K%|6zZPui86yoOZVR)wR{f1rf^?_Lpu; z-Z4(@`8EI_@_mS{q1nlOe^m#57h6J)DQIaDlL-x}OVJj5>*wEcj(cLZJDPP-qRYeN_=9umlW2rh(sCx4iXYhxezYbda>de}9t*97R zpfU19F8`T!%DA&1xIFh?t`&PeE{5D%Gb$5KolLbg$9irShli zGDN$L=*^8dY~R|O5%0>4aPbaVmYD4+&<}U~D5ct5p)JC{pRE7`{!I&f9dEqvKemf8 z1f%B--Is=9w;3A!1uGWHkTQ8KC=1>cxR~MJ7mE=|Pwj}lzMe@p@3uZp3yfFQEDRm6 zp(|;)=rtBpGTYZMOucyt`oCTxMugGg^pKyJGi;@izf^_=Vlg!1B7%~xuSkg$^AGPK z0Q_zHjTEl%`CxwAFG%xZ+8iv|O3WfD?qA-o=L4)Z?F-8^;gF4u;TB3B0yJ-t?f&hV z6&lI_ODPV;jJ2%;Nwk}B6eCih{DlR$^~1#oFqB008@j7)s0x*xT<#`IxEY`ug_ypI zdmz}*81n=;b(X4}ij%;Llk25!R!032#XP^N|9wndd1Oh3kd9oy$-}X>?lJ91NfUV2 zL*IY;I-U_DBXepysi6Q%1LVEucKh{O4HUC*v4)#EM+^QKM)6VpYwA3-?7 z*5CdyB`GhJR*F z4^o%QaB&bgB{slku&0HDlftb%%Oy#17Y7!9Lgi_dXAWox(#JFGBCLXB50P zikIN%6jnR`<5I8xd1;!*#p&F0=Jqb|A>JZ&T z^T|^`t9L%hIxfH74z`_u`I1{R!jw}C!LXHmDn|)?Ol@tc6o~F#26n+0~Wr`}nRtk;A6meO4+Aag7`>HGhRm z0|l@&sieKJ2@)TXANe;BqKyINSxG}8S5f~bojjsRTuC*4p?q%H)V{GcT{Xn&5} zX$)QED)-XX5S@-m9{Ixr~C3p$`HAzm7KAF0lqSGKbYt(B#o0z`yCBfza=- zkHO)CXuXz`uSiOl$~#-OB>(|JmR(NyX|2PZUW^jtG6=y!+@xjxSOgpR(k57h;NGn1 ziJ-v1_f58zqu7BpXNql$4LU#2;}F)DHm(o*a6=f_8iQKz}}^BkEV7Mpetz@>!Urtt8S9Z1+lG6Y1< z71sW+zw;NKr6>#GqM=rscGP30@I4EYCZV=$LHf2VFjmsr6Tl3||LXXWTUAT3_;3e8 zNYmmQT6>!K+7D*Rig0^$kl@2%M(>^PY3>n(nyD>MRU=?&9~{P>;u*pcTA2H;Q^0gl z+@1s?B<){g1*79araQB2@kx?aF%cjwOQigSS{#hQ8GHi%p4llRrsHZH^ldk!d17f( zdm8XN{xLNZ_!x7$tvNW&7mdWO26V;>43Nm>TH>0T<5ZtR9gI0kt@pbE<(8aQI03L> zYEH!4+btiK*3f?i=bW_HNN-nPxmFH=#Y$0MULUUT4NW75I?gbtZh-5_Z_RKe9mL@9 z=MXvr@F?0!+M+ZDBo=J!-U>7Qwu#9MXm`z)i>(w2GjZqU-1U__{1K<(mV|*qZS{Z{ z{*7@ReECHx!=t_h!rV4OYqu+I8a^!;ejzb59fk{6lq-}I$8>UevxV$hCq=^W9G6al z%B0<7dt_K*0t02as@t#S#j{}0im?#fTL(W7CaO0s*67yX^3$TX*!jx2Iud4WEfs}^ zh8D<#7pY>F@OYc((5;;1b1U44>($TA)%Xxtnzd2P@$tQs>UU}(197J+B^9rzzK^0T zWc4>lg-Y;)MR*;S}c|C_^Cz*IONE-JaHfkrx<;{u7w!|DuJ0UsmizN#=)CFwqau3Nucas;1@ zzdWc0CWsWJr@+Lt^Ku}p<7px*Jlt84P>vrj%!fQe+=|g?GA!?_mGFF-vKBoH0U;(9 zx1rEyC`3Ex&wY(b6Agr(Lj!|?)>G#$^K0&E>;rNvnh0owrKXv5l`dy@hxQp|L>$92 z{qz^*0{4~e!1vIEAfo+!cD85ckZdVxw$bO4)VnxR;m_S{>1L$q9bU6Iv?cOWtQ?OL zqfmc%_QzNgxZqop)nROndt#1WS<1oLLyV|MG>!v&bDmr!hAosxxTCWjze=jMN7(MC zgf;ZdK&0*MqrYUmKT9w$*dbHz79;$o^}UtTsC;jfJW8wgJv}+W=pb>qcPs_`h0vH=-P9tDgkkD)^zXl^&?QY?G`3m1GGlg8Bmox+G*H*`>f9o z6>F_#%8skE`JkKm2q@#LxVsCm>ehrC_*^-^29-_)Q7W$^+^YqmmUlZlb|AQR0_^L- zh4!%ZX~%&)h731qQRDN&%xifvKD%7zkBur4B5_Q`z)hJvmSHG|@jF;#@;1@updQNa ztiSYbqGyknqJFlpT_>8!w@o>%09VuljWkQC|0|&(3jnj=uAP9bQk&L)nb381~P#Og)>$W`y6BFavi~p3qPk z$sP3aUcV_3rEpmcfB4ueds7&?I_-Q+cqg}@AgHwE_iM*3UHc}p$fo@cGHg`JZTU>m z^cveKNx*34xdJ@&0w&dbNM;n>QPAVdR*c-Hru0)Z-hPwi?gVpN|LeM6W4i00uTepq zqF~oj=fcnGx1gtUH{))IECVFb|F9>i5*v)^@+J@+H4~LE0nppZ)VIJbeBe`o&kLt6VYZFM`ZsLsI*3d!NkK237hV`YB% z-v?VQyI3gq>^4SP~#U;HP$W&#~ z$FLAG{QPXqhWJ2Y-G@y#jjf^4r{A{dkW}^)H6($};>tC^p^j8CN(Y7O97z=L%X2y@J$gOoeL%N=C+e-|Sh4m~(AOZ1B;ch^gA3~ots6f?d~K_8fH#LA<6xnX*WxJ*bmRCm z`TL~)`%=k!YWv=&%ed@kG@=JmjZ0w>mk-(5Pe^6d)J}Vi9p4R0%{tY-3>z@egAZxN zH)d=p84(aAczsN4Ar_!h!nW@IPIc!QEn&`c7O__8AD6B^PD_%#&$-2(4h;=U_clx~ z<{*FATubgCd8@iYmw4e&VHpiq=$29%5@!hm>wZ{lj~s*t`p@=|Lj=iHlB#89IL3cA1&5I_RIazo4&#O6tKE9+^>Z6dCu5vr*=_MPR zy(fs53B)}^q|$6XI_esVjy4)m+~DQwko&wvM`~l*2EJ7e5Cn8Rs-eLc88WZrJf}A0-@bT zu4b3ku(c2*D_dJ0tl37$0QJw9yX=vb!dmn=!g~ljJUqDUfrmbaq!^w1@gz|?rw_bu z+76`TFAyuH^4as+FzD;+OG>8D8X({Kt~OM0U+G=OAjEcaH*4(qV^Dzp{pHZTX%zqc zO9gsn7e0$ug#sdy2gSu{2Fi(w8k;zSvFE)lmL7ppw4Z7Gn?($NXT9`CqoKi@AMMNu zd2c7TA0PS<^Rzo0<22}Qfp(lEC9|p~CA4|RSPA5$tjicdfnt^Y&$~QW!}pH9i=0fGj4_-hk?an>8k2Iv|3X9b`{E8m+Vg|?YHZ4`J^XPX%JL*3 zA;D>*uwWSUYq9*jLYwhN8-#_C7n2W3Y;e=*zHn-fPsoS;qmqkx zrqP>`G{1EIL3anc2cNruJE-cbsjn!d@c68s1U==($5wrW$KiQq|Adl*_VV+f9uZdS z*+FK#6kbRU2Bk>6tRF~Nj=1AWyM)GG=?#GPIrYnly1n?C^h`5sEd6mlW~H0fJe>2- zFc}g%!@I5DYHO#LOLNxEmPgKSE^aQZ-~BBXOG~(@OxrlX!4j=(xi;J1MdYR5H_SZl?WRxB

(xbhxkY`UlYa+OY2rhi;9Y} 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 literal 40787 zcmeFZXH-<%)-Ad!P-H1UQjtocl5-HmA_yoTk|YPoNRnLS0t7)aNX{Ujl2I}!2$GRt zAW6=WK?x%87JGl^T=%)({qx#=?X}n5{RI?j%`oPebB@t_uMu(Yt`aE`iU&I^0MNi~1zByZ$wn3-_PI{dnYyOV_@TSpwut+r2s$IY`Uu}8 zQ=?5|yo(&-@?aF=0%Lpt*ENbWre(0QF$>c{S|gQgFbcA^l|fF8YrIog{_5;HJ?Gxe zOZNj`mfy)TG}X~e^4Z>Byshc+cC)2#Tk7yzp{2RGxm@ZCfGQWNjU$rax+jN|;8Jws z!r+0Q2@oOCJOtq9_aIzx@ld$3V)ZWi?|-2&dWgT@LbKu##6?*y$o~Bt23JV}J`TQ* zQ3PM7>*);nuhxMFbbobnFDU9V8Y7etjj!?7a{%PM&|lr>wtNmi65<`C!!O2&!6QH>|J^24w=x9E#yXBg z{yj5rBCx*)`2WL+^bZR?T28a+EmF%U@^36DZ@hC!VirfIF&i8ByTHh`huwAX#-Xy7 zmez>he$2+`BB%>jcsrB->*MJ(x~X@BpC$VJU<@Xn++lBT}m-6m+3@VQ=;RQ z72fV=ZFk@1%wj9KU)C#$0b*%P{f04jG6K%_b5#8OTNna=@4k{38GL?S165#on6xo5 zUQazJcu0lDEC(=UaQ>crcWSurc{WEDD6znKwi_GBbK}MhNxW|1L21_WUlr%y{bCz_ zV2qp*q~<}aI)33)Wezcj8V!{+0n6#!E@|Eu#-UZE!I3)zx@I6Vxv|1nWHcU@5T6$uV1Yj zy-l!lcx$VxagB}FC4cXe@XhAsV zSoOEjPU(qqz6B?+o`>-`B=^5mOH&wr0*x zXO?!mn8kgPl9GD1nzo&!r85`$OwXz%bHt~-X8bkv_3gG!Xx<%#{ysZ=mvXZG&J=-< zPbxr9Pp>6I`SE%BMIcHT}Oo_~=t4bW_&4k9O-R(JNKZ-j) zsd|~3+;GVjpT^3cZO)vj-LEj=y~^5`%scrZ^48mc!={;}?ZESsWl0n7C8}$@yh%yi zy6Hl%SF(MJ_%q*J)dNi#JaD~^KIanJ_UiCaLA>IJnYaE;xg{2Ue&2qa6wJxrJg$3p z>gc8+BBG3gp@>E5fuWP>LmB=0M|sT$6ZS>2Qge?fRbk6eB+j-cfqid$FyKBlj~;q` zv?67_;+@I#@kg&--M4#GZsiUTI1opNYCf6Tj_JZs zK=wcbr_=V`qA_Ok-Kcu<dEc4vNq0}rbUq1@ z4T(#n?m}0~^Gc(VUN-Ew?00h4#QV8lORMzG0;ecz8je6hTD1s88 zPWA_H&bX_z*;f)quW{ZyzWu2_8#^Ddyx<(LpRruWfq;&+(nFMuAi;|G$f~u#vz0(q zi%Tzf4c=Vk2I%PN6SeM2-jdk~B1;vw%9thp-G1|T2%S+}FRWoX-F~qm@U+CpYsy1Y zQ!_!tOXi>|w#TkGORSK%4+jw-5|9=|4P@{&Z3ulT1YfMY zCC+S4d;Zh(+-kaG*cd-mFV1%6$EJtY4a&w2zUH0x&!dmj#HTD9`$dfP_<$fU&wjx! zHb(a)rJP)$|?LCKykJmR%$@_kgH&y}mClJJ8SktXje0)CblPv_4C z<;r%%jcWt4W{mzbtDH)(>(0~C3q85(Fo=sT89c}ip4rkPra1lsgRGOyTmn5TVxwvM ztycMyE!qx_B3O9c96oLrafx*H3)+epO^|L;87zLfeSTJv`{3?M5SlN%4VTP_S|x^&X*+LMx! z_HfGV62hoRF&jbQq^&Ud9a_S42n)e;^%X1CL&mUO^TjWlbu)ZzW�B?oE)7M+}5P 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 Date: Tue, 31 Oct 2017 11:54:27 -0400 Subject: [PATCH 20/25] 2nd cut violin jasmine tests --- test/jasmine/tests/violin_test.js | 120 ++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/test/jasmine/tests/violin_test.js b/test/jasmine/tests/violin_test.js index d9082607b58..f417072417a 100644 --- a/test/jasmine/tests/violin_test.js +++ b/test/jasmine/tests/violin_test.js @@ -4,6 +4,7 @@ var Plots = require('@src/plots/plots'); var Violin = require('@src/traces/violin'); +var d3 = require('d3'); var createGraphDiv = require('../assets/create_graph_div'); var destroyGraphDiv = require('../assets/destroy_graph_div'); var fail = require('../assets/fail_test'); @@ -187,6 +188,46 @@ describe('Test violin calc:', function() { expect(cd[0].span).toBeCloseToArray([0, 4.28], 'defaults to soft bound'); }); + it('should honor set bandwidth in span calculations', function() { + var y = [1, 1, 2, 2, 3]; + var bw = 0.1; + + _calc({ + y: y, + bandwidth: bw + }); + expect(cd[0].bandwidth).toBeCloseTo(0.1); + expect(cd[0].span).toBeCloseToArray([0.8, 3.2]); + + _calc({ + y: y, + bandwidth: bw, + spanmode: 'hard' + }); + expect(cd[0].span).toBeCloseToArray([1, 3]); + + _calc({ + y: y, + bandwidth: bw, + span: [0, 0] + }); + expect(cd[0].span).toBeCloseToArray([-1, 1], 'cleans up invalid range'); + + _calc({ + y: y, + bandwidth: bw, + span: [null, 5] + }); + expect(cd[0].span).toBeCloseToArray([0.8, 5], 'defaults to soft bound'); + + _calc({ + y: y, + bandwidth: bw, + span: [0, null] + }); + expect(cd[0].span).toBeCloseToArray([0, 3.2], 'defaults to soft bound'); + }); + it('should fill in scale-group stats', function() { _calc({ name: 'one', @@ -345,10 +386,89 @@ describe('Test violin hover:', function() { pos: [180, 240], nums: 'look:0.7', name: '' + }, { + desc: 'one-sided violin under hovermode closest', + // hoveron: 'kde+points' + // hovermode: 'closest' + // width: 400 + // height: 700 + mock: require('@mocks/violin_side-by-side.json'), + pos: [250, 300], + nums: '(x: 42.43046, kde: 0.083, Saturday)', + name: '' + }, { + desc: 'one-sided violin under hovermode y', + // hoveron: 'kde+points' + // width: 400 + // height: 700 + mock: require('@mocks/violin_side-by-side.json'), + patch: function(fig) { + fig.layout.hovermode = 'y'; + return fig; + }, + pos: [250, 300], + nums: 'x: 42.43046, kde: 0.083', + name: '', + axis: 'Saturday' }] .forEach(function(specs) { it('should generate correct hover labels ' + specs.desc, function(done) { run(specs).catch(fail).then(done); }); }); + + describe('KDE lines inside violin under *kde* hoveron flag', function() { + var fig; + + beforeEach(function() { + gd = createGraphDiv(); + + fig = Lib.extendDeep({}, require('@mocks/violin_old-faithful.json'), { + layout: {width: 500, height: 500} + }); + fig.data[0].points = false; + }); + + function assertViolinHoverLine(pos) { + var line = d3.select('.hoverlayer').selectAll('line'); + + expect(line.size()).toBe(1, 'only one violin line at a time'); + expect(line.attr('class').indexOf('violinline')).toBe(0, 'correct class name'); + expect([ + line.attr('x1'), line.attr('y1'), + line.attr('x2'), line.attr('y2') + ]).toBeCloseToArray(pos, 'line position'); + } + + it('should show in two-sided base case', function(done) { + Plotly.plot(gd, fig).then(function() { + mouseEvent('mousemove', 250, 250); + assertViolinHoverLine([299.35, 250, 200.65, 250]); + }) + .catch(fail) + .then(done); + }); + + it('should show in one-sided positive case', function(done) { + fig.data[0].side = 'positive'; + + Plotly.plot(gd, fig).then(function() { + mouseEvent('mousemove', 300, 250); + assertViolinHoverLine([299.35, 250, 250, 250]); + }) + .catch(fail) + .then(done); + }); + + it('should show in one-sided negative case', function(done) { + fig.data[0].side = 'negative'; + + Plotly.plot(gd, fig).then(function() { + mouseEvent('mousemove', 200, 250); + assertViolinHoverLine([200.65, 250, 250, 250]); + }) + .catch(fail) + .then(done); + }); + }); }); From 677aacce0923a19c8d182f50e085d133cdec9836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 1 Nov 2017 10:23:11 -0400 Subject: [PATCH 21/25] remove 'kernel' from violin attributes - as non-gaussian kernels may require us to make soft spanmode bounds kernel-dependent, which will require some trial-and-error - as most other libraries don't support non-guassian kernel, let's defer this. --- src/traces/violin/attributes.js | 10 ---------- src/traces/violin/defaults.js | 1 - src/traces/violin/helpers.js | 8 ++++---- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index 3df8ef13d85..291bde075c0 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -25,16 +25,6 @@ module.exports = { ].join(' ') }), - kernel: { - valType: 'enumerated', - values: ['gaussian', 'epanechnikov'], - dflt: 'gaussian', - role: 'info', - editType: 'calc', - description: [ - 'Determines which kernel is used to compute the kernel density estimation.' - ].join(' ') - }, bandwidth: { valType: 'number', min: 0, diff --git a/src/traces/violin/defaults.js b/src/traces/violin/defaults.js index 507ddbe97d1..6209ada8d98 100644 --- a/src/traces/violin/defaults.js +++ b/src/traces/violin/defaults.js @@ -25,7 +25,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout boxDefaults.handleSampleDefaults(traceIn, traceOut, coerce, layout); if(traceOut.visible === false) return; - coerce('kernel'); coerce('bandwidth'); coerce('scalegroup', traceOut.name); coerce('scalemode'); diff --git a/src/traces/violin/helpers.js b/src/traces/violin/helpers.js index f8ad343726f..6e191793049 100644 --- a/src/traces/violin/helpers.js +++ b/src/traces/violin/helpers.js @@ -10,18 +10,18 @@ var Lib = require('../../lib'); +// Maybe add kernels more down the road, +// but note that the default `spanmode: 'soft'` bounds might have +// to become kernel-dependent var kernels = { gaussian: function(v) { return (1 / Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * v * v); - }, - epanechnikov: function(v) { - return Math.abs(v) <= 1 ? 0.75 * (1 - v * v) : 0; } }; exports.makeKDE = function(calcItem, trace, vals) { var len = vals.length; - var kernel = kernels[trace.kernel]; + var kernel = kernels.gaussian; var bandwidth = calcItem.bandwidth; var factor = 1 / (len * bandwidth); From 0a32b98484b1e3c1aab76ac49047ba52775eefc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 1 Nov 2017 11:20:54 -0400 Subject: [PATCH 22/25] update box and meanline attribute syntax - use nested attribute style for box and meanline settings - update test and mocks --- src/traces/box/hover.js | 2 +- src/traces/box/plot.js | 2 +- src/traces/violin/attributes.js | 134 +++++++++++----------- src/traces/violin/defaults.js | 32 ++---- src/traces/violin/plot.js | 28 ++--- src/traces/violin/style.js | 14 ++- test/image/mocks/violin_non-linear.json | 4 +- test/image/mocks/violin_old-faithful.json | 2 +- test/image/mocks/violin_side-by-side.json | 80 +++++++++---- test/jasmine/tests/violin_test.js | 44 +++---- 10 files changed, 187 insertions(+), 155 deletions(-) diff --git a/src/traces/box/hover.js b/src/traces/box/hover.js index c396e3206eb..17cc4c1f84c 100644 --- a/src/traces/box/hover.js +++ b/src/traces/box/hover.js @@ -140,7 +140,7 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) { var attrs = ['med', 'min', 'q1', 'q3', 'max']; var prefixes = ['median', 'min', 'q1', 'q3', 'max']; - if(trace.boxmean || trace.showmeanline) { + if(trace.boxmean || (trace.meanline || {}).visible) { attrs.push('mean'); prefixes.push(trace.boxmean === 'sd' ? 'mean ± σ' : 'mean'); } diff --git a/src/traces/box/plot.js b/src/traces/box/plot.js index 8050953a13f..e36a863de95 100644 --- a/src/traces/box/plot.js +++ b/src/traces/box/plot.js @@ -160,7 +160,7 @@ function plotPoints(sel, axes, trace, t) { var bdPos = t.bdPos; var bPos = t.bPos; - // to support violin innerbox + // to support violin points var mode = trace.boxpoints || trace.points; // repeatable pseudorandom number generator diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index 291bde075c0..ed9bbb8243c 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -138,72 +138,78 @@ module.exports = { marker: boxAttrs.marker, text: boxAttrs.text, - showinnerbox: { - valType: 'boolean', - dflt: false, - role: 'info', - editType: 'plot', - description: [ - 'Determines if an miniature box plot is drawn inside the violins. ' - ].join(' ') - }, - innerboxwidth: { - valType: 'number', - min: 0, - max: 1, - dflt: 0.25, - role: 'info', - editType: 'plot', - description: [ - 'Sets the width of the inner box plots relative to', - 'the violins\' width.', - 'For example, with 1, the inner box plots are as wide as the violins.' - ].join(' ') - }, - innerboxlinecolor: { - valType: 'color', - role: 'style', - editType: 'style', - description: 'Sets the inner box plot bounding line color.' - }, - innerboxfillcolor: { - valType: 'color', - role: 'style', - editType: 'style', - description: 'Sets the inner box plot fill color.' - }, - innerboxlinewidth: { - valType: 'number', - min: 0, - role: 'style', - editType: 'style', - description: 'Sets the inner box plot bounding line width.' + box: { + visible: { + valType: 'boolean', + dflt: false, + role: 'info', + editType: 'plot', + description: [ + 'Determines if an miniature box plot is drawn inside the violins. ' + ].join(' ') + }, + width: { + valType: 'number', + min: 0, + max: 1, + dflt: 0.25, + role: 'info', + editType: 'plot', + description: [ + 'Sets the width of the inner box plots relative to', + 'the violins\' width.', + 'For example, with 1, the inner box plots are as wide as the violins.' + ].join(' ') + }, + fillcolor: { + valType: 'color', + role: 'style', + editType: 'style', + description: 'Sets the inner box plot fill color.' + }, + line: { + color: { + valType: 'color', + role: 'style', + editType: 'style', + description: 'Sets the inner box plot bounding line color.' + }, + width: { + valType: 'number', + min: 0, + role: 'style', + editType: 'style', + description: 'Sets the inner box plot bounding line width.' + } + } }, - showmeanline: { - valType: 'boolean', - dflt: false, - role: 'info', - editType: 'plot', - description: [ - 'Determines if a line corresponding to the sample\'s mean is shown', - 'inside the violins.', - 'If `showinnerbox` is turned on, the mean line is drawn inside the inner box.', - 'Otherwise, the mean line is drawn from one side of the violin to other.' - ].join(' ') - }, - meanlinecolor: { - valType: 'color', - role: 'style', - editType: 'style', - description: 'Sets the mean line color.' - }, - meanlinewidth: { - valType: 'number', - min: 0, - role: 'style', - editType: 'style', - description: 'Sets the mean line width.' + meanline: { + visible: { + valType: 'boolean', + dflt: false, + role: 'info', + editType: 'plot', + description: [ + 'Determines if a line corresponding to the sample\'s mean is shown', + 'inside the violins.', + 'If `box.visible` is turned on, the mean line is drawn inside the inner box.', + 'Otherwise, the mean line is drawn from one side of the violin to other.' + ].join(' ') + }, + color: { + valType: 'color', + role: 'style', + editType: 'style', + description: 'Sets the mean line color.' + }, + width: { + valType: 'number', + min: 0, + role: 'style', + editType: 'style', + description: 'Sets the mean line width.' + } }, side: { diff --git a/src/traces/violin/defaults.js b/src/traces/violin/defaults.js index 6209ada8d98..e47480c1b9b 100644 --- a/src/traces/violin/defaults.js +++ b/src/traces/violin/defaults.js @@ -41,25 +41,15 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout boxDefaults.handlePointsDefaults(traceIn, traceOut, coerce, {prefix: ''}); - var show; - - var innerBoxWidth = coerce2('innerboxwidth'); - var innerBoxFillColor = coerce2('innerboxfillcolor', fillColor); - var innerBoxLineColor = coerce2('innerboxlinecolor', lineColor); - var innerBoxLineWidth = coerce2('innerboxlinewidth', lineWidth); - show = coerce('showinnerbox', Boolean(innerBoxWidth || innerBoxFillColor || innerBoxLineColor || innerBoxLineWidth)); - if(!show) { - delete traceOut.innerboxwidth; - delete traceOut.innerboxfillcolor; - delete traceOut.innerboxlinecolor; - delete traceOut.innerboxlinewidth; - } - - var meanLineColor = coerce2('meanlinecolor', lineColor); - var meanLineWidth = coerce2('meanlinewidth', lineWidth); - show = coerce('showmeanline', Boolean(meanLineColor || meanLineWidth)); - if(!show) { - delete traceOut.meanlinecolor; - delete traceOut.meanlinewidth; - } + var boxWidth = coerce2('box.width'); + var boxFillColor = coerce2('box.fillcolor', fillColor); + var boxLineColor = coerce2('box.line.color', lineColor); + var boxLineWidth = coerce2('box.line.width', lineWidth); + var boxVisible = coerce('box.visible', Boolean(boxWidth || boxFillColor || boxLineColor || boxLineWidth)); + if(!boxVisible) delete traceOut.box; + + var meanLineColor = coerce2('meanline.color', lineColor); + var meanLineWidth = coerce2('meanline.width', lineWidth); + var meanLineVisible = coerce('meanline.visible', Boolean(meanLineColor || meanLineWidth)); + if(!meanLineVisible) delete traceOut.meanline; }; diff --git a/src/traces/violin/plot.js b/src/traces/violin/plot.js index 36333b28710..afec439dda0 100644 --- a/src/traces/violin/plot.js +++ b/src/traces/violin/plot.js @@ -60,6 +60,8 @@ module.exports = function plot(gd, plotinfo, cd) { var hasBothSides = trace.side === 'both'; var hasPositiveSide = hasBothSides || trace.side === 'positive'; var hasNegativeSide = hasBothSides || trace.side === 'negative'; + var hasBox = trace.box && trace.box.visible; + var hasMeanLine = trace.meanline && trace.meanline.visible; var groupStats = fullLayout._violinScaleGroupStats[trace.scalegroup]; sel.selectAll('path.violin') @@ -128,28 +130,28 @@ module.exports = function plot(gd, plotinfo, cd) { pathSel.attr('d', path); // save a few things used in getPositionOnKdePath, getKdeValue - // on hover and for showmeanline + // on hover and for meanline draw block below d.posCenterPx = posCenterPx; d.posDensityScale = scale * bdPos; d.path = pathSel.node(); d.pathLength = d.path.getTotalLength() / (hasBothSides ? 2 : 1); }); - if(trace.showinnerbox) { - var innerBoxWidth = trace.innerboxwidth; - var innerBoxLineWidth = trace.innerboxlinewidth; + if(hasBox) { + var boxWidth = trace.box.width; + var boxLineWidth = trace.box.line.width; var bdPosScaled; var bPosPxOffset; if(hasBothSides) { - bdPosScaled = bdPos * innerBoxWidth; + bdPosScaled = bdPos * boxWidth; bPosPxOffset = 0; } else if(hasPositiveSide) { - bdPosScaled = [0, bdPos * innerBoxWidth / 2]; - bPosPxOffset = -innerBoxLineWidth; + bdPosScaled = [0, bdPos * boxWidth / 2]; + bPosPxOffset = -boxLineWidth; } else { - bdPosScaled = [bdPos * innerBoxWidth / 2, 0]; - bPosPxOffset = innerBoxLineWidth; + bdPosScaled = [bdPos * boxWidth / 2, 0]; + bPosPxOffset = boxLineWidth; } // do not draw whiskers on inner boxes @@ -161,10 +163,8 @@ module.exports = function plot(gd, plotinfo, cd) { bPosPxOffset: bPosPxOffset }); - // if both showinnerbox and showmeanline are turned on, show mean - // line inside inner box - - if(trace.showmeanline) { + // if both box and meanline are visible, show mean line inside box + if(hasMeanLine) { boxPlot.plotBoxMean(sel, {pos: posAxis, val: valAxis}, trace, { bPos: bPos, bdPos: bdPosScaled, @@ -173,7 +173,7 @@ module.exports = function plot(gd, plotinfo, cd) { } } else { - if(trace.showmeanline) { + if(hasMeanLine) { sel.selectAll('path.mean') .data(Lib.identity) .enter().append('path') diff --git a/src/traces/violin/style.js b/src/traces/violin/style.js index 8a962794b83..a3f0c2d8db0 100644 --- a/src/traces/violin/style.js +++ b/src/traces/violin/style.js @@ -19,6 +19,10 @@ module.exports = function style(gd) { .each(function(d) { var trace = d[0].trace; var sel = d3.select(this); + var box = trace.box || {}; + var boxLine = box.line || {}; + var meanline = trace.meanline || {}; + var meanLineWidth = meanline.width; sel.selectAll('path.violin') .style('stroke-width', trace.line.width + 'px') @@ -26,20 +30,18 @@ module.exports = function style(gd) { .call(Color.fill, trace.fillcolor); sel.selectAll('path.box') - .style('stroke-width', trace.innerboxlinewidth + 'px') - .call(Color.stroke, trace.innerboxlinecolor) - .call(Color.fill, trace.innerboxfillcolor); + .style('stroke-width', boxLine.width + 'px') + .call(Color.stroke, boxLine.color) + .call(Color.fill, box.fillcolor); sel.selectAll('g.points path') .call(Drawing.pointStyle, trace, gd); - var meanLineWidth = trace.meanlinewidth; - sel.selectAll('path.mean') .style({ 'stroke-width': meanLineWidth + 'px', 'stroke-dasharray': (2 * meanLineWidth) + 'px,' + meanLineWidth + 'px' }) - .call(Color.stroke, trace.meanlinecolor); + .call(Color.stroke, meanline.color); }); }; diff --git a/test/image/mocks/violin_non-linear.json b/test/image/mocks/violin_non-linear.json index 0012201c0a9..e299a68dc83 100644 --- a/test/image/mocks/violin_non-linear.json +++ b/test/image/mocks/violin_non-linear.json @@ -13,7 +13,7 @@ "orientation": "h", "xcalendar": "discworld", "name": "discworld dates", - "showinnerbox": true, + "box": {"visible": true}, "xaxis": "x", "yaxis": "y" }, { @@ -29,7 +29,7 @@ ], "orientation": "h", "name": "categories", - "showinnerbox": true, + "box": {"visible": true}, "xaxis": "x2", "yaxis": "y2" diff --git a/test/image/mocks/violin_old-faithful.json b/test/image/mocks/violin_old-faithful.json index 690392489ba..9c7239b5a44 100644 --- a/test/image/mocks/violin_old-faithful.json +++ b/test/image/mocks/violin_old-faithful.json @@ -3,7 +3,7 @@ "type": "violin", "points": "all", "name": "Old Faithful", - "showmeanline": true, + "meanline": {"visible": true}, "y": [79, 54, 74, 62, 85, 55, 88, 85, 51, 85, 54, 84, 78, 47, 83, 52, 62, 84, 52, 79, 51, 47, 78, 69, 74, 83, 55, 76, 78, 79, 73, 77, 66, 80, 74, 52, 48, 80, 59, 90, 80, 58, 84, 58, 73, 83, 64, 53, 82, 59, 75, 90, 54, 80, 54, 83, 71, 64, 77, 81, 59, 84, 48, 82, 60, 92, 78, 78, 65, 73, 82, 56, 79, 71, 62, 76, 60, 78, 76, 83, 75, 82, 70, 65, 73, 88, 76, 80, 48, 86, 60, 90, 50, 78, 63, 72, 84, 75, 51, 82, 62, 88, 49, 83, 81, 47, 84, 52, 86, 81, 75, 59, 89, 79, 59, 81, 50, 85, 59, 87, 53, 69, 77, 56, 88, 81, 45, 82, 55, 90, 45, 83, 56, 89, 46, 82, 51, 86, 53, 79, 81, 60, 82, 77, 76, 59, 80, 49, 96, 53, 77, 77, 65, 81, 71, 70, 81, 93, 53, 89, 45, 86, 58, 78, 66, 76, 63, 88, 52, 93, 49, 57, 77, 68, 81, 81, 73, 50, 85, 74, 55, 77, 83, 83, 51, 78, 84, 46, 83, 55, 81, 57, 76, 84, 77, 81, 87, 77, 51, 78, 60, 82, 91, 53, 78, 46, 77, 84, 49, 83, 71, 80, 49, 75, 64, 76, 53, 94, 55, 76, 50, 82, 54, 75, 78, 79, 78, 78, 70, 79, 70, 54, 86, 50, 90, 54, 54, 77, 79, 64, 75, 47, 86, 63, 85, 82, 57, 82, 67, 74, 54, 83, 73, 73, 88, 80, 71, 83, 56, 79, 78, 84, 58, 83, 43, 60, 75, 81, 46, 90, 46, 74 ] }] } diff --git a/test/image/mocks/violin_side-by-side.json b/test/image/mocks/violin_side-by-side.json index 056861b03ea..140170adb0a 100644 --- a/test/image/mocks/violin_side-by-side.json +++ b/test/image/mocks/violin_side-by-side.json @@ -16,16 +16,20 @@ }, "data": [ { - "hoveron": "points+kde", "text": "sample length: 32", - "showmeanline": true, + "hoveron": "points+kde", + "meanline": { + "visible": true + }, "legendgroup": "F", "scalegroup": "F", "points": "all", "pointpos": 1, + "box": { + "visible": true + }, "jitter": 0, "scalemode": "count", - "showinnerbox": true, "marker": { "line": { "width": 2, @@ -81,16 +85,20 @@ "orientation": "h" }, { - "hoveron": "points+kde", "text": "sample length: 30", - "showmeanline": true, + "hoveron": "points+kde", + "meanline": { + "visible": true + }, "legendgroup": "M", "scalegroup": "M", "points": "all", "pointpos": -0.6, + "box": { + "visible": true + }, "jitter": 0, "scalemode": "count", - "showinnerbox": true, "marker": { "line": { "width": 2, @@ -144,16 +152,20 @@ "orientation": "h" }, { - "hoveron": "points+kde", "text": "sample length: 9", - "showmeanline": true, + "hoveron": "points+kde", + "meanline": { + "visible": true + }, "legendgroup": "F", "scalegroup": "F", "points": "all", "pointpos": 0.4, + "box": { + "visible": true + }, "jitter": 0, "scalemode": "count", - "showinnerbox": true, "marker": { "line": { "width": 2, @@ -186,16 +198,20 @@ "orientation": "h" }, { - "hoveron": "points+kde", "text": "sample length: 10", - "showmeanline": true, + "hoveron": "points+kde", + "meanline": { + "visible": true + }, "legendgroup": "M", "scalegroup": "M", "points": "all", "pointpos": -0.3, + "box": { + "visible": true + }, "jitter": 0, "scalemode": "count", - "showinnerbox": true, "marker": { "line": { "width": 2, @@ -229,16 +245,20 @@ "orientation": "h" }, { - "hoveron": "points+kde", "text": "sample length: 28", - "showmeanline": true, + "hoveron": "points+kde", + "meanline": { + "visible": true + }, "legendgroup": "F", "scalegroup": "F", "points": "all", "pointpos": 0.55, + "box": { + "visible": true + }, "jitter": 0, "scalemode": "count", - "showinnerbox": true, "marker": { "line": { "width": 2, @@ -290,16 +310,20 @@ "orientation": "h" }, { - "hoveron": "points+kde", "text": "sample length: 59", - "showmeanline": true, + "hoveron": "points+kde", + "meanline": { + "visible": true + }, "legendgroup": "M", "scalegroup": "M", "points": "all", "pointpos": -1.1, + "box": { + "visible": true + }, "jitter": 0, "scalemode": "count", - "showinnerbox": true, "marker": { "line": { "width": 2, @@ -382,16 +406,20 @@ "orientation": "h" }, { - "hoveron": "points+kde", "text": "sample length: 18", - "showmeanline": true, + "hoveron": "points+kde", + "meanline": { + "visible": true + }, "legendgroup": "F", "scalegroup": "F", "points": "all", "pointpos": 0.45, + "box": { + "visible": true + }, "jitter": 0, "scalemode": "count", - "showinnerbox": true, "marker": { "line": { "width": 2, @@ -433,16 +461,20 @@ "orientation": "h" }, { - "hoveron": "points+kde", "text": "sample length: 58", - "showmeanline": true, + "hoveron": "points+kde", + "meanline": { + "visible": true + }, "legendgroup": "M", "scalegroup": "M", "points": "all", "pointpos": -0.9, + "box": { + "visible": true + }, "jitter": 0, "scalemode": "count", - "showinnerbox": true, "marker": { "line": { "width": 2, diff --git a/test/jasmine/tests/violin_test.js b/test/jasmine/tests/violin_test.js index f417072417a..755d2b20e19 100644 --- a/test/jasmine/tests/violin_test.js +++ b/test/jasmine/tests/violin_test.js @@ -103,26 +103,28 @@ describe('Test violin defaults', function() { expect(traceOut.spanmode).toBe('soft'); }); - it('should default show* attributes when one of their corresponding style attributes is set & valid', function() { + it('should default *.visible attributes when one of their corresponding style attributes is set & valid', function() { _supply({ y: [1, 2, 1], - innerboxwidth: 0.1, - meanlinecolor: 'red' + box: { width: 0.1 }, + meanline: { color: 'red' } }); - expect(traceOut.showinnerbox).toBe(true); - expect(traceOut.showmeanline).toBe(true); + expect(traceOut.box.visible).toBe(true); + expect(traceOut.meanline.visible).toBe(true); _supply({ y: [1, 2, 1], - showinnerbox: false, - showmeanline: false, - innerboxwidth: 0.1, - meanlinecolor: 'red' + box: { + visible: false, + width: 0.1 + }, + meanline: { + visible: false, + color: 'red' + } }); - expect(traceOut.showinnerbox).toBe(false); - expect(traceOut.innerboxwidth).toBeUndefined(); - expect(traceOut.showmeanline).toBe(false); - expect(traceOut.meanlinecolor).toBeUndefined(); + expect(traceOut.box).toBeUndefined(); + expect(traceOut.meanline).toBeUndefined(); }); it('should use violin style settings to default inner style attribute', function() { @@ -130,14 +132,14 @@ describe('Test violin defaults', function() { y: [1, 2, 1], fillcolor: 'red', line: {color: 'blue', width: 10}, - showinnerbox: true, - showmeanline: true, + box: {visible: true}, + meanline: {visible: true} }); - expect(traceOut.innerboxfillcolor).toBe('red'); - expect(traceOut.innerboxlinecolor).toBe('blue'); - expect(traceOut.innerboxlinewidth).toBe(10); - expect(traceOut.meanlinecolor).toBe('blue'); - expect(traceOut.meanlinewidth).toBe(10); + expect(traceOut.box.fillcolor).toBe('red'); + expect(traceOut.box.line.color).toBe('blue'); + expect(traceOut.box.line.width).toBe(10); + expect(traceOut.meanline.color).toBe('blue'); + expect(traceOut.meanline.width).toBe(10); }); }); @@ -275,7 +277,7 @@ describe('Test violin hover:', function() { desc: 'with mean', patch: function(fig) { fig.data.forEach(function(trace) { - trace.showmeanline = true; + trace.meanline = {visible: true}; }); return fig; }, From 3c9e0a04e83af41189702debb6295cd9930fea8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 1 Nov 2017 12:08:22 -0400 Subject: [PATCH 23/25] add violin style mock - that :lock: custom bandwidth and some box style settings. --- test/image/baselines/violin_style.png | Bin 0 -> 34457 bytes test/image/mocks/violin_style.json | 507 ++++++++++++++++++++++++++ 2 files changed, 507 insertions(+) create mode 100644 test/image/baselines/violin_style.png create mode 100644 test/image/mocks/violin_style.json diff --git a/test/image/baselines/violin_style.png b/test/image/baselines/violin_style.png new file mode 100644 index 0000000000000000000000000000000000000000..60e47221c550d2bacde66a7cd77b87fb5aeca53e GIT binary patch literal 34457 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 literal 0 HcmV?d00001 diff --git a/test/image/mocks/violin_style.json b/test/image/mocks/violin_style.json new file mode 100644 index 00000000000..b7e5462be33 --- /dev/null +++ b/test/image/mocks/violin_style.json @@ -0,0 +1,507 @@ +{ + "layout": { + "annotations": [ + { + "yref": "paper", + "text": "Orbital Period Estimations", + "xref": "paper", + "showarrow": false, + "font": { + "size": 20 + } + } + ], + "paper_bgcolor": "#d3d3d3", + "yaxis": { + "showline": false, + "showticklabels": false, + "range": [ + -5, + 550 + ], + "zeroline": false, + "visible": false + }, + "showlegend": false, + "violingap": 0, + "xaxis": { + "side": "top" + }, + "plot_bgcolor": "#d3d3d3", + "margin": { + "l": 0, + "r": 0, + "b": 0, + "t": 20 + } + }, + "data": [ + { + "bandwidth": 5, + "points": false, + "y": [ + 269.3, + 874.7739999999999, + 763.0, + 326.03, + 516.22, + 185.84, + 798.5, + 993.3, + 452.8, + 883.0, + 335.1, + 479.1, + 4.230785, + 14.651, + 44.38, + 0.73654, + 261.2, + 4.215, + 38.021, + 123.01, + 116.6884, + 691.9, + 952.7, + 181.4, + 380.8, + 3.2357, + 417.9, + 594.9, + 428.5, + 903.3, + 136.75, + 530.32, + 277.02, + 187.83, + 39.845, + 3.3135, + 305.5, + 4.617033, + 241.25799999999998, + 655.6, + 714.3, + 3.48777, + 5.6, + 237.6, + 3.8728, + 125.94, + 268.94, + 137.48, + 379.63, + 621.99, + 578.2, + 392.6, + 3.698, + 15.76491, + 8.631, + 25.6, + 603.0, + 692.0, + 7.3709, + 2.64385, + 5.36874, + 12.9292, + 66.8, + 3.14942, + 598.3, + 7.2004, + 28.14, + 91.61, + 62.24, + 39.025999999999996, + 256.2, + 4.6938, + 3.6, + 35.37, + 61.1166, + 30.0881, + 1.9377799999999998, + 124.26, + 133.71, + 3.33714, + 2.64561, + 428.5, + 349.7, + 5.7727, + 13.505, + 431.8, + 533.0, + 3.4442, + 311.6, + 62.218, + 526.62, + 829.0, + 15.609000000000002, + 431.88, + 356.0, + 360.2, + 675.0, + 777.0, + 792.6, + 177.11, + 22.09, + 615.0, + 5.3978, + 227.0, + 30.052, + 192.9, + 5.75962, + 16.3567, + 49.747, + 122.72, + 602.0, + 989.2, + 170.455, + 711.0, + 37.91, + 262.709, + 471.6, + 14.182, + 53.832, + 19.382, + 931.0, + 75.523, + 17.24, + 990.0, + 465.1, + 359.9, + 21.21663, + 772.0, + 466.2, + 11.849, + 33.823, + 500.0, + 18.315, + 40.114000000000004, + 90.309, + 29.15, + 85.131, + 591.9, + 380.85, + 22.656, + 53.881, + 738.459, + 528.07, + 423.841, + 17.991, + 385.9, + 387.1, + 912.0, + 466.0, + 16.546, + 51.284, + 274.49, + 326.6, + 18.179000000000002, + 157.54, + 388.0, + 363.2, + 154.46, + 843.6, + 55.0, + 5.6363, + 14.025, + 33.941, + 14.3098, + 696.3, + 407.15, + 4.3123, + 9.6184, + 20.432000000000002, + 34.62, + 51.76, + 197.8, + 264.15, + 963.0, + 1.3283, + 18.357, + 25.648000000000003, + 327.8, + 36.96, + 472.0, + 5.8872, + 226.93, + 342.85, + 890.76, + 43.6, + 3.0239999999999996, + 4.0845, + 430.0, + 700.0, + 4.9437, + 14.07, + 95.415, + 118.96, + 303.0, + 201.83, + 607.06, + 2.817822, + 589.64, + 358.0, + 572.4, + 152.6, + 480.5, + 6.276, + 8.667, + 31.56, + 197.0, + 851.8, + 2.54858, + 188.9, + 379.1, + 51.645, + 346.6, + 3.51, + 418.2, + 3.971, + 5.7361, + 111.4357, + 184.02, + 441.47, + 220.078, + 705.0, + 2.985625, + 788.0, + 58.43, + 2.1375, + 3.4160000000000004, + 256.78, + 49.77, + 325.81, + 143.58, + 13.186, + 46.025, + 507.0, + 361.1, + 498.9, + 647.3, + 8.1256, + 103.49, + 9.494, + 436.9, + 439.3, + 17.054000000000002, + 868.0, + 157.57, + 383.7, + 70.46, + 20.8133, + 4.113775, + 127.58, + 520.0, + 122.1, + 778.1, + 6.495, + 47.84, + 5.8881, + 55.806000000000004, + 199.505, + 48.056000000000004, + 10.8985, + 443.4, + 395.8, + 68.27, + 7.8543, + 30.93, + 5.24, + 835.477, + 324.0, + 263.3, + 937.7, + 83.88799999999999, + 493.7, + 670.0, + 25.826999999999998, + 6.1335, + 63.33, + 344.95, + 559.4, + 4.1547, + 9.6737, + 948.12, + 454.2, + 923.8, + 10.7085, + 883.0, + 974.0, + 3.27, + 258.19, + 12.083, + 59.519, + 459.26, + 464.3, + 11.577, + 27.581999999999997, + 106.72, + 330.0, + 653.22, + 386.3, + 176.3, + 103.95, + 44.236000000000004, + 528.4, + 331.5, + 2.8758911, + 4.072, + 2.391, + 689.0, + 499.4, + 18.596, + 163.9, + 408.6, + 194.3, + 391.9, + 131.05, + 842.0, + 4.6455, + 359.5546, + 104.84, + 521.0, + 12.62, + 248.4, + 352.3, + 643.25, + 9.6386, + 310.55, + 8.428198, + 75.29, + 282.4, + 606.4, + 420.77, + 58.11289, + 6.403, + 225.62, + 538.0, + 323.6, + 297.3, + 406.6, + 110.9, + 71.484, + 14.475999999999999, + 3.0925, + 396.03, + 479.0, + 663.0, + 9.3743, + 962.0, + 956.0, + 634.23, + 6.837999999999999, + 986.0, + 3.097, + 456.46, + 14.275, + 2.21857578, + 17.1, + 24.348000000000003, + 74.72, + 525.8, + 351.5, + 18.201629999999998, + 613.8, + 825.0, + 255.87, + 34.873000000000005, + 279.8, + 610.0, + 161.97, + 123.0, + 875.5, + 3.52474859, + 442.1, + 354.8, + 2.245715, + 373.3, + 951.0, + 7.2825, + 10.866, + 191.99, + 3.93, + 567.0, + 118.45, + 7.126816000000001, + 225.7, + 3.8335, + 672.1, + 456.1, + 572.38, + 26.73, + 141.6, + 192.0, + 501.75, + 745.7, + 8.7836, + 3.3689999999999998, + 345.72, + 57.0, + 16.2, + 6.6738550000000005, + 147.73, + 952.0, + 41.397, + 8.1352, + 32.03, + 431.7, + 124.6, + 511.098, + 111.7, + 5.0505, + 311.288, + 123.0, + 982.0, + 580.0, + 820.3, + 789.0, + 677.8, + 6.957999999999999, + 5.118, + 121.71, + 4.4264, + 2.1451 + ], + "type": "violin", + "name": "Radial Velocity", + "span": [ + 0, + null + ], + "line": { + "color": "#67353E" + }, + "box": { + "fillcolor": "black", + "line": { + "color": "black" + }, + "width": 0.01 + } + }, + { + "bandwidth": 5, + "points": false, + "y": [ + 25.261999999999997, + 66.5419, + 98.2114, + 0.09070629 + ], + "type": "violin", + "name": "Pulsar Timing", + "span": [ + 0, + null + ], + "line": { + "color": "#34ABA2" + }, + "box": { + "fillcolor": "black", + "line": { + "color": "black" + }, + "width": 0.01 + } + } + ] +} From ea66dea36c2ed871a116d2e9ebf800668b81fee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 1 Nov 2017 12:33:39 -0400 Subject: [PATCH 24/25] add editType to new violin attr containers --- src/traces/violin/attributes.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index ed9bbb8243c..6f7540cf7a2 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -180,8 +180,10 @@ module.exports = { role: 'style', editType: 'style', description: 'Sets the inner box plot bounding line width.' - } - } + }, + editType: 'style' + }, + editType: 'plot' }, meanline: { @@ -209,7 +211,8 @@ module.exports = { role: 'style', editType: 'style', description: 'Sets the mean line width.' - } + }, + editType: 'plot' }, side: { From 789121ca9ef42d74f4d343254b59a52c4e6081a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 1 Nov 2017 13:24:19 -0400 Subject: [PATCH 25/25] update violin layout attr descriptions --- src/traces/violin/layout_attributes.js | 27 ++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/traces/violin/layout_attributes.js b/src/traces/violin/layout_attributes.js index 09c06616641..4b6fd09596e 100644 --- a/src/traces/violin/layout_attributes.js +++ b/src/traces/violin/layout_attributes.js @@ -9,10 +9,29 @@ 'use strict'; var boxLayoutAttrs = require('../box/layout_attributes'); +var extendFlat = require('../../lib').extendFlat; -// TODO update descriptions module.exports = { - violinmode: boxLayoutAttrs.boxmode, - violingap: boxLayoutAttrs.boxgap, - violingroupgap: boxLayoutAttrs.boxgroupgap + violinmode: extendFlat({}, boxLayoutAttrs.boxmode, { + description: [ + 'Determines how violins at the same location coordinate', + 'are displayed on the graph.', + 'If *group*, the violins are plotted next to one another', + 'centered around the shared location.', + 'If *overlay*, the violins are plotted over one another,', + 'you might need to set *opacity* to see them multiple violins.' + ].join(' ') + }), + violingap: extendFlat({}, boxLayoutAttrs.boxgap, { + description: [ + 'Sets the gap (in plot fraction) between violins of', + 'adjacent location coordinates.' + ].join(' ') + }), + violingroupgap: extendFlat({}, boxLayoutAttrs.boxgroupgap, { + description: [ + 'Sets the gap (in plot fraction) between violins of', + 'the same location coordinate.' + ].join(' ') + }) };