@@ -17,12 +17,29 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
1717 var scatterPointData = scatterHover ( pointData , xval , yval , hovermode ) ;
1818 if ( ! scatterPointData || scatterPointData [ 0 ] . index === false ) return ;
1919
20+ var newPointData = scatterPointData [ 0 ] ;
21+
2022 // 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+ }
2341
24- var newPointData = scatterPointData [ 0 ] ,
25- cdi = newPointData . cd [ newPointData . index ] ;
42+ var cdi = newPointData . cd [ newPointData . index ] ;
2643
2744 newPointData . a = cdi . a ;
2845 newPointData . b = cdi . b ;
0 commit comments