Skip to content

Commit 7ae3b7c

Browse files
committed
bullet-proof barpolar hover
1 parent 6edd45e commit 7ae3b7c

File tree

5 files changed

+49
-48
lines changed

5 files changed

+49
-48
lines changed

src/traces/bar/hover.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var Registry = require('../../registry');
1414
var Color = require('../../components/color');
1515
var fillHoverText = require('../scatter/fill_hover_text');
1616

17-
module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
17+
function hoverPoints(pointData, xval, yval, hovermode) {
1818
var cd = pointData.cd;
1919
var trace = cd[0].trace;
2020
var t = cd[0].t;
@@ -117,12 +117,6 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
117117
// the closest data point
118118
var index = pointData.index;
119119
var di = cd[index];
120-
var mc = di.mcc || trace.marker.color;
121-
var mlc = di.mlcc || trace.marker.line.color;
122-
var mlw = di.mlw || trace.marker.line.width;
123-
124-
if(Color.opacity(mc)) pointData.color = mc;
125-
else if(Color.opacity(mlc) && mlw) pointData.color = mlc;
126120

127121
var size = (trace.base) ? di.b + di.s : di.s;
128122
pointData[sizeLetter + '0'] = pointData[sizeLetter + '1'] = sa.c2p(di[sizeLetter], true);
@@ -139,8 +133,23 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
139133
// in case of bars shifted within groups
140134
pointData[posLetter + 'Spike'] = pa.c2p(di.p, true);
141135

136+
pointData.color = getTraceColor(trace, di);
142137
fillHoverText(di, trace, pointData);
143138
Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, pointData);
144139

145140
return [pointData];
141+
}
142+
143+
function getTraceColor(trace, di) {
144+
var mc = di.mcc || trace.marker.color;
145+
var mlc = di.mlcc || trace.marker.line.color;
146+
var mlw = di.mlw || trace.marker.line.width;
147+
148+
if(Color.opacity(mc)) return mc;
149+
else if(Color.opacity(mlc) && mlw) return mlc;
150+
}
151+
152+
module.exports = {
153+
hoverPoints: hoverPoints,
154+
getTraceColor: getTraceColor
146155
};

src/traces/bar/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Bar.arraysToCalcdata = require('./arrays_to_calcdata');
2222
Bar.plot = require('./plot');
2323
Bar.style = require('./style').style;
2424
Bar.styleOnSelect = require('./style').styleOnSelect;
25-
Bar.hoverPoints = require('./hover');
25+
Bar.hoverPoints = require('./hover').hoverPoints;
2626
Bar.selectPoints = require('./select');
2727

2828
Bar.moduleType = 'trace';

src/traces/barpolar/hover.js

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,71 +8,63 @@
88

99
'use strict';
1010

11-
var barHover = require('../bar/hover');
12-
var makeHoverPointText = require('../scatterpolar/hover').makeHoverPointText;
13-
var Color = require('../../components/color')
1411
var Fx = require('../../components/fx');
1512
var Lib = require('../../lib');
13+
var getTraceColor = require('../bar/hover').getTraceColor;
14+
var makeHoverPointText = require('../scatterpolar/hover').makeHoverPointText;
1615
var isPtInsidePolygon = require('../../plots/polar/helpers').isPtInsidePolygon;
1716

18-
module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
17+
module.exports = function hoverPoints(pointData, xval, yval) {
1918
var cd = pointData.cd;
2019
var trace = cd[0].trace;
21-
var t = cd[0].t;
2220

2321
var subplot = pointData.subplot;
2422
var radialAxis = subplot.radialAxis;
2523
var angularAxis = subplot.angularAxis;
26-
var xa = subplot.xaxis;
27-
var ya = subplot.yaxis;
2824
var inboxFn = subplot.vangles ? isPtInsidePolygon : Lib.isPtInsideSector;
25+
var maxHoverDistance = pointData.maxHoverDistance;
26+
var period = angularAxis._period || 2 * Math.PI;
2927

28+
// polar.(x|y)axis.p2c doesn't get the reversed radial axis range case right
3029
if(radialAxis.range[0] > radialAxis.range[1]) {
31-
xval = -xval;
32-
yval = -yval;
30+
xval *= -1;
31+
yval *= -1;
3332
}
3433

3534
var rVal = Math.abs(radialAxis.g2p(Math.sqrt(xval * xval + yval * yval)));
3635
var thetaVal = Math.atan2(yval, xval);
3736

38-
// TODO add padding around sector to show labels,
39-
// when hovering "close to" them
4037
var distFn = function(di) {
41-
var rBnds = [di.s0, di.s1].map(radialAxis.c2p);
42-
var thetaBnds = [di.p0, di.p1].map(angularAxis.c2g).map(Lib.rad2deg);
43-
return inboxFn(rVal, thetaVal, rBnds, thetaBnds, subplot.vangles) ?
44-
1 :
45-
Infinity;
38+
if(inboxFn(rVal, thetaVal,
39+
[di.rp0, di.rp1],
40+
[di.thetag0, di.thetag1].map(Lib.rad2deg),
41+
subplot.vangles)
42+
) {
43+
return maxHoverDistance +
44+
// add a little to the pseudo-distance for wider bars, so that like scatter,
45+
// if you are over two overlapping bars, the narrower one wins.
46+
Math.min(1, Math.abs(di.thetag1 - di.thetag0) / period) - 1 +
47+
// add a gradient so hovering near the end of a
48+
// bar makes it a little closer match
49+
(di.rp1 - rVal) / (di.rp1 - di.rp0) - 1;
50+
} else {
51+
return Infinity;
52+
}
4653
};
4754

4855
Fx.getClosest(cd, distFn, pointData);
49-
50-
// skip the rest (for this trace) if we didn't find a close point
5156
if(pointData.index === false) return;
5257

5358
var index = pointData.index;
5459
var cdi = cd[index];
55-
var rg = radialAxis.c2g(cdi.s1);
56-
// TODO include offset here?
57-
var thetag = angularAxis.c2g(cdi.p);
58-
var xp = xa.c2p(rg * Math.cos(thetag));
59-
var yp = ya.c2p(rg * Math.sin(thetag));
6060

61-
// TODO use 'extents' like in Bar.hover?
62-
pointData.x0 = pointData.x1 = xp;
63-
pointData.y0 = pointData.y1 = yp;
61+
pointData.x0 = pointData.x1 = cdi.ct[0];
62+
pointData.y0 = pointData.y1 = cdi.ct[1];
6463

6564
var _cdi = Lib.extendFlat({}, cdi, {r: cdi.s, theta: cdi.p});
6665
pointData.extraText = makeHoverPointText(_cdi, trace, subplot);
67-
pointData.xLabelVal = undefined;
68-
pointData.yLabelVal = undefined;
69-
70-
// TODO DRY-up with Bar.hover
71-
var mc = cdi.mcc || trace.marker.color;
72-
var mlc = cdi.mlcc || trace.marker.line.color;
73-
var mlw = cdi.mlw || trace.marker.line.width;
74-
if(Color.opacity(mc)) pointData.color = mc;
75-
else if(Color.opacity(mlc) && mlw) pointData.color = mlc;
66+
pointData.color = getTraceColor(trace, cdi);
67+
pointData.xLabelVal = pointData.yLabelVal = undefined;
7668

7769
return [pointData];
7870
};

src/traces/barpolar/plot.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ module.exports = function plot(gd, subplot, cdbar) {
5555
var s0 = di.s0 = di.b;
5656
var s1 = di.s1 = s0 + di.s;
5757

58-
var rp0 = radialAxis.c2p(s0);
59-
var rp1 = radialAxis.c2p(s1);
60-
var thetag0 = angularAxis.c2g(p0);
61-
var thetag1 = angularAxis.c2g(p1);
58+
var rp0 = di.rp0 = radialAxis.c2p(s0);
59+
var rp1 = di.rp1 = radialAxis.c2p(s1);
60+
var thetag0 = di.thetag0 = angularAxis.c2g(p0);
61+
var thetag1 = di.thetag1 = angularAxis.c2g(p1);
6262

6363
var dPath;
6464

src/traces/histogram/hover.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
'use strict';
1111

12-
var barHover = require('../bar/hover');
12+
var barHover = require('../bar/hover').hoverPoints;
1313
var hoverLabelText = require('../../plots/cartesian/axes').hoverLabelText;
1414

1515
module.exports = function hoverPoints(pointData, xval, yval, hovermode) {

0 commit comments

Comments
 (0)