Skip to content

Commit ad0e08f

Browse files
committed
limit the number of extra digits we give to histogram bin labels
1 parent b91d1cb commit ad0e08f

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

src/traces/histogram/bin_label_vals.js

+26-16
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)