@@ -13,6 +13,7 @@ import {innerDimensions, outerDimensions} from "./scales.js";
1313import { position , registry as scaleRegistry } from "./scales/index.js" ;
1414import { applyInlineStyles , maybeClassName } from "./style.js" ;
1515import { consumeWarnings , warn } from "./warnings.js" ;
16+ import { getGeometryChannels } from "./projection.js" ;
1617
1718export function plot ( options = { } ) {
1819 const { facet, style, caption, ariaLabel, ariaDescription} = options ;
@@ -383,15 +384,26 @@ function addScaleChannels(channelsByScale, stateByMark, filter = yes) {
383384 const channel = channels [ name ] ;
384385 const { scale} = channel ;
385386 if ( scale != null && filter ( scale ) ) {
386- const scaleChannels = channelsByScale . get ( scale ) ;
387- if ( scaleChannels !== undefined ) scaleChannels . push ( channel ) ;
388- else channelsByScale . set ( scale , [ channel ] ) ;
387+ if ( scale === "projection" ) {
388+ // TODO only do this if there’s no projection
389+ const [ x , y ] = getGeometryChannels ( channel ) ;
390+ addScaleChannel ( channelsByScale , "x" , x ) ;
391+ addScaleChannel ( channelsByScale , "y" , y ) ;
392+ } else {
393+ addScaleChannel ( channelsByScale , scale , channel ) ;
394+ }
389395 }
390396 }
391397 }
392398 return channelsByScale ;
393399}
394400
401+ function addScaleChannel ( channelsByScale , scale , channel ) {
402+ const scaleChannels = channelsByScale . get ( scale ) ;
403+ if ( scaleChannels !== undefined ) scaleChannels . push ( channel ) ;
404+ else channelsByScale . set ( scale , [ channel ] ) ;
405+ }
406+
395407// Returns the facet groups, and possibly fx and fy channels, associated with
396408// the top-level facet option {data, x, y}.
397409function maybeTopFacet ( facet , options ) {
@@ -465,8 +477,8 @@ function inferAxes(marks, channelsByScale, options) {
465477 } = options ;
466478
467479 // Disable axes if the corresponding scale is not present.
468- if ( projection || ( ! isScaleOptions ( x ) && ! hasScaleChannel ( "x" , marks ) ) ) xAxis = xGrid = null ;
469- if ( projection || ( ! isScaleOptions ( y ) && ! hasScaleChannel ( "y" , marks ) ) ) yAxis = yGrid = null ;
480+ if ( projection || ( ! isScaleOptions ( x ) && ! hasPositionChannel ( "x" , marks ) ) ) xAxis = xGrid = null ;
481+ if ( projection || ( ! isScaleOptions ( y ) && ! hasPositionChannel ( "y" , marks ) ) ) yAxis = yGrid = null ;
470482 if ( ! channelsByScale . has ( "fx" ) ) fxAxis = fxGrid = null ;
471483 if ( ! channelsByScale . has ( "fy" ) ) fyAxis = fyGrid = null ;
472484
@@ -592,10 +604,11 @@ function hasAxis(marks, k) {
592604 return marks . some ( ( m ) => m . ariaLabel ?. startsWith ( prefix ) ) ;
593605}
594606
595- function hasScaleChannel ( k , marks ) {
607+ function hasPositionChannel ( k , marks ) {
596608 for ( const mark of marks ) {
597609 for ( const key in mark . channels ) {
598- if ( mark . channels [ key ] . scale === k ) {
610+ const { scale} = mark . channels [ key ] ;
611+ if ( scale === k || scale === "projection" ) {
599612 return true ;
600613 }
601614 }
0 commit comments