@@ -40,15 +40,28 @@ module.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa,
40
40
var dv2 = leftGap - dv1 ;
41
41
var edge0 = binEdges [ 0 ] ;
42
42
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 ;
52
65
}
53
66
54
67
if ( pa . type === 'date' && digit > oneDay ) {
@@ -59,14 +72,14 @@ module.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa,
59
72
var dateStr = pa . c2d ( v , oneYear , calendar ) ;
60
73
var dashPos = dateStr . indexOf ( '-' , dashExclude ) ;
61
74
if ( dashPos > 0 ) dateStr = dateStr . substr ( 0 , dashPos ) ;
62
- var roundedV = pa . d2c ( dateStr , calendar ) ;
75
+ var roundedV = pa . d2c ( dateStr , 0 , calendar ) ;
63
76
64
77
if ( roundedV < v ) {
65
78
var nextV = tickIncrement ( roundedV , increment , false , calendar ) ;
66
79
if ( ( roundedV + nextV ) / 2 < v + leftGap ) roundedV = nextV ;
67
80
}
68
81
69
- if ( isRightEdge ) {
82
+ if ( isRightEdge && disambiguateEdges ) {
70
83
return tickIncrement ( roundedV , increment , true , calendar ) ;
71
84
}
72
85
@@ -83,7 +96,7 @@ module.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa,
83
96
}
84
97
// finally for the right edge back off one digit - but only if we can do that
85
98
// and not clip off any data that's potentially in the bin
86
- if ( isRightEdge ) {
99
+ if ( isRightEdge && disambiguateEdges ) {
87
100
roundedV -= digit ;
88
101
}
89
102
return roundedV ;
@@ -97,10 +110,7 @@ module.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa,
97
110
* 100 to round to hundreds. returns oneMonth or oneYear for month or year rounding,
98
111
* so that Math.min will work, rather than 'M1' and 'M12'
99
112
*/
100
- function biggestDigitChanged ( region , pa , calendar ) {
101
- var v1 = region [ 0 ] ;
102
- var v2 = region [ 1 ] ;
103
-
113
+ function biggestDigitChanged ( v1 , v2 , pa , calendar ) {
104
114
// are we crossing zero? can't say anything.
105
115
// in principle this doesn't apply to dates but turns out this doesn't matter.
106
116
if ( v1 * v2 <= 0 ) return Infinity ;
0 commit comments