@@ -34,6 +34,8 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
34
34
var plotGroup = d3 . select ( this ) ;
35
35
var cd0 = cd [ 0 ] ;
36
36
var trace = cd0 . trace ;
37
+ var xGap = trace . xgap || 0 ;
38
+ var yGap = trace . ygap || 0 ;
37
39
38
40
var z = cd0 . z ;
39
41
var x = cd0 . x ;
@@ -49,7 +51,7 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
49
51
var xrev = false ;
50
52
var yrev = false ;
51
53
52
- var left , right , temp , top , bottom , i , j ;
54
+ var left , right , temp , top , bottom , i , j , k ;
53
55
54
56
// TODO: if there are multiple overlapping categorical heatmaps,
55
57
// or if we allow category sorting, then the categories may not be
@@ -298,8 +300,6 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
298
300
} else { // zsmooth = false -> filling potentially large bricks works fastest with fillRect
299
301
// gaps do not need to be exact integers, but if they *are* we will get
300
302
// cleaner edges by rounding at least one edge
301
- var xGap = trace . xgap ;
302
- var yGap = trace . ygap ;
303
303
var xGapLeft = Math . floor ( xGap / 2 ) ;
304
304
var yGapTop = Math . floor ( yGap / 2 ) ;
305
305
@@ -432,8 +432,17 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
432
432
var _t = Lib . texttemplateString ( texttemplate , obj , gd . _fullLayout . _d3locale , obj , trace . _meta || { } ) ;
433
433
if ( ! _t ) continue ;
434
434
435
+ var lines = _t . split ( '<br>' ) ;
436
+ var nL = lines . length ;
437
+ var nC = 0 ;
438
+ for ( k = 0 ; k < nL ; k ++ ) {
439
+ nC = Math . max ( nC , lines [ k ] . length ) ;
440
+ }
441
+
435
442
textData . push ( {
436
- t : _t ,
443
+ l : nL , // number of lines
444
+ c : nC , // maximum number of chars in a line
445
+ t : _t , // text
437
446
x : _x ,
438
447
y : _y ,
439
448
z : zVal
@@ -444,10 +453,54 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
444
453
var font = trace . textfont ;
445
454
var fontFamily = font . family ;
446
455
var fontSize = font . size ;
456
+
457
+ if ( ! fontSize || fontSize === 'auto' ) {
458
+ var minW = Infinity ;
459
+ var minH = Infinity ;
460
+ var maxL = 0 ;
461
+ var maxC = 0 ;
462
+
463
+ for ( k = 0 ; k < textData . length ; k ++ ) {
464
+ var d = textData [ k ] ;
465
+ maxL = Math . max ( maxL , d . l ) ;
466
+ maxC = Math . max ( maxC , d . c ) ;
467
+
468
+ if ( k < textData . length - 1 ) {
469
+ var nextD = textData [ k + 1 ] ;
470
+ var dx = Math . abs ( nextD . x - d . x ) ;
471
+ var dy = Math . abs ( nextD . y - d . y ) ;
472
+
473
+ if ( dx ) minW = Math . min ( minW , dx ) ;
474
+ if ( dy ) minH = Math . min ( minH , dy ) ;
475
+ }
476
+ }
477
+
478
+ if (
479
+ ! isFinite ( minW ) ||
480
+ ! isFinite ( minH )
481
+ ) {
482
+ fontSize = 12 ;
483
+ } else {
484
+ minW -= xGap ;
485
+ minH -= yGap ;
486
+
487
+ minW /= maxC ;
488
+ minH /= maxL ;
489
+
490
+ minW /= LINE_SPACING / 2 ;
491
+ minH /= LINE_SPACING ;
492
+
493
+ fontSize = Math . min (
494
+ Math . floor ( minW ) ,
495
+ Math . floor ( minH )
496
+ ) ;
497
+ }
498
+ }
499
+ if ( fontSize <= 0 || ! isFinite ( fontSize ) ) return ;
500
+
447
501
var xFn = function ( d ) { return d . x ; } ;
448
502
var yFn = function ( d ) {
449
- var nlines = d . t . split ( '<br>' ) . length ;
450
- return d . y - fontSize * ( ( nlines * LINE_SPACING ) / 2 - 1 ) ;
503
+ return d . y - fontSize * ( ( d . l * LINE_SPACING ) / 2 - 1 ) ;
451
504
} ;
452
505
453
506
var labels = selectLabels ( plotGroup ) . data ( textData ) ;
@@ -462,7 +515,7 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
462
515
var thisLabel = d3 . select ( this ) ;
463
516
464
517
var fontColor = font . color ;
465
- if ( ! fontColor ) {
518
+ if ( ! fontColor || fontColor === 'auto' ) {
466
519
fontColor = Color . contrast (
467
520
'rgba(' +
468
521
sclFunc ( d . z ) . join ( ) +
0 commit comments