Skip to content

Commit 361f61b

Browse files
committed
Choose angle with smallest absolute cosine instead of largest absolute degree value
1 parent 4b23f99 commit 361f61b

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

src/plots/cartesian/axes.js

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3480,7 +3480,9 @@ axes.drawLabels = function(gd, ax, opts) {
34803480
var labelFns = opts.labelFns;
34813481
var tickAngle = opts.secondary ? 0 : ax.tickangle;
34823482

3483-
var autoTickAngles = ax.autotickangles;
3483+
var autoTickAnglesRadians = ax.autotickangles ?
3484+
ax.autotickangles.map(function(degrees) { return degrees * Math.PI / 180; }) :
3485+
undefined;
34843486
var prevAngle = (ax._prevTickAngles || {})[cls];
34853487

34863488
var tickLabels = opts.layer.selectAll('g.' + cls)
@@ -3784,30 +3786,30 @@ axes.drawLabels = function(gd, ax, opts) {
37843786
(ax.tickwidth || 0) + 2 * TEXTPAD;
37853787

37863788
// old behavior for backwards-compatibility
3787-
var angle = ((tickSpacing < maxFontSize * 2.5) || ax.type === 'multicategory' || ax._name === 'realaxis') ? 90 : 30;
3789+
var angleRadians = (((tickSpacing < maxFontSize * 2.5) || ax.type === 'multicategory' || ax._name === 'realaxis') ? 90 : 30) * Math.PI / 180;
37883790
// autotickangles
3789-
if(autoTickAngles !== undefined) {
3791+
if(autoTickAnglesRadians !== undefined) {
37903792
var adjacent = tickSpacing;
37913793
var opposite = maxFontSize * 1.25 * maxLines;
37923794
var hypotenuse = Math.sqrt(Math.pow(adjacent, 2) + Math.pow(opposite, 2));
3793-
// sin(angle) = opposite / hypotenuse
3794-
var minAngle = Math.asin(opposite / hypotenuse) * (180 / Math.PI /* to degrees */);
3795-
3796-
angle = autoTickAngles.find(function(angle) { return Math.abs(angle) >= minAngle; });
3797-
if(angle === undefined) {
3798-
// no angle larger than minAngle, just pick the largest angle
3799-
angle = autoTickAngles.reduce(
3800-
function(currentMax, nextAngle) { return Math.abs(currentMax) < Math.abs(nextAngle) ? nextAngle : currentMax; }
3801-
, autoTickAngles[0]
3795+
var maxCos = adjacent / hypotenuse;
3796+
angleRadians = autoTickAnglesRadians.find(function(angle) { return Math.abs(Math.cos(angle)) <= maxCos; });
3797+
if(angleRadians === undefined) {
3798+
// no angle with smaller cosine than maxCos, just pick the angle with smallest cosine
3799+
angleRadians = autoTickAnglesRadians.reduce(
3800+
function(currentMax, nextAngle) {
3801+
return Math.abs(Math.cos(currentMax)) < Math.abs(Math.cos(nextAngle)) ? currentMax : nextAngle;
3802+
}
3803+
, autoTickAnglesRadians[0]
38023804
);
38033805
}
38043806
}
38053807
if(prevAngle !== undefined) {
3806-
angle = Math.abs(angle) > Math.abs(prevAngle) ? angle : prevAngle;
3808+
angleRadians = Math.abs(Math.cos(angleRadians)) < Math.abs(Math.cos(prevAngle)) ? angleRadians : prevAngle;
38073809
}
38083810
for(i = 0; i < lbbArray.length - 1; i++) {
38093811
if(Lib.bBoxIntersect(lbbArray[i], lbbArray[i + 1], pad)) {
3810-
autoangle = angle;
3812+
autoangle = angleRadians * (180 / Math.PI /* to degrees */);
38113813
break;
38123814
}
38133815
}

0 commit comments

Comments
 (0)