@@ -1745,23 +1745,25 @@ axes.drawOne = function(gd, ax, opts) {
1745
1745
1746
1746
// tick labels - for now just the main labels.
1747
1747
// TODO: mirror labels, esp for subplots
1748
- var labelFns = axes . makeLabelFns ( ax , mainLinePosition ) ;
1749
1748
1750
- seq . push ( function ( ) {
1751
- return axes . drawLabels ( gd , ax , {
1752
- vals : vals ,
1753
- layer : mainAxLayer ,
1754
- transFn : transFn ,
1755
- labelXFn : labelFns . labelXFn ,
1756
- labelYFn : labelFns . labelYFn ,
1757
- labelAnchorFn : labelFns . labelAnchorFn ,
1758
- } ) ;
1749
+ seq . push ( function ( ) {
1750
+ var labelFns = axes . makeLabelFns ( ax , mainLinePosition ) ;
1751
+ return axes . drawLabels ( gd , ax , {
1752
+ vals : vals ,
1753
+ layer : mainAxLayer ,
1754
+ transFn : transFn ,
1755
+ labelXFn : labelFns . labelXFn ,
1756
+ labelYFn : labelFns . labelYFn ,
1757
+ labelAnchorFn : labelFns . labelAnchorFn ,
1759
1758
} ) ;
1759
+ } ) ;
1760
1760
1761
- if ( ax . type === 'multicategory' ) {
1761
+ if ( ax . type === 'multicategory' ) {
1762
+ seq . push ( function ( ) {
1763
+ // TODO?
1762
1764
// drawDividers()
1763
1765
1764
- // TODO move to formatMultiCategory
1766
+ var secondaryLabelVals = [ ] ;
1765
1767
var lookup = { } ;
1766
1768
for ( i = 0 ; i < vals . length ; i ++ ) {
1767
1769
var d = vals [ i ] ;
@@ -1771,31 +1773,41 @@ axes.drawOne = function(gd, ax, opts) {
1771
1773
lookup [ d . text2 ] = [ d . x ] ;
1772
1774
}
1773
1775
}
1774
- var secondaryLabelVals = [ ] ;
1775
1776
for ( var k in lookup ) {
1776
1777
secondaryLabelVals . push ( tickTextObj ( ax , Lib . interp ( lookup [ k ] , 0.5 ) , k ) ) ;
1777
1778
}
1778
1779
1779
- // TODO could do better!
1780
- var secondarayPosition = ax . _mainLinePosition + { bottom : 20 , top : - 20 } [ ax . side ] ;
1781
- var secondaryLabelFns = axes . makeLabelFns ( ax , secondarayPosition ) ;
1780
+ var labelHeight = 0 ;
1781
+ ax . _selections [ ax . _id + 'tick' ] . each ( function ( ) {
1782
+ var thisLabel = selectTickLabel ( this ) ;
1782
1783
1783
- seq . push ( function ( ) {
1784
- return axes . drawLabels ( gd , ax , {
1785
- vals : secondaryLabelVals ,
1786
- layer : mainAxLayer ,
1787
- cls : ax . _id + 'tick2' ,
1788
- transFn : transFn ,
1789
- labelXFn : secondaryLabelFns . labelXFn ,
1790
- labelYFn : secondaryLabelFns . labelYFn ,
1791
- labelAnchorFn : secondaryLabelFns . labelAnchorFn ,
1792
- } ) ;
1784
+ // TODO Drawing.bBox doesn't work when labels are rotated
1785
+ // var bb = Drawing.bBox(thisLabel.node());
1786
+ var bb = thisLabel . node ( ) . getBoundingClientRect ( ) ;
1787
+ labelHeight = Math . max ( labelHeight , bb . height ) ;
1793
1788
} ) ;
1794
- }
1795
1789
1796
- // TODO update 'avoid selection' for multicategory
1797
- seq . push ( function ( ) {
1798
- return axes . drawTitle ( gd , ax ) ;
1790
+ var secondarayPosition ;
1791
+ if ( ax . side === 'bottom' ) {
1792
+ secondarayPosition = mainLinePosition + labelHeight + 2 ;
1793
+ } else {
1794
+ secondarayPosition = mainLinePosition - labelHeight - 2 ;
1795
+ if ( ax . tickfont ) {
1796
+ secondarayPosition -= ( ax . tickfont . size * LINE_SPACING ) ;
1797
+ }
1798
+ }
1799
+
1800
+ var secondaryLabelFns = axes . makeLabelFns ( ax , secondarayPosition ) ;
1801
+
1802
+ return axes . drawLabels ( gd , ax , {
1803
+ vals : secondaryLabelVals ,
1804
+ layer : mainAxLayer ,
1805
+ cls : ax . _id + 'tick2' ,
1806
+ transFn : transFn ,
1807
+ labelXFn : secondaryLabelFns . labelXFn ,
1808
+ labelYFn : secondaryLabelFns . labelYFn ,
1809
+ labelAnchorFn : secondaryLabelFns . labelAnchorFn ,
1810
+ } ) ;
1799
1811
} ) ;
1800
1812
}
1801
1813
@@ -2360,13 +2372,10 @@ axes.drawLabels = function(gd, ax, opts) {
2360
2372
var i ;
2361
2373
2362
2374
tickLabels . each ( function ( d ) {
2363
- var s = d3 . select ( this ) ;
2364
- var thisLabel = s . select ( '.text-math-group' ) ;
2365
- if ( thisLabel . empty ( ) ) thisLabel = s . select ( 'text' ) ;
2366
-
2367
2375
maxFontSize = Math . max ( maxFontSize , d . fontSize ) ;
2368
2376
2369
2377
var x = ax . l2p ( d . x ) ;
2378
+ var thisLabel = selectTickLabel ( this ) ;
2370
2379
var bb = Drawing . bBox ( thisLabel . node ( ) ) ;
2371
2380
2372
2381
lbbArray . push ( {
@@ -2401,12 +2410,12 @@ axes.drawLabels = function(gd, ax, opts) {
2401
2410
} else {
2402
2411
var vLen = vals . length ;
2403
2412
var tickSpacing = Math . abs ( ( vals [ vLen - 1 ] . x - vals [ 0 ] . x ) * ax . _m ) / ( vLen - 1 ) ;
2404
- var fitBetweenTicks = tickSpacing < maxFontSize * 2.5 ;
2413
+ var rotate90 = ( tickSpacing < maxFontSize * 2.5 ) || ax . type === 'multicategory' ;
2405
2414
2406
2415
// any overlap at all - set 30 degrees or 90 degrees
2407
2416
for ( i = 0 ; i < lbbArray . length - 1 ; i ++ ) {
2408
2417
if ( Lib . bBoxIntersect ( lbbArray [ i ] , lbbArray [ i + 1 ] ) ) {
2409
- autoangle = fitBetweenTicks ? 90 : 30 ;
2418
+ autoangle = rotate90 ? 90 : 30 ;
2410
2419
break ;
2411
2420
}
2412
2421
}
@@ -2432,15 +2441,18 @@ function drawTitle(gd, ax) {
2432
2441
var fullLayout = gd . _fullLayout ;
2433
2442
var axId = ax . _id ;
2434
2443
var axLetter = axId . charAt ( 0 ) ;
2435
- var offsetBase = 1.5 ;
2436
2444
var gs = fullLayout . _size ;
2437
2445
var fontSize = ax . title . font . size ;
2438
2446
2439
- var transform , counterAxis , x , y ;
2447
+ var titleStandoff ;
2448
+ if ( ax . type === 'multicategory' ) {
2449
+ titleStandoff = ax . _boundingBox . height ;
2450
+ } else {
2451
+ var offsetBase = 1.5 ;
2452
+ titleStandoff = 10 + fontSize * offsetBase + ( ax . linewidth ? ax . linewidth - 1 : 0 ) ;
2440
2453
}
2441
2454
2442
- var titleStandoff = 10 + fontSize * offsetBase +
2443
- ( ax . linewidth ? ax . linewidth - 1 : 0 ) ;
2455
+ var transform , counterAxis , x , y ;
2444
2456
2445
2457
if ( axLetter === 'x' ) {
2446
2458
counterAxis = ( ax . anchor === 'free' ) ?
@@ -2595,6 +2607,12 @@ function hasBarsOrFill(gd, ax) {
2595
2607
return false ;
2596
2608
}
2597
2609
2610
+ function selectTickLabel ( gTick ) {
2611
+ var s = d3 . select ( gTick ) ;
2612
+ var mj = s . select ( '.text-math-group' ) ;
2613
+ return mj . empty ( ) ? s . select ( 'text' ) : mj ;
2614
+ }
2615
+
2598
2616
/**
2599
2617
* Find all margin pushers for 2D axes and reserve them for later use
2600
2618
* Both label and rangeslider automargin calculations happen later so
0 commit comments