Skip to content

Commit 82cbe93

Browse files
committed
fix #3840 - use half delta for one-side violin hover label placement
1 parent 875aba8 commit 82cbe93

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

src/traces/box/hover.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) {
5858
hoverPseudoDistance, spikePseudoDistance;
5959

6060
var boxDelta = t.bdPos;
61+
var boxDeltaPos, boxDeltaNeg;
6162
var posAcceptance = t.wHover;
6263
var shiftPos = function(di) { return di.pos + t.bPos - pVal; };
6364

@@ -67,18 +68,23 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) {
6768
var pos = shiftPos(di);
6869
return Fx.inbox(pos, pos + posAcceptance, hoverPseudoDistance);
6970
};
71+
boxDeltaPos = boxDelta;
72+
boxDeltaNeg = 0;
7073
}
7174
if(trace.side === 'negative') {
7275
dPos = function(di) {
7376
var pos = shiftPos(di);
7477
return Fx.inbox(pos - posAcceptance, pos, hoverPseudoDistance);
7578
};
79+
boxDeltaPos = 0;
80+
boxDeltaNeg = boxDelta;
7681
}
7782
} else {
7883
dPos = function(di) {
7984
var pos = shiftPos(di);
8085
return Fx.inbox(pos - posAcceptance, pos + posAcceptance, hoverPseudoDistance);
8186
};
87+
boxDeltaPos = boxDeltaNeg = boxDelta;
8288
}
8389

8490
var dVal;
@@ -134,8 +140,8 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) {
134140
else if(Color.opacity(mc) && trace.boxpoints) pointData.color = mc;
135141
else pointData.color = trace.fillcolor;
136142

137-
pointData[pLetter + '0'] = pAxis.c2p(di.pos + t.bPos - boxDelta, true);
138-
pointData[pLetter + '1'] = pAxis.c2p(di.pos + t.bPos + boxDelta, true);
143+
pointData[pLetter + '0'] = pAxis.c2p(di.pos + t.bPos - boxDeltaNeg, true);
144+
pointData[pLetter + '1'] = pAxis.c2p(di.pos + t.bPos + boxDeltaPos, true);
139145

140146
pointData[pLetter + 'LabelVal'] = di.pos;
141147

test/jasmine/tests/violin_test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,14 @@ describe('Test violin hover:', function() {
347347
return Plotly.plot(gd, fig).then(function() {
348348
mouseEvent('mousemove', pos[0], pos[1]);
349349
assertHoverLabelContent(specs);
350+
351+
if(specs.hoverLabelPos) {
352+
d3.selectAll('g.hovertext').each(function(_, i) {
353+
var bbox = this.getBoundingClientRect();
354+
expect([bbox.bottom, bbox.top])
355+
.toBeWithinArray(specs.hoverLabelPos[i], 10, 'bottom--top hover label ' + i);
356+
});
357+
}
350358
});
351359
}
352360

@@ -512,6 +520,24 @@ describe('Test violin hover:', function() {
512520
nums: 'x: 42.43046, kde: 0.083',
513521
name: '',
514522
axis: 'Saturday'
523+
}, {
524+
desc: 'one-sided violin under hovermode y (ridgeplot case)',
525+
mock: require('@mocks/violin_ridgeplot.json'),
526+
patch: function(fig) {
527+
fig.data.forEach(function(t) { t.hoveron = 'violins'; });
528+
fig.layout.hovermode = 'y';
529+
return fig;
530+
},
531+
nums: [
532+
'max: 50.81', 'median: 18.24', 'min: 3.07',
533+
'q1: 13.8575', 'q3: 24.975', 'upper fence: 39.42'
534+
],
535+
name: ['', '', '', '', '', ''],
536+
axis: 'Sat',
537+
hoverLabelPos: [
538+
[364, 270], [339, 270], [352, 270],
539+
[346, 270], [349, 270], [387, 270]
540+
]
515541
}, {
516542
desc: 'single horizontal violin',
517543
mock: require('@mocks/violin_non-linear.json'),

0 commit comments

Comments
 (0)