Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions draftlogs/6832_fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Correctly calls the bars around the boxplot whiskers, not fences.
27 changes: 14 additions & 13 deletions src/traces/box/calc.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,15 @@ module.exports = function calc(gd, trace) {
if(cdi.med !== BADNUM && cdi.q1 !== BADNUM && cdi.q3 !== BADNUM &&
cdi.med >= cdi.q1 && cdi.q3 >= cdi.med
) {
var lf = d2c('lowerfence');
var lf = d2c('lowerwhisker');
cdi.lf = (lf !== BADNUM && lf <= cdi.q1) ?
lf :
computeLowerFence(cdi, boxVals, N);
computeLowerWhisker(cdi, boxVals, N);

var uf = d2c('upperfence');
var uf = d2c('upperwhisker');
cdi.uf = (uf !== BADNUM && uf >= cdi.q3) ?
uf :
computeUpperFence(cdi, boxVals, N);
computeUpperWhisker(cdi, boxVals, N);

var mean = d2c('mean');
cdi.mean = (mean !== BADNUM) ?
Expand Down Expand Up @@ -245,9 +245,9 @@ module.exports = function calc(gd, trace) {
cdi.q3 = Lib.interp(boxVals, 0.75);
}

// lower and upper fences
cdi.lf = computeLowerFence(cdi, boxVals, N);
cdi.uf = computeUpperFence(cdi, boxVals, N);
// lower and upper whiskers
cdi.lf = computeLowerWhisker(cdi, boxVals, N);
cdi.uf = computeUpperWhisker(cdi, boxVals, N);

// lower and upper outliers bounds
cdi.lo = computeLowerOutlierBound(cdi);
Expand Down Expand Up @@ -289,8 +289,8 @@ module.exports = function calc(gd, trace) {
mean: (trace.boxmean === 'sd') || (trace.sizemode === 'sd') ?
_(gd, 'mean ± σ:').replace('σ', trace.sdmultiple === 1 ? 'σ' : (trace.sdmultiple + 'σ')) : // displaying mean +- Nσ whilst supporting translations
_(gd, 'mean:'),
lf: _(gd, 'lower fence:'),
uf: _(gd, 'upper fence:')
lf: _(gd, 'lower whisker:'),
uf: _(gd, 'upper whisker:')
}
};

Expand Down Expand Up @@ -403,8 +403,9 @@ function sortByVal(a, b) { return a.v - b.v; }

function extractVal(o) { return o.v; }

// last point below 1.5 * IQR
function computeLowerFence(cdi, boxVals, N) {
// Whisker: smallest point within 1.5 * IQR range around median
// Fence := q ± 1.5IQR
function computeLowerWhisker(cdi, boxVals, N) {
if(N === 0) return cdi.q1;
return Math.min(
cdi.q1,
Expand All @@ -415,8 +416,8 @@ function computeLowerFence(cdi, boxVals, N) {
);
}

// last point above 1.5 * IQR
function computeUpperFence(cdi, boxVals, N) {
// Whisker: largest point within 1.5 * IQR range around median
function computeUpperWhisker(cdi, boxVals, N) {
if(N === 0) return cdi.q3;
return Math.max(
cdi.q3,
Expand Down