From 59cd2574ea681f3773afd000a48cefffd6c81b7b Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Wed, 11 May 2022 14:30:11 -0400 Subject: [PATCH 1/3] implement quartilemethod options in violin trace --- src/traces/violin/attributes.js | 2 + src/traces/violin/defaults.js | 2 + test/image/baselines/box_quartile-methods.png | Bin 20542 -> 30159 bytes test/image/mocks/box_quartile-methods.json | 34 +++++++- test/jasmine/tests/violin_test.js | 77 ++++++++++++++++++ test/plot-schema.json | 11 +++ 6 files changed, 125 insertions(+), 1 deletion(-) diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index 9bccbd2ffec..9cb1d9f33af 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -154,6 +154,8 @@ module.exports = { hovertext: boxAttrs.hovertext, hovertemplate: boxAttrs.hovertemplate, + quartilemethod: boxAttrs.quartilemethod, + box: { visible: { valType: 'boolean', diff --git a/src/traces/violin/defaults.js b/src/traces/violin/defaults.js index 662460663fd..1224fdd9bc8 100644 --- a/src/traces/violin/defaults.js +++ b/src/traces/violin/defaults.js @@ -48,4 +48,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout var meanLineWidth = coerce2('meanline.width', lineWidth); var meanLineVisible = coerce('meanline.visible', Boolean(meanLineColor || meanLineWidth)); if(!meanLineVisible) traceOut.meanline = {visible: false}; + + coerce('quartilemethod'); }; diff --git a/test/image/baselines/box_quartile-methods.png b/test/image/baselines/box_quartile-methods.png index 7651df491fc391e8a7a4288b74937a12d65ec6ed..80bdd6d814a6446c37161fd04994a97ab6129184 100644 GIT binary patch literal 30159 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%0DaO0@SNr#Crh<3K2nljeEi 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 diff --git a/test/image/mocks/box_quartile-methods.json b/test/image/mocks/box_quartile-methods.json index d2c2b2fefaa..871fb6c7550 100644 --- a/test/image/mocks/box_quartile-methods.json +++ b/test/image/mocks/box_quartile-methods.json @@ -13,5 +13,37 @@ "y": [1, 2, 3, 4, 5], "name": "inclusive", "quartilemethod": "inclusive" - }] + }, + + { + "type": "violin", + "yaxis": "y2", + "y": [1, 2, 3, 4, 5], + "name": "linear" + }, { + "type": "violin", + "yaxis": "y2", + "y": [1, 2, 3, 4, 5], + "name": "exclusive", + "quartilemethod": "exclusive" + }, { + "type": "violin", + "yaxis": "y2", + "y": [1, 2, 3, 4, 5], + "name": "inclusive", + "quartilemethod": "inclusive" + }], + "layout": { + "yaxis": { + "domain": [0, 0.45] + }, + "yaxis2": { + "domain": [0.55, 1] + }, + "width": 500, + "height": 500, + "title": { + "text": "box and violin quartile methods" + } + } } diff --git a/test/jasmine/tests/violin_test.js b/test/jasmine/tests/violin_test.js index 4b111891583..9487a94605e 100644 --- a/test/jasmine/tests/violin_test.js +++ b/test/jasmine/tests/violin_test.js @@ -223,8 +223,85 @@ describe('Test violin calc:', function() { Plots.doCalcdata(gd); cd = gd.calcdata[0]; fullLayout = gd._fullLayout; + return cd; } + it('should compute q1/q3 depending on *quartilemethod*', function() { + // samples from https://en.wikipedia.org/wiki/Quartile + var specs = { + // N is odd and is spanned by (4n+3) + odd: { + sample: [6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49], + methods: { + linear: {q1: 20.25, q3: 42.75}, + exclusive: {q1: 15, q3: 43}, + inclusive: {q1: 25.5, q3: 42.5} + } + }, + // N is odd and is spanned by (4n+1) + odd2: { + sample: [6, 15, 36, 39, 40, 42, 43, 47, 49], + methods: { + linear: {q1: 30.75, q3: 44}, + exclusive: {q1: 25.5, q3: 45}, + inclusive: {q1: 36, q3: 43} + } + }, + // N is even + even: { + sample: [7, 15, 36, 39, 40, 41], + methods: { + linear: {q1: 15, q3: 40}, + exclusive: {q1: 15, q3: 40}, + inclusive: {q1: 15, q3: 40} + } + }, + // samples from http://jse.amstat.org/v14n3/langford.html + s4: { + sample: [1, 2, 3, 4], + methods: { + linear: {q1: 1.5, q3: 3.5}, + exclusive: {q1: 1.5, q3: 3.5}, + inclusive: {q1: 1.5, q3: 3.5} + } + }, + s5: { + sample: [1, 2, 3, 4, 5], + methods: { + linear: {q1: 1.75, q3: 4.25}, + exclusive: {q1: 1.5, q3: 4.5}, + inclusive: {q1: 2, q3: 4} + } + }, + s6: { + sample: [1, 2, 3, 4, 5, 6], + methods: { + linear: {q1: 2, q3: 5}, + exclusive: {q1: 2, q3: 5}, + inclusive: {q1: 2, q3: 5} + } + }, + s7: { + sample: [1, 2, 3, 4, 5, 6, 7], + methods: { + linear: {q1: 2.25, q3: 5.75}, + exclusive: {q1: 2, q3: 6}, + inclusive: {q1: 2.5, q3: 5.5} + } + } + }; + + for(var name in specs) { + var spec = specs[name]; + + for(var m in spec.methods) { + var cd = _calc({y: spec.sample, quartilemethod: m}); + expect(cd[0].q1).toBe(spec.methods[m].q1, ['q1', m, name].join(' | ')); + expect(cd[0].q3).toBe(spec.methods[m].q3, ['q3', m, name].join(' | ')); + } + } + }); + it('should compute bandwidth and span based on the sample and *spanmode*', function() { var y = [1, 1, 2, 2, 3]; diff --git a/test/plot-schema.json b/test/plot-schema.json index 9cf4bbd1950..024a40b2b04 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -69495,6 +69495,17 @@ false ] }, + "quartilemethod": { + "description": "Sets the method used to compute the sample's Q1 and Q3 quartiles. The *linear* method uses the 25th percentile for Q1 and 75th percentile for Q3 as computed using method #10 (listed on http://www.amstat.org/publications/jse/v14n3/langford.html). The *exclusive* method uses the median to divide the ordered dataset into two halves if the sample is odd, it does not include the median in either half - Q1 is then the median of the lower half and Q3 the median of the upper half. The *inclusive* method also uses the median to divide the ordered dataset into two halves but if the sample is odd, it includes the median in both halves - Q1 is then the median of the lower half and Q3 the median of the upper half.", + "dflt": "linear", + "editType": "calc", + "valType": "enumerated", + "values": [ + "linear", + "exclusive", + "inclusive" + ] + }, "scalegroup": { "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. If a violin's `width` is undefined, `scalegroup` will default to the trace's name. In this case, violins with the same names will be linked together", "dflt": "", From 9548c3ff73752d8558d5a24be74e2a357d9fdbe1 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Wed, 11 May 2022 15:26:05 -0400 Subject: [PATCH 2/3] draft log for PR 6187 --- draftlogs/6187_add.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 draftlogs/6187_add.md diff --git a/draftlogs/6187_add.md b/draftlogs/6187_add.md new file mode 100644 index 00000000000..b5bd84735f6 --- /dev/null +++ b/draftlogs/6187_add.md @@ -0,0 +1,2 @@ + - Add "exclusive" and "inclusive" quartile-computing algorithm to `violin` traces + via `quartilemethod` attribute [[#6187](https://github.com/plotly/plotly.js/pull/6187)] From 24ef4fd9c0ed3ec0dcf0c80d921796bb1fbd00ba Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Wed, 11 May 2022 16:32:21 -0400 Subject: [PATCH 3/3] update langford link --- src/lib/stats.js | 2 +- src/traces/box/attributes.js | 2 +- test/plot-schema.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/stats.js b/src/lib/stats.js index 0ccde97802c..2f2350dfcf9 100644 --- a/src/lib/stats.js +++ b/src/lib/stats.js @@ -77,7 +77,7 @@ exports.median = function(data) { /** * interp() computes a percentile (quantile) for a given distribution. * We interpolate the distribution (to compute quantiles, we follow method #10 here: - * http://www.amstat.org/publications/jse/v14n3/langford.html). + * http://jse.amstat.org/v14n3/langford.html). * Typically the index or rank (n * arr.length) may be non-integer. * For reference: ends are clipped to the extreme values in the array; * For box plots: index you get is half a point too high (see diff --git a/src/traces/box/attributes.js b/src/traces/box/attributes.js index 2c0d615a4d5..0d540a40a74 100644 --- a/src/traces/box/attributes.js +++ b/src/traces/box/attributes.js @@ -275,7 +275,7 @@ module.exports = { 'Sets the method used to compute the sample\'s Q1 and Q3 quartiles.', 'The *linear* method uses the 25th percentile for Q1 and 75th percentile for Q3', - 'as computed using method #10 (listed on http://www.amstat.org/publications/jse/v14n3/langford.html).', + 'as computed using method #10 (listed on http://jse.amstat.org/v14n3/langford.html).', 'The *exclusive* method uses the median to divide the ordered dataset into two halves', 'if the sample is odd, it does not include the median in either half -', diff --git a/test/plot-schema.json b/test/plot-schema.json index 024a40b2b04..9e4f43e9025 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -15905,7 +15905,7 @@ "valType": "string" }, "quartilemethod": { - "description": "Sets the method used to compute the sample's Q1 and Q3 quartiles. The *linear* method uses the 25th percentile for Q1 and 75th percentile for Q3 as computed using method #10 (listed on http://www.amstat.org/publications/jse/v14n3/langford.html). The *exclusive* method uses the median to divide the ordered dataset into two halves if the sample is odd, it does not include the median in either half - Q1 is then the median of the lower half and Q3 the median of the upper half. The *inclusive* method also uses the median to divide the ordered dataset into two halves but if the sample is odd, it includes the median in both halves - Q1 is then the median of the lower half and Q3 the median of the upper half.", + "description": "Sets the method used to compute the sample's Q1 and Q3 quartiles. The *linear* method uses the 25th percentile for Q1 and 75th percentile for Q3 as computed using method #10 (listed on http://jse.amstat.org/v14n3/langford.html). The *exclusive* method uses the median to divide the ordered dataset into two halves if the sample is odd, it does not include the median in either half - Q1 is then the median of the lower half and Q3 the median of the upper half. The *inclusive* method also uses the median to divide the ordered dataset into two halves but if the sample is odd, it includes the median in both halves - Q1 is then the median of the lower half and Q3 the median of the upper half.", "dflt": "linear", "editType": "calc", "valType": "enumerated", @@ -69496,7 +69496,7 @@ ] }, "quartilemethod": { - "description": "Sets the method used to compute the sample's Q1 and Q3 quartiles. The *linear* method uses the 25th percentile for Q1 and 75th percentile for Q3 as computed using method #10 (listed on http://www.amstat.org/publications/jse/v14n3/langford.html). The *exclusive* method uses the median to divide the ordered dataset into two halves if the sample is odd, it does not include the median in either half - Q1 is then the median of the lower half and Q3 the median of the upper half. The *inclusive* method also uses the median to divide the ordered dataset into two halves but if the sample is odd, it includes the median in both halves - Q1 is then the median of the lower half and Q3 the median of the upper half.", + "description": "Sets the method used to compute the sample's Q1 and Q3 quartiles. The *linear* method uses the 25th percentile for Q1 and 75th percentile for Q3 as computed using method #10 (listed on http://jse.amstat.org/v14n3/langford.html). The *exclusive* method uses the median to divide the ordered dataset into two halves if the sample is odd, it does not include the median in either half - Q1 is then the median of the lower half and Q3 the median of the upper half. The *inclusive* method also uses the median to divide the ordered dataset into two halves but if the sample is odd, it includes the median in both halves - Q1 is then the median of the lower half and Q3 the median of the upper half.", "dflt": "linear", "editType": "calc", "valType": "enumerated",