@@ -84,6 +84,7 @@ module.exports = function style(s, gd) {
8484 . enter ( ) . append ( 'g' )
8585 . classed ( 'legendpoints' , true ) ;
8686 } )
87+ . each ( styleSpatial )
8788 . each ( styleWaterfalls )
8889 . each ( styleFunnels )
8990 . each ( styleBars )
@@ -481,6 +482,124 @@ module.exports = function style(s, gd) {
481482 stylePie ( pts , d0Mod , tMod ) ;
482483 }
483484 }
485+
486+ function styleSpatial ( d ) { // i.e. maninly traces having z and colorscale
487+ var trace = d [ 0 ] . trace ;
488+
489+ var useGradient ;
490+ var ptsData = [ ] ;
491+ if ( trace . visible ) {
492+ switch ( trace . type ) {
493+ case 'histogram2d' :
494+ case 'heatmap' :
495+ ptsData = [
496+ [ 'M-15,-2V4H15V-2Z' ] // similar to contour
497+ ] ;
498+ useGradient = true ;
499+ break ;
500+ case 'choropleth' :
501+ case 'choroplethmapbox' :
502+ case 'densitymapbox' :
503+ ptsData = [
504+ [ 'M-6,-6V6H6V-6Z' ]
505+ ] ;
506+ useGradient = true ;
507+ break ;
508+ case 'cone' :
509+ ptsData = [
510+ [ 'M-6,2 A2,2 0 0,0 -6,6 V6L6,4Z' ] ,
511+ [ 'M-6,-6 A2,2 0 0,0 -6,-2 L6,-4Z' ] ,
512+ [ 'M-6,-2 A2,2 0 0,0 -6,2 L6,0Z' ]
513+ ] ;
514+ useGradient = false ;
515+ break ;
516+ case 'streamtube' :
517+ ptsData = [
518+ [ 'M-6,2 A2,2 0 0,0 -6,6 H6 A2,2 0 0,1 6,2 Z' ] ,
519+ [ 'M-6,-6 A2,2 0 0,0 -6,-2 H6 A2,2 0 0,1 6,-6 Z' ] ,
520+ [ 'M-6,-2 A2,2 0 0,0 -6,2 H6 A2,2 0 0,1 6,-2 Z' ]
521+ ] ;
522+ useGradient = false ;
523+ break ;
524+ case 'surface' :
525+ ptsData = [
526+ [ 'M-6,-6 A2,3 0 0,0 -6,0 H6 A2,3 0 0,1 6,-6 Z' ] ,
527+ [ 'M-6,1 A2,3 0 0,1 -6,6 H6 A2,3 0 0,0 6,0 Z' ]
528+ ] ;
529+ useGradient = true ;
530+ break ;
531+ case 'mesh3d' :
532+ ptsData = [
533+ [ 'M-6,6H0L-6,-6Z' ] ,
534+ [ 'M6,6H0L6,-6Z' ] ,
535+ [ 'M-6,-6H6L0,6Z' ]
536+ ] ;
537+ useGradient = false ;
538+ break ;
539+ case 'volume' :
540+ ptsData = [
541+ [ 'M-6,6H0L-6,-6Z' ] ,
542+ [ 'M6,6H0L6,-6Z' ] ,
543+ [ 'M-6,-6H6L0,6Z' ]
544+ ] ;
545+ useGradient = true ;
546+ break ;
547+ case 'isosurface' :
548+ ptsData = [
549+ [ 'M-6,6H0L-6,-6Z' ] ,
550+ [ 'M6,6H0L6,-6Z' ] ,
551+ [ 'M-6,-6 A12,24 0 0,0 6,-6 L0,6Z' ]
552+ ] ;
553+ useGradient = false ;
554+ break ;
555+ }
556+ }
557+
558+ var pts = d3 . select ( this ) . select ( 'g.legendpoints' )
559+ . selectAll ( 'path.legend3dandfriends' )
560+ . data ( ptsData ) ;
561+ pts . enter ( ) . append ( 'path' ) . classed ( 'legend3dandfriends' , true )
562+ . attr ( 'transform' , 'translate(20,0)' )
563+ . style ( 'stroke-miterlimit' , 1 ) ;
564+ pts . exit ( ) . remove ( ) ;
565+
566+ pts . each ( function ( dd , i ) {
567+ var pt = d3 . select ( this ) ;
568+
569+ var cOpts = extractOpts ( trace ) ;
570+ var colorscale = cOpts . colorscale ;
571+ var reversescale = cOpts . reversescale ;
572+ var fillGradient = function ( s ) {
573+ if ( s . size ( ) ) {
574+ var gradientID = 'legendfill-' + trace . uid ;
575+ Drawing . gradient ( s , gd , gradientID ,
576+ reversescale ? 'horizontal' : 'horizontalreversed' ,
577+ colorscale , 'fill' ) ;
578+ }
579+ } ;
580+
581+ var fillColor ;
582+ if ( ! colorscale ) {
583+ var color = trace . vertexcolor || trace . facecolor || trace . color ;
584+ fillColor = Lib . isArrayOrTypedArray ( color ) ? ( color [ i ] || color [ 0 ] ) : color ;
585+ } else {
586+ if ( ! useGradient ) {
587+ var len = colorscale . length ;
588+ fillColor =
589+ i === 0 ? colorscale [ reversescale ? len - 1 : 0 ] [ 1 ] : // minimum
590+ i === 1 ? colorscale [ reversescale ? 0 : len - 1 ] [ 1 ] : // maximum
591+ colorscale [ Math . floor ( ( len - 1 ) / 2 ) ] [ 1 ] ; // middle
592+ }
593+ }
594+
595+ pt . attr ( 'd' , dd [ 0 ] ) ;
596+ if ( fillColor ) {
597+ pt . call ( Color . fill , fillColor ) ;
598+ } else {
599+ pt . call ( fillGradient ) ;
600+ }
601+ } ) ;
602+ }
484603} ;
485604
486605function getGradientDirection ( reversescale ) {
0 commit comments