@@ -17,12 +17,29 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
17
17
var scatterPointData = scatterHover ( pointData , xval , yval , hovermode ) ;
18
18
if ( ! scatterPointData || scatterPointData [ 0 ] . index === false ) return ;
19
19
20
+ var newPointData = scatterPointData [ 0 ] ;
21
+
20
22
// if hovering on a fill, we don't show any point data so the label is
21
- // unchanged from what scatter gives us.
22
- if ( scatterPointData [ 0 ] . index === undefined ) return scatterPointData ;
23
+ // unchanged from what scatter gives us - except that it needs to
24
+ // be constrained to the trianglular plot area, not just the rectangular
25
+ // area defined by the synthetic x and y axes
26
+ // TODO: in some cases the vertical middle of the shape is not within
27
+ // the triangular viewport at all, so the label can become disconnected
28
+ // from the shape entirely. But calculating what portion of the shape
29
+ // is actually visible, as constrained by the diagonal axis lines, is not
30
+ // so easy and anyway we lost the information we would have needed to do
31
+ // this inside scatterHover.
32
+ if ( newPointData . index === undefined ) {
33
+ var yFracUp = 1 - ( newPointData . y0 / pointData . ya . _length ) ,
34
+ xLen = pointData . xa . _length ,
35
+ xMin = xLen * yFracUp / 2 ,
36
+ xMax = xLen - xMin ;
37
+ newPointData . x0 = Math . max ( Math . min ( newPointData . x0 , xMax ) , xMin ) ;
38
+ newPointData . x1 = Math . max ( Math . min ( newPointData . x1 , xMax ) , xMin ) ;
39
+ return scatterPointData ;
40
+ }
23
41
24
- var newPointData = scatterPointData [ 0 ] ,
25
- cdi = newPointData . cd [ newPointData . index ] ;
42
+ var cdi = newPointData . cd [ newPointData . index ] ;
26
43
27
44
newPointData . a = cdi . a ;
28
45
newPointData . b = cdi . b ;
0 commit comments