@@ -24,16 +24,19 @@ var getBinSpanLabelRound = require('./bin_label_vals');
2424function calc ( gd , trace ) {
2525 var pos = [ ] ;
2626 var size = [ ] ;
27- var pa = Axes . getFromId ( gd , trace . orientation === 'h' ? trace . yaxis : trace . xaxis ) ;
28- var mainData = trace . orientation === 'h' ? 'y' : 'x' ;
27+ var isHorizontal = trace . orientation === 'h' ;
28+ var pa = Axes . getFromId ( gd , isHorizontal ? trace . yaxis : trace . xaxis ) ;
29+ var mainData = isHorizontal ? 'y' : 'x' ;
2930 var counterData = { x : 'y' , y : 'x' } [ mainData ] ;
3031 var calendar = trace [ mainData + 'calendar' ] ;
32+ var hasPeriod = trace [ mainData + 'periodalignment' ] ;
3133 var cumulativeSpec = trace . cumulative ;
3234 var i ;
3335
3436 var binsAndPos = calcAllAutoBins ( gd , trace , pa , mainData ) ;
3537 var binSpec = binsAndPos [ 0 ] ;
3638 var pos0 = binsAndPos [ 1 ] ;
39+ var origPos = binsAndPos [ 2 ] ;
3740
3841 var nonuniformBins = typeof binSpec . size === 'string' ;
3942 var binEdges = [ ] ;
@@ -186,13 +189,21 @@ function calc(gd, trace) {
186189 b : 0
187190 } ;
188191
192+ if ( hasPeriod ) {
193+ cdi . orig_p = origPos [ i ] ;
194+ }
195+
189196 // setup hover and event data fields,
190197 // N.B. pts and "hover" positions ph0/ph1 don't seem to make much sense
191198 // for cumulative distributions
192199 if ( ! cumulativeSpec . enabled ) {
193200 cdi . pts = inputPoints [ i ] ;
194201 if ( uniqueValsPerBin ) {
195- cdi . ph0 = cdi . ph1 = ( inputPoints [ i ] . length ) ? pos0 [ inputPoints [ i ] [ 0 ] ] : pos [ i ] ;
202+ if ( hasPeriod ) {
203+ cdi . ph0 = cdi . ph1 = cdi . pts . length ? origPos [ cdi . pts [ 0 ] ] : cdi . orig_p ;
204+ } else {
205+ cdi . ph0 = cdi . ph1 = cdi . pts . length ? pos0 [ cdi . pts [ 0 ] ] : cdi . p ;
206+ }
196207 } else {
197208 // Defer evaluation of ph(0|1) in crossTraceCalc
198209 trace . _computePh = true ;
@@ -234,7 +245,7 @@ function calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) {
234245 var groupName = trace [ '_' + mainData + 'bingroup' ] ;
235246 var binOpts = fullLayout . _histogramBinOpts [ groupName ] ;
236247 var isOverlay = fullLayout . barmode === 'overlay' ;
237- var i , traces , tracei , calendar , pos0 , autoVals , cumulativeSpec ;
248+ var i , traces , tracei , calendar , pos0 , origPos , autoVals , cumulativeSpec ;
238249
239250 var r2c = function ( v ) { return pa . r2c ( v , 0 , calendar ) ; } ;
240251 var c2r = function ( v ) { return pa . c2r ( v , 0 , calendar ) ; } ;
@@ -273,8 +284,8 @@ function calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) {
273284
274285 if ( tracei . visible ) {
275286 var mainDatai = binOpts . dirs [ i ] ;
276- pos0 = pa . makeCalcdata ( tracei , mainDatai ) ;
277- pos0 = alignPeriod ( trace , pa , mainData , pos0 ) ;
287+ origPos = pa . makeCalcdata ( tracei , mainDatai ) ;
288+ pos0 = alignPeriod ( trace , pa , mainData , origPos ) ;
278289 tracei [ '_' + mainDatai + 'pos0' ] = pos0 ;
279290
280291 allPos = Lib . concat ( allPos , pos0 ) ;
@@ -323,7 +334,7 @@ function calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) {
323334 // Several single-valued histograms! Stop infinite recursion,
324335 // just return an extra flag that tells handleSingleValueOverlays
325336 // to sort out this trace too
326- if ( _overlayEdgeCase ) return [ newBinSpec , pos0 , true ] ;
337+ if ( _overlayEdgeCase ) return [ newBinSpec , pos0 , origPos , true ] ;
327338
328339 newBinSpec = handleSingleValueOverlays ( gd , trace , pa , mainData , binAttr ) ;
329340 }
@@ -410,7 +421,7 @@ function calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) {
410421 delete trace [ autoBinAttr ] ;
411422 }
412423
413- return [ traceBinOptsCalc , pos0 ] ;
424+ return [ traceBinOptsCalc , pos0 , origPos , false ] ;
414425}
415426
416427/*
@@ -444,7 +455,7 @@ function handleSingleValueOverlays(gd, trace, pa, mainData, binAttr) {
444455 } else {
445456 var resulti = calcAllAutoBins ( gd , tracei , pa , mainData , true ) ;
446457 var binSpeci = resulti [ 0 ] ;
447- var isSingleValued = resulti [ 2 ] ;
458+ var isSingleValued = resulti [ 3 ] ;
448459
449460 // so we can use this result when we get to tracei in the normal
450461 // course of events, mark it as done and put _pos0 back
0 commit comments