@@ -22,6 +22,7 @@ var handleAxisDefaults = require('../../plots/cartesian/axis_defaults');
22
22
var handleAxisPositionDefaults = require ( '../../plots/cartesian/position_defaults' ) ;
23
23
var axisLayoutAttrs = require ( '../../plots/cartesian/layout_attributes' ) ;
24
24
25
+ var Color = require ( '../../components/color' ) ;
25
26
var anchor = {
26
27
'left' : 'start' ,
27
28
'center' : 'middle' ,
@@ -86,7 +87,7 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb
86
87
if ( ! hasGauge ) {
87
88
numbersX = size . l + position [ numbersAlign ] * size . w ;
88
89
numbersScaler = function ( el ) {
89
- return fitTextInsideBox ( el , 0.9 * size . w , 0.9 * size . h ) ;
90
+ return fitTextInsideBox ( el , size . w , size . h ) ;
90
91
} ;
91
92
} else {
92
93
if ( isAngular ) {
@@ -142,10 +143,9 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb
142
143
}
143
144
144
145
// Prepare angular gauge layers
145
- var data = cd . filter ( function ( ) { return isAngular ; } ) ;
146
- var angularGauge = plotGroup . selectAll ( 'g.angular' ) . data ( data ) ;
146
+ var angularGauge = plotGroup . selectAll ( 'g.angular' ) . data ( isAngular ? cd : [ ] ) ;
147
147
angularGauge . exit ( ) . remove ( ) ;
148
- var angularaxisLayer = plotGroup . selectAll ( 'g.angularaxis' ) . data ( data ) ;
148
+ var angularaxisLayer = plotGroup . selectAll ( 'g.angularaxis' ) . data ( isAngular ? cd : [ ] ) ;
149
149
angularaxisLayer . exit ( ) . remove ( ) ;
150
150
151
151
var gaugeOpts = {
@@ -163,10 +163,9 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb
163
163
if ( isAngular ) drawAngularGauge ( gd , plotGroup , cd , gaugeOpts ) ;
164
164
165
165
// Prepare bullet layers
166
- data = cd . filter ( function ( ) { return isBullet ; } ) ;
167
- var bulletGauge = plotGroup . selectAll ( 'g.bullet' ) . data ( data ) ;
166
+ var bulletGauge = plotGroup . selectAll ( 'g.bullet' ) . data ( isBullet ? cd : [ ] ) ;
168
167
bulletGauge . exit ( ) . remove ( ) ;
169
- var bulletaxisLayer = plotGroup . selectAll ( 'g.bulletaxis' ) . data ( data ) ;
168
+ var bulletaxisLayer = plotGroup . selectAll ( 'g.bulletaxis' ) . data ( isBullet ? cd : [ ] ) ;
170
169
bulletaxisLayer . exit ( ) . remove ( ) ;
171
170
172
171
gaugeOpts = {
@@ -202,8 +201,12 @@ module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallb
202
201
if ( hasGauge ) {
203
202
if ( isAngular ) {
204
203
// position above axis ticks/labels
205
- var bBox = Drawing . bBox ( angularaxisLayer . node ( ) ) ;
206
- titleY = ( bBox . top - titlePadding ) - titlebBox . bottom ;
204
+ if ( trace . gauge . axis . visible ) {
205
+ var bBox = Drawing . bBox ( angularaxisLayer . node ( ) ) ;
206
+ titleY = ( bBox . top - titlePadding ) - titlebBox . bottom ;
207
+ } else {
208
+ titleY = size . t + size . h / 2 - radius / 2 - titlebBox . bottom - titlePadding ;
209
+ }
207
210
}
208
211
if ( isBullet ) {
209
212
// position outside domain
@@ -244,7 +247,7 @@ function drawBulletGauge(gd, plotGroup, cd, gaugeOpts) {
244
247
bulletaxis . enter ( ) . append ( 'g' )
245
248
. classed ( 'bulletaxis' , true )
246
249
. classed ( 'crisp' , true ) ;
247
- bulletaxis . selectAll ( 'g.' + 'xbulletaxis' + 'tick,path' ) . remove ( ) ;
250
+ bulletaxis . selectAll ( 'g.' + 'xbulletaxis' + 'tick,path,text ' ) . remove ( ) ;
248
251
249
252
// Draw bullet
250
253
var bulletHeight = size . h ; // use all vertical domain
@@ -288,16 +291,16 @@ function drawBulletGauge(gd, plotGroup, cd, gaugeOpts) {
288
291
289
292
// Draw bullet background, steps
290
293
var boxes = [ gaugeBg ] . concat ( trace . gauge . steps ) ;
291
- var targetBullet = bullet . selectAll ( 'g.targetBullet ' ) . data ( boxes ) ;
292
- targetBullet . enter ( ) . append ( 'g' ) . classed ( 'targetBullet ' , true ) . append ( 'rect' ) ;
294
+ var targetBullet = bullet . selectAll ( 'g.target-bullet ' ) . data ( boxes ) ;
295
+ targetBullet . enter ( ) . append ( 'g' ) . classed ( 'target-bullet ' , true ) . append ( 'rect' ) ;
293
296
targetBullet . select ( 'rect' )
294
297
. call ( drawRect )
295
298
. call ( styleShape ) ;
296
299
targetBullet . exit ( ) . remove ( ) ;
297
300
298
301
// Draw value bar with transitions
299
- var fgBullet = bullet . selectAll ( 'g.fgBullet ' ) . data ( [ trace . gauge . value ] ) ;
300
- fgBullet . enter ( ) . append ( 'g' ) . classed ( 'fgBullet ' , true ) . append ( 'rect' ) ;
302
+ var fgBullet = bullet . selectAll ( 'g.fg-bullet ' ) . data ( [ trace . gauge . value ] ) ;
303
+ fgBullet . enter ( ) . append ( 'g' ) . classed ( 'fg-bullet ' , true ) . append ( 'rect' ) ;
301
304
fgBullet . select ( 'rect' )
302
305
. attr ( 'height' , innerBulletHeight )
303
306
. attr ( 'y' , ( bulletHeight - innerBulletHeight ) / 2 )
@@ -324,12 +327,12 @@ function drawBulletGauge(gd, plotGroup, cd, gaugeOpts) {
324
327
. attr ( 'x2' , ax . c2p ( trace . gauge . threshold . value ) )
325
328
. attr ( 'y1' , ( 1 - trace . gauge . threshold . thickness ) / 2 * bulletHeight )
326
329
. attr ( 'y2' , ( 1 - ( 1 - trace . gauge . threshold . thickness ) / 2 ) * bulletHeight )
327
- . style ( ' stroke' , trace . gauge . threshold . line . color )
330
+ . call ( Color . stroke , trace . gauge . threshold . line . color )
328
331
. style ( 'stroke-width' , trace . gauge . threshold . line . width ) ;
329
332
threshold . exit ( ) . remove ( ) ;
330
333
331
- var bulletOutline = bullet . selectAll ( 'g.bulletOutline ' ) . data ( [ gaugeOutline ] ) ;
332
- bulletOutline . enter ( ) . append ( 'g' ) . classed ( 'bulletOutline ' , true ) . append ( 'rect' ) ;
334
+ var bulletOutline = bullet . selectAll ( 'g.bullet-outline ' ) . data ( [ gaugeOutline ] ) ;
335
+ bulletOutline . enter ( ) . append ( 'g' ) . classed ( 'bullet-outline ' , true ) . append ( 'rect' ) ;
333
336
bulletOutline . select ( 'rect' )
334
337
. call ( drawRect )
335
338
. call ( styleShape ) ;
@@ -388,12 +391,12 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) {
388
391
angularaxisLayer . enter ( ) . append ( 'g' )
389
392
. classed ( 'angularaxis' , true )
390
393
. classed ( 'crisp' , true ) ;
391
- angularaxisLayer . selectAll ( 'g.' + 'angularaxis ' + 'tick,path' ) . remove ( ) ;
394
+ angularaxisLayer . selectAll ( 'g.' + 'xangularaxis ' + 'tick,path,text ' ) . remove ( ) ;
392
395
393
396
ax = mockAxis ( gd , opts ) ;
394
397
ax . type = 'linear' ;
395
398
ax . range = [ trace . vmin , trace . vmax ] ;
396
- ax . _id = 'x ' ; // or 'y', but I don't think this makes a difference here
399
+ ax . _id = 'xangularaxis ' ; // or 'y', but I don't think this makes a difference here
397
400
ax . setScale ( ) ;
398
401
399
402
// 't'ick to 'g'eometric radians is used all over the place here
@@ -426,26 +429,28 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) {
426
429
return - 0.5 * ( 1 + Math . sin ( rad ) ) * h ;
427
430
} ;
428
431
var _transFn = function ( rad ) {
429
- return strTranslate ( gaugePosition [ 0 ] + radius * Math . cos ( rad ) , gaugePosition [ 1 ] - radius * Math . sin ( rad ) ) ;
432
+ return strTranslate (
433
+ gaugePosition [ 0 ] + radius * Math . cos ( rad ) ,
434
+ gaugePosition [ 1 ] - radius * Math . sin ( rad )
435
+ ) ;
430
436
} ;
431
437
transFn = function ( d ) {
432
438
return _transFn ( t2g ( d ) ) ;
433
439
} ;
434
440
var transFn2 = function ( d ) {
435
441
var rad = t2g ( d ) ;
436
- return _transFn ( rad ) + strRotate ( - rad2deg ( rad ) ) ;
442
+ return _transFn ( rad ) + 'rotate(' + - rad2deg ( rad ) + ')' ;
437
443
} ;
438
444
vals = Axes . calcTicks ( ax ) ;
439
- tickSign ;
445
+ tickSign = Axes . getTickSigns ( ax ) [ 2 ] ;
440
446
if ( ax . visible ) {
441
447
tickSign = ax . ticks === 'inside' ? - 1 : 1 ;
442
448
var pad = ( ax . linewidth || 1 ) / 2 ;
443
449
Axes . drawTicks ( gd , ax , {
444
450
vals : vals ,
445
451
layer : angularaxisLayer ,
446
452
path : 'M' + ( tickSign * pad ) + ',0h' + ( tickSign * ax . ticklen ) ,
447
- transFn : transFn2 ,
448
- crips : true
453
+ transFn : transFn2
449
454
} ) ;
450
455
Axes . drawLabels ( gd , ax , {
451
456
vals : vals ,
@@ -470,14 +475,14 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) {
470
475
// Draw background + steps
471
476
var arcs = [ gaugeBg ] . concat ( trace . gauge . steps ) ;
472
477
if ( v ) arcs . push ( thresholdArc ) ;
473
- var targetArc = angularGauge . selectAll ( 'g.targetArc ' ) . data ( arcs ) ;
474
- targetArc . enter ( ) . append ( 'g' ) . classed ( 'targetArc ' , true ) . append ( 'path' ) ;
478
+ var targetArc = angularGauge . selectAll ( 'g.target-arc ' ) . data ( arcs ) ;
479
+ targetArc . enter ( ) . append ( 'g' ) . classed ( 'target-arc ' , true ) . append ( 'path' ) ;
475
480
targetArc . select ( 'path' ) . call ( drawArc ) . call ( styleShape ) ;
476
481
targetArc . exit ( ) . remove ( ) ;
477
482
// Draw foreground with transition
478
483
var valueArcPath = arcPathGenerator ( trace . gauge . value . thickness ) ;
479
- var fgArc = angularGauge . selectAll ( 'g.fgArc ' ) . data ( [ trace . gauge . value ] ) ;
480
- fgArc . enter ( ) . append ( 'g' ) . classed ( 'fgArc ' , true ) . append ( 'path' ) ;
484
+ var fgArc = angularGauge . selectAll ( 'g.fg-arc ' ) . data ( [ trace . gauge . value ] ) ;
485
+ fgArc . enter ( ) . append ( 'g' ) . classed ( 'fgarc ' , true ) . append ( 'path' ) ;
481
486
var fgArcPath = fgArc . select ( 'path' ) ;
482
487
if ( hasTransition ) {
483
488
fgArcPath
@@ -493,8 +498,8 @@ function drawAngularGauge(gd, plotGroup, cd, gaugeOpts) {
493
498
}
494
499
fgArcPath . call ( styleShape ) ;
495
500
fgArc . exit ( ) . remove ( ) ;
496
- var gaugeBorder = angularGauge . selectAll ( 'g.gaugeOutline ' ) . data ( [ gaugeOutline ] ) ;
497
- gaugeBorder . enter ( ) . append ( 'g' ) . classed ( 'gaugeOutline ' , true ) . append ( 'path' ) ;
501
+ var gaugeBorder = angularGauge . selectAll ( 'g.gauge-outline ' ) . data ( [ gaugeOutline ] ) ;
502
+ gaugeBorder . enter ( ) . append ( 'g' ) . classed ( 'gauge-outline ' , true ) . append ( 'path' ) ;
498
503
gaugeBorder . select ( 'path' ) . call ( drawArc ) . call ( styleShape ) ;
499
504
gaugeBorder . exit ( ) . remove ( ) ;
500
505
}
@@ -564,7 +569,7 @@ function drawNumbers(gd, plotGroup, cd, opts) {
564
569
var bignumberAx = mockAxis ( gd , { tickformat : trace . number . valueformat } ) ;
565
570
var fmt = function ( v ) { return Axes . tickText ( bignumberAx , v ) . text ; } ;
566
571
var bignumberSuffix = trace . number . suffix ;
567
- if ( bignumberSuffix ) bignumberSuffix = ' ' + bignumberSuffix ;
572
+ var bignumberPrefix = trace . number . prefix ;
568
573
569
574
var number = numbers . select ( 'tspan.number' ) ;
570
575
number
@@ -583,11 +588,11 @@ function drawNumbers(gd, plotGroup, cd, opts) {
583
588
var that = d3 . select ( this ) ;
584
589
var interpolator = d3 . interpolateNumber ( cd [ 0 ] . lastY , cd [ 0 ] . y ) ;
585
590
return function ( t ) {
586
- that . text ( fmt ( interpolator ( t ) ) + bignumberSuffix ) ;
591
+ that . text ( bignumberPrefix + fmt ( interpolator ( t ) ) + bignumberSuffix ) ;
587
592
} ;
588
593
} ) ;
589
594
} else {
590
- number . text ( fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
595
+ number . text ( bignumberPrefix + fmt ( cd [ 0 ] . y ) + bignumberSuffix ) ;
591
596
}
592
597
}
593
598
@@ -610,7 +615,7 @@ function drawNumbers(gd, plotGroup, cd, opts) {
610
615
var delta = numbers . select ( 'tspan.delta' ) ;
611
616
delta
612
617
. call ( Drawing . font , trace . delta . font )
613
- . style ( ' fill' , deltaFill )
618
+ . each ( function ( d ) { Color . fill ( d3 . select ( this ) , deltaFill ( d ) ) ; } )
614
619
. attr ( 'x' , deltaX )
615
620
. attr ( 'dy' , deltaDy ) ;
616
621
@@ -669,8 +674,8 @@ function drawNumbers(gd, plotGroup, cd, opts) {
669
674
// Apply fill, stroke, stroke-width to SVG shape
670
675
function styleShape ( p ) {
671
676
p
672
- . style ( 'fill' , function ( d ) { return d . color ; } )
673
- . style ( 'stroke' , function ( d ) { return d . line . color ; } )
677
+ . each ( function ( d ) { Color . stroke ( d3 . select ( this ) , d . line . color ) ; } )
678
+ . each ( function ( d ) { Color . fill ( d3 . select ( this ) , d . color ) ; } )
674
679
. style ( 'stroke-width' , function ( d ) { return d . line . width ; } ) ;
675
680
}
676
681
@@ -690,6 +695,7 @@ function mockAxis(gd, opts, zrange) {
690
695
var fullLayout = gd . _fullLayout ;
691
696
692
697
var axisIn = {
698
+ visible : opts . visible ,
693
699
type : 'linear' ,
694
700
ticks : 'outside' ,
695
701
range : zrange ,
@@ -743,10 +749,6 @@ function strTranslate(x, y) {
743
749
return 'translate(' + x + ',' + y + ')' ;
744
750
}
745
751
746
- function strRotate ( angle ) {
747
- return 'rotate(' + angle + ')' ;
748
- }
749
-
750
752
function fitTextInsideBox ( el , width , height ) {
751
753
// compute scaling ratio to have text fit within specified width and height
752
754
var textBB = Drawing . bBox ( el . node ( ) ) ;
@@ -761,28 +763,3 @@ function fitTextInsideCircle(el, radius) {
761
763
var ratio = radius / elRadius ;
762
764
return [ ratio , textBB , radius ] ;
763
765
}
764
-
765
- // Draw gauge's min and max in text
766
- // var minText = gauge.selectAll('text.min').data(cd);
767
- // minText.enter().append('text').classed('min', true);
768
- // minText
769
- // .call(Drawing.font, trace.number.font)
770
- // .style('font-size', gaugeFontSize)
771
- // .attr({
772
- // x: - (innerRadius + radius) / 2,
773
- // y: gaugeFontSize,
774
- // 'text-anchor': 'middle'
775
- // })
776
- // .text(fmt(trace.vmin));
777
- //
778
- // var maxText = gauge.selectAll('text.max').data(cd);
779
- // maxText.enter().append('text').classed('max', true);
780
- // maxText
781
- // .call(Drawing.font, trace.number.font)
782
- // .style('font-size', gaugeFontSize)
783
- // .attr({
784
- // x: (innerRadius + radius) / 2,
785
- // y: gaugeFontSize,
786
- // 'text-anchor': 'middle'
787
- // })
788
- // .text(fmt(trace.vmax));
0 commit comments