Skip to content

Commit 1e59d89

Browse files
committed
display period point in hover if the winning point located inside the period
1 parent 6c5a824 commit 1e59d89

File tree

2 files changed

+35
-21
lines changed

2 files changed

+35
-21
lines changed

Diff for: src/components/fx/hover.js

+24-19
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var Drawing = require('../drawing');
1414
var Color = require('../color');
1515
var dragElement = require('../dragelement');
1616
var Axes = require('../../plots/cartesian/axes');
17+
var alignPeriod = require('../../plots/cartesian/align_period');
1718
var Registry = require('../../registry');
1819

1920
var helpers = require('./helpers');
@@ -779,8 +780,9 @@ function createHoverText(hoverData, opts, gd) {
779780
var c0 = hoverData[0];
780781
var xa = c0.xa;
781782
var ya = c0.ya;
782-
var commonAttr = hovermode.charAt(0) === 'y' ? 'yLabel' : 'xLabel';
783-
var t0 = c0[commonAttr];
783+
var axLetter = hovermode.charAt(0);
784+
var v0 = c0[axLetter + 'LabelVal'];
785+
var t0 = c0[axLetter + 'Label'];
784786
var t00 = (String(t0) || '').split(' ')[0];
785787
var outerContainerBB = outerContainer.node().getBoundingClientRect();
786788
var outerTop = outerContainerBB.top;
@@ -978,23 +980,26 @@ function createHoverText(hoverData, opts, gd) {
978980

979981
function filterClosePoints(hoverData) {
980982
return hoverData.filter(function(d) {
981-
return (d.zLabelVal !== undefined) ||
982-
(d[commonAttr] || '').split(' ')[0] === t00;
983-
});
984-
}
985-
986-
function unifiedFilterClosePoints(hoverData) {
987-
var out = [];
988-
var seen = [];
989-
for(var i = 0; i < hoverData.length; i++) {
990-
var d = hoverData[i];
991-
var id = d.cd[0].trace.index;
992-
if(!seen[id]) {
993-
seen[id] = 1;
994-
out.push(d);
983+
if(d.zLabelVal !== undefined) return true;
984+
if((d[axLetter + 'Label'] || '').split(' ')[0] === t00) return true;
985+
if(d.trace[axLetter + 'period']) {
986+
var v = d[axLetter + 'LabelVal'];
987+
var ax = d[axLetter + 'a'];
988+
var trace = {};
989+
trace[axLetter + 'period'] = d.trace[axLetter + 'period'];
990+
trace[axLetter + 'period0'] = d.trace[axLetter + 'period0'];
991+
992+
trace[axLetter + 'periodalignment'] = 'start';
993+
994+
var start = alignPeriod(trace, ax, axLetter, [v])[0];
995+
trace[axLetter + 'periodalignment'] = 'end';
996+
var end = alignPeriod(trace, ax, axLetter, [v])[0];
997+
998+
if(v0 >= start && v0 <= end) return true;
995999
}
996-
}
997-
return out;
1000+
1001+
return false;
1002+
});
9981003
}
9991004

10001005
// Show a single hover label
@@ -1003,7 +1008,7 @@ function createHoverText(hoverData, opts, gd) {
10031008
container.selectAll('g.hovertext').remove();
10041009

10051010
// similarly to compare mode, we remove the "close but not quite together" points
1006-
if((t0 !== undefined) && (c0.distance <= opts.hoverdistance)) hoverData = unifiedFilterClosePoints(hoverData);
1011+
if((t0 !== undefined) && (c0.distance <= opts.hoverdistance)) hoverData = filterClosePoints(hoverData);
10071012

10081013
// Return early if nothing is hovered on
10091014
if(hoverData.length === 0) return;

Diff for: test/jasmine/tests/hover_label_test.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -4728,19 +4728,28 @@ describe('hovermode: (x|y)unified', function() {
47284728
.then(done, done.fail);
47294729
});
47304730

4731-
it('filtering logic for compare mode x', function(done) {
4731+
it('shares filtering logic with compare mode x', function(done) {
47324732
var mock = require('@mocks/27.json');
47334733
var mockCopy = Lib.extendDeep({}, mock);
47344734

47354735
Plotly.newPlot(gd, mockCopy)
47364736
.then(function(gd) {
47374737
_hover(gd, { xval: '2002' });
47384738
assertElementCount('g.hovertext', 2);
4739+
4740+
return Plotly.relayout(gd, 'hovermode', 'x unified');
4741+
})
4742+
.then(function() {
4743+
_hover(gd, { xval: '2002' });
4744+
assertLabel({title: '2002.042', items: [
4745+
'Market income : 0.5537845',
4746+
'Market incom... : 0.4420997'
4747+
]});
47394748
})
47404749
.then(done, done.fail);
47414750
});
47424751

4743-
it('x unified should include close points and filter multiple points from the same trace', function(done) {
4752+
it('case of scatter points on period bars', function(done) {
47444753
Plotly.newPlot(gd, {
47454754
data: [
47464755
{

0 commit comments

Comments
 (0)