Skip to content

Commit 0726989

Browse files
committed
expose instantiated scales descriptors in the render API
1 parent b16a2be commit 0726989

File tree

6 files changed

+333
-18
lines changed

6 files changed

+333
-18
lines changed

src/plot.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,11 @@ export function plot(options = {}) {
141141

142142
// Initalize the scales and dimensions.
143143
const scaleDescriptors = createScales(addScaleChannels(channelsByScale, stateByMark, options), options);
144-
const scales = createScaleFunctions(scaleDescriptors);
145144
const dimensions = createDimensions(scaleDescriptors, marks, options);
146145

147146
autoScaleRange(scaleDescriptors, dimensions);
148147

148+
const scales = createScaleFunctions(scaleDescriptors);
149149
const {fx, fy} = scales;
150150
const subdimensions = fx || fy ? innerDimensions(scaleDescriptors, dimensions) : dimensions;
151151
const superdimensions = fx || fy ? actualDimensions(scales, dimensions) : dimensions;
@@ -221,9 +221,10 @@ export function plot(options = {}) {
221221
addScaleChannels(newChannelsByScale, stateByMark, options, (key) => newByScale.has(key));
222222
addScaleChannels(channelsByScale, stateByMark, options, (key) => newByScale.has(key));
223223
const newScaleDescriptors = inheritScaleLabels(createScales(newChannelsByScale, options), scaleDescriptors);
224-
const newScales = createScaleFunctions(newScaleDescriptors);
224+
const {scales: newIntantiatedScales, ...newScales} = createScaleFunctions(newScaleDescriptors);
225225
Object.assign(scaleDescriptors, newScaleDescriptors);
226226
Object.assign(scales, newScales);
227+
Object.assign(scales.scales, newIntantiatedScales);
227228
}
228229

229230
// Sort and filter the facets to match the fx and fy domains; this is needed
@@ -333,7 +334,7 @@ export function plot(options = {}) {
333334
if (caption != null) figure.append(createFigcaption(document, caption));
334335
}
335336

336-
figure.scale = exposeScales(scaleDescriptors);
337+
figure.scale = exposeScales(scales.scales);
337338
figure.legend = exposeLegends(scaleDescriptors, context, options);
338339

339340
const w = consumeWarnings();

src/scales.d.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,11 @@ export type ScaleName = "x" | "y" | "fx" | "fy" | "r" | "color" | "opacity" | "s
161161

162162
/**
163163
* The instantiated scales’ apply functions; passed to marks and initializers
164-
* for rendering.
164+
* for rendering. The scales property exposes all the scale definitions.
165165
*/
166-
export type ScaleFunctions = {[key in ScaleName]?: (value: any) => any};
166+
export type ScaleFunctions = {
167+
[key in ScaleName]?: (value: any) => any;
168+
} & {scales: {[key in ScaleName]?: Scale}};
167169

168170
/**
169171
* The supported scale types. For quantitative data, one of:

src/scales.js

+17-13
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,21 @@ export function createScales(
9797
return scales;
9898
}
9999

100-
export function createScaleFunctions(scales) {
101-
return Object.fromEntries(
102-
Object.entries(scales)
103-
.filter(([, {scale}]) => scale) // drop identity scales
104-
.map(([name, {scale, type, interval, label}]) => {
105-
scale.type = type; // for axis
106-
if (interval != null) scale.interval = interval; // for axis
107-
if (label != null) scale.label = label; // for axis
108-
return [name, scale];
109-
})
110-
);
100+
export function createScaleFunctions(descriptors) {
101+
const scales = {};
102+
const scaleFunctions = {scales};
103+
for (const [key, desc] of Object.entries(descriptors)) {
104+
const {scale, type, interval, label} = desc;
105+
scales[key] = exposeScale(desc);
106+
if (scale) {
107+
scaleFunctions[key] = scale; // drop identity scales
108+
// TODO: pass these properties, which are needed for axes, in the descriptor.
109+
scale.type = type;
110+
if (interval != null) scale.interval = interval;
111+
if (label != null) scale.label = label;
112+
}
113+
}
114+
return scaleFunctions;
111115
}
112116

113117
// Mutates scale.range!
@@ -513,10 +517,10 @@ export function scale(options = {}) {
513517
return scale;
514518
}
515519

516-
export function exposeScales(scaleDescriptors) {
520+
export function exposeScales(scales) {
517521
return (key) => {
518522
if (!registry.has((key = `${key}`))) throw new Error(`unknown scale: ${key}`);
519-
return key in scaleDescriptors ? exposeScale(scaleDescriptors[key]) : undefined;
523+
return scales[key];
520524
};
521525
}
522526

0 commit comments

Comments
 (0)