@@ -40,15 +40,28 @@ module.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa,
4040 var dv2 = leftGap - dv1 ;
4141 var edge0 = binEdges [ 0 ] ;
4242 var edge1 = binEdges [ 1 ] ;
43- var regions = [
44- [ edge0 + dv0 , edge0 + dv1 ] ,
45- [ edge0 + dv1 , edge0 + dv2 ] ,
46- [ edge1 + dv0 , edge1 + dv1 ] ,
47- [ edge1 + dv1 , edge1 + dv2 ]
48- ] ;
49- var digit = Infinity ;
50- for ( var i = 0 ; i < regions . length ; i ++ ) {
51- digit = Math . min ( digit , biggestDigitChanged ( regions [ i ] , pa , calendar ) ) ;
43+ var leftDigit = Math . min (
44+ biggestDigitChanged ( edge0 + dv1 , edge0 + dv2 , pa , calendar ) ,
45+ biggestDigitChanged ( edge1 + dv1 , edge1 + dv2 , pa , calendar )
46+ ) ;
47+ var rightDigit = Math . min (
48+ biggestDigitChanged ( edge0 + dv0 , edge0 + dv1 , pa , calendar ) ,
49+ biggestDigitChanged ( edge1 + dv0 , edge1 + dv1 , pa , calendar )
50+ ) ;
51+
52+ // normally we try to make the label for the right edge different from
53+ // the left edge label, so it's unambiguous which bin gets data on the edge.
54+ // but if this results in more than 3 extra digits (or for dates, more than
55+ // 2 fields ie hr&min or min&sec, which is 3600x), it'll be more clutter than
56+ // useful so keep the label cleaner instead
57+ var digit , disambiguateEdges ;
58+ if ( leftDigit > rightDigit && rightDigit < Math . abs ( edge1 - edge0 ) / 4000 ) {
59+ digit = leftDigit ;
60+ disambiguateEdges = false ;
61+ }
62+ else {
63+ digit = Math . min ( leftDigit , rightDigit ) ;
64+ disambiguateEdges = true ;
5265 }
5366
5467 if ( pa . type === 'date' && digit > oneDay ) {
@@ -59,14 +72,14 @@ module.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa,
5972 var dateStr = pa . c2d ( v , oneYear , calendar ) ;
6073 var dashPos = dateStr . indexOf ( '-' , dashExclude ) ;
6174 if ( dashPos > 0 ) dateStr = dateStr . substr ( 0 , dashPos ) ;
62- var roundedV = pa . d2c ( dateStr , calendar ) ;
75+ var roundedV = pa . d2c ( dateStr , 0 , calendar ) ;
6376
6477 if ( roundedV < v ) {
6578 var nextV = tickIncrement ( roundedV , increment , false , calendar ) ;
6679 if ( ( roundedV + nextV ) / 2 < v + leftGap ) roundedV = nextV ;
6780 }
6881
69- if ( isRightEdge ) {
82+ if ( isRightEdge && disambiguateEdges ) {
7083 return tickIncrement ( roundedV , increment , true , calendar ) ;
7184 }
7285
@@ -83,7 +96,7 @@ module.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa,
8396 }
8497 // finally for the right edge back off one digit - but only if we can do that
8598 // and not clip off any data that's potentially in the bin
86- if ( isRightEdge ) {
99+ if ( isRightEdge && disambiguateEdges ) {
87100 roundedV -= digit ;
88101 }
89102 return roundedV ;
@@ -97,10 +110,7 @@ module.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa,
97110 * 100 to round to hundreds. returns oneMonth or oneYear for month or year rounding,
98111 * so that Math.min will work, rather than 'M1' and 'M12'
99112 */
100- function biggestDigitChanged ( region , pa , calendar ) {
101- var v1 = region [ 0 ] ;
102- var v2 = region [ 1 ] ;
103-
113+ function biggestDigitChanged ( v1 , v2 , pa , calendar ) {
104114 // are we crossing zero? can't say anything.
105115 // in principle this doesn't apply to dates but turns out this doesn't matter.
106116 if ( v1 * v2 <= 0 ) return Infinity ;
0 commit comments