svelteplot 0.0.1-alpha.9 → 0.1.3-next.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +5 -0
- package/README.md +3 -35
- package/dist/Mark.svelte +292 -0
- package/dist/Mark.svelte.d.ts +22 -0
- package/dist/Plot.svelte +148 -156
- package/dist/Plot.svelte.d.ts +15 -15
- package/dist/constants.d.ts +15 -0
- package/dist/constants.js +110 -0
- package/dist/core/Facet.svelte +59 -0
- package/dist/core/Facet.svelte.d.ts +18 -0
- package/dist/core/FacetAxes.svelte +66 -0
- package/dist/core/FacetAxes.svelte.d.ts +4 -0
- package/dist/core/FacetGrid.svelte +86 -0
- package/dist/core/FacetGrid.svelte.d.ts +13 -0
- package/dist/core/Plot.svelte +568 -0
- package/dist/core/Plot.svelte.d.ts +14 -0
- package/dist/helpers/arrowPath.d.ts +14 -0
- package/dist/helpers/arrowPath.js +129 -0
- package/dist/helpers/autoProjection.d.ts +19 -0
- package/dist/helpers/autoProjection.js +87 -0
- package/dist/helpers/autoScales.d.ts +23 -0
- package/dist/helpers/autoScales.js +203 -0
- package/dist/helpers/autoTicks.d.ts +3 -0
- package/dist/helpers/autoTicks.js +40 -0
- package/dist/helpers/autoTimeFormat.d.ts +2 -2
- package/dist/helpers/autoTimeFormat.js +34 -5
- package/dist/helpers/callWithProps.d.ts +8 -0
- package/dist/helpers/callWithProps.js +13 -0
- package/dist/helpers/colors.js +17 -2
- package/dist/helpers/curves.d.ts +3 -0
- package/dist/helpers/curves.js +42 -0
- package/dist/helpers/data.d.ts +9 -0
- package/dist/helpers/data.js +16 -0
- package/dist/helpers/facets.d.ts +12 -0
- package/dist/helpers/facets.js +49 -0
- package/dist/helpers/formats.d.ts +3 -0
- package/dist/helpers/formats.js +3 -0
- package/dist/helpers/getBaseStyles.d.ts +7 -2
- package/dist/helpers/getBaseStyles.js +34 -10
- package/dist/helpers/getLogTicks.js +5 -5
- package/dist/helpers/group.d.ts +6 -0
- package/dist/helpers/group.js +53 -0
- package/dist/helpers/index.d.ts +18 -0
- package/dist/helpers/index.js +55 -0
- package/dist/helpers/isRawValue.d.ts +2 -0
- package/dist/helpers/isRawValue.js +5 -0
- package/dist/helpers/isValid.d.ts +6 -0
- package/dist/helpers/isValid.js +6 -0
- package/dist/helpers/math.d.ts +19 -0
- package/dist/helpers/math.js +116 -0
- package/dist/helpers/mergeDeep.d.ts +1 -1
- package/dist/helpers/noise.d.ts +1 -0
- package/dist/helpers/noise.js +72 -0
- package/dist/helpers/projection.d.ts +33 -0
- package/dist/helpers/projection.js +100 -0
- package/dist/helpers/reduce.d.ts +10 -0
- package/dist/helpers/reduce.js +85 -0
- package/dist/helpers/regressionLoess.d.ts +12 -0
- package/dist/helpers/regressionLoess.js +47 -0
- package/dist/helpers/removeIdenticalLines.d.ts +8 -1
- package/dist/helpers/removeIdenticalLines.js +14 -7
- package/dist/helpers/resolve.d.ts +21 -0
- package/dist/helpers/resolve.js +156 -0
- package/dist/helpers/roundedRect.d.ts +9 -0
- package/dist/helpers/roundedRect.js +31 -0
- package/dist/helpers/scales.d.ts +42 -0
- package/dist/helpers/scales.js +311 -0
- package/dist/helpers/time.d.ts +6 -0
- package/dist/helpers/time.js +282 -0
- package/dist/helpers/typeChecks.d.ts +8 -5
- package/dist/helpers/typeChecks.js +27 -6
- package/dist/index.d.ts +49 -1
- package/dist/index.js +53 -2
- package/dist/marks/Area.svelte +146 -0
- package/dist/marks/Area.svelte.d.ts +30 -0
- package/dist/marks/AreaX.svelte +27 -0
- package/dist/marks/AreaX.svelte.d.ts +12 -0
- package/dist/marks/AreaY.svelte +38 -0
- package/dist/marks/AreaY.svelte.d.ts +19 -0
- package/dist/marks/Arrow.svelte +139 -0
- package/dist/marks/Arrow.svelte.d.ts +44 -0
- package/dist/marks/AxisX.svelte +198 -93
- package/dist/marks/AxisX.svelte.d.ts +17 -16
- package/dist/marks/AxisY.svelte +176 -62
- package/dist/marks/AxisY.svelte.d.ts +17 -14
- package/dist/marks/BarX.svelte +93 -0
- package/dist/marks/BarX.svelte.d.ts +4 -0
- package/dist/marks/BarY.svelte +103 -0
- package/dist/marks/BarY.svelte.d.ts +25 -0
- package/dist/marks/BollingerX.svelte +44 -0
- package/dist/marks/BollingerX.svelte.d.ts +18 -0
- package/dist/marks/BollingerY.svelte +39 -0
- package/dist/marks/BollingerY.svelte.d.ts +18 -0
- package/dist/marks/BoxX.svelte +89 -0
- package/dist/marks/BoxX.svelte.d.ts +4 -0
- package/dist/marks/BoxY.svelte +110 -0
- package/dist/marks/BoxY.svelte.d.ts +29 -0
- package/dist/marks/Cell.svelte +110 -0
- package/dist/marks/Cell.svelte.d.ts +16 -0
- package/dist/marks/CellX.svelte +24 -0
- package/dist/marks/CellX.svelte.d.ts +3 -0
- package/dist/marks/CellY.svelte +24 -0
- package/dist/marks/CellY.svelte.d.ts +3 -0
- package/dist/marks/ColorLegend.svelte +148 -27
- package/dist/marks/ColorLegend.svelte.d.ts +12 -13
- package/dist/marks/CustomMark.svelte +43 -0
- package/dist/marks/CustomMark.svelte.d.ts +16 -0
- package/dist/marks/CustomMarkHTML.svelte +103 -0
- package/dist/marks/CustomMarkHTML.svelte.d.ts +17 -0
- package/dist/marks/DifferenceY.svelte +144 -0
- package/dist/marks/DifferenceY.svelte.d.ts +30 -0
- package/dist/marks/Dot.svelte +128 -73
- package/dist/marks/Dot.svelte.d.ts +24 -14
- package/dist/marks/DotX.svelte +15 -3
- package/dist/marks/DotX.svelte.d.ts +8 -16
- package/dist/marks/DotY.svelte +8 -3
- package/dist/marks/DotY.svelte.d.ts +5 -17
- package/dist/marks/Frame.svelte +39 -31
- package/dist/marks/Frame.svelte.d.ts +7 -14
- package/dist/marks/Geo.svelte +102 -0
- package/dist/marks/Geo.svelte.d.ts +10 -0
- package/dist/marks/Graticule.svelte +28 -0
- package/dist/marks/Graticule.svelte.d.ts +9 -0
- package/dist/marks/GridX.svelte +67 -36
- package/dist/marks/GridX.svelte.d.ts +7 -18
- package/dist/marks/GridY.svelte +64 -25
- package/dist/marks/GridY.svelte.d.ts +7 -14
- package/dist/marks/HTMLTooltip.svelte +91 -0
- package/dist/marks/HTMLTooltip.svelte.d.ts +11 -0
- package/dist/marks/Line.svelte +219 -58
- package/dist/marks/Line.svelte.d.ts +30 -14
- package/dist/marks/LineX.svelte +8 -8
- package/dist/marks/LineX.svelte.d.ts +4 -17
- package/dist/marks/LineY.svelte +7 -8
- package/dist/marks/LineY.svelte.d.ts +4 -17
- package/dist/marks/Link.svelte +180 -0
- package/dist/marks/Link.svelte.d.ts +21 -0
- package/dist/marks/Pointer.svelte +126 -0
- package/dist/marks/Pointer.svelte.d.ts +23 -0
- package/dist/marks/Rect.svelte +103 -0
- package/dist/marks/Rect.svelte.d.ts +15 -0
- package/dist/marks/RectX.svelte +33 -0
- package/dist/marks/RectX.svelte.d.ts +15 -0
- package/dist/marks/RectY.svelte +33 -0
- package/dist/marks/RectY.svelte.d.ts +15 -0
- package/dist/marks/RegressionX.svelte +26 -0
- package/dist/marks/RegressionX.svelte.d.ts +4 -0
- package/dist/marks/RegressionY.svelte +26 -0
- package/dist/marks/RegressionY.svelte.d.ts +4 -0
- package/dist/marks/RuleX.svelte +52 -28
- package/dist/marks/RuleX.svelte.d.ts +14 -14
- package/dist/marks/RuleY.svelte +52 -28
- package/dist/marks/RuleY.svelte.d.ts +14 -14
- package/dist/marks/Sphere.svelte +8 -0
- package/dist/marks/Sphere.svelte.d.ts +51 -0
- package/dist/marks/Spike.svelte +15 -0
- package/dist/marks/Spike.svelte.d.ts +4 -0
- package/dist/marks/SymbolLegend.svelte +27 -12
- package/dist/marks/SymbolLegend.svelte.d.ts +8 -14
- package/dist/marks/Text.svelte +189 -0
- package/dist/marks/Text.svelte.d.ts +26 -0
- package/dist/marks/TickX.svelte +89 -0
- package/dist/marks/TickX.svelte.d.ts +22 -0
- package/dist/marks/TickY.svelte +90 -0
- package/dist/marks/TickY.svelte.d.ts +22 -0
- package/dist/marks/Vector.svelte +219 -0
- package/dist/marks/Vector.svelte.d.ts +31 -0
- package/dist/marks/helpers/BaseAxisX.svelte +210 -0
- package/dist/marks/helpers/BaseAxisX.svelte.d.ts +24 -0
- package/dist/marks/helpers/BaseAxisY.svelte +187 -0
- package/dist/marks/helpers/BaseAxisY.svelte.d.ts +23 -0
- package/dist/marks/helpers/CanvasLayer.svelte +38 -0
- package/dist/marks/helpers/CanvasLayer.svelte.d.ts +13 -0
- package/dist/marks/helpers/DotCanvas.svelte +184 -0
- package/dist/marks/helpers/DotCanvas.svelte.d.ts +11 -0
- package/dist/marks/helpers/GeoCanvas.svelte +165 -0
- package/dist/marks/helpers/GeoCanvas.svelte.d.ts +13 -0
- package/dist/marks/helpers/GroupMultiple.svelte +17 -0
- package/dist/marks/helpers/GroupMultiple.svelte.d.ts +9 -0
- package/dist/marks/helpers/Marker.svelte +93 -0
- package/dist/marks/helpers/Marker.svelte.d.ts +10 -0
- package/dist/marks/helpers/MarkerPath.svelte +141 -0
- package/dist/marks/helpers/MarkerPath.svelte.d.ts +44 -0
- package/dist/marks/helpers/Regression.svelte +174 -0
- package/dist/marks/helpers/Regression.svelte.d.ts +26 -0
- package/dist/marks/helpers/events.d.ts +8 -0
- package/dist/marks/helpers/events.js +74 -0
- package/dist/transforms/bin.d.ts +51 -0
- package/dist/transforms/bin.js +171 -0
- package/dist/transforms/bollinger.d.ts +21 -0
- package/dist/transforms/bollinger.js +53 -0
- package/dist/transforms/centroid.d.ts +9 -0
- package/dist/transforms/centroid.js +13 -0
- package/dist/transforms/facet.d.ts +1 -0
- package/dist/transforms/facet.js +1 -0
- package/dist/transforms/filter.d.ts +2 -0
- package/dist/transforms/filter.js +8 -0
- package/dist/transforms/group.d.ts +66 -0
- package/dist/transforms/group.js +109 -0
- package/dist/transforms/interval.d.ts +11 -0
- package/dist/transforms/interval.js +34 -0
- package/dist/transforms/jitter.d.ts +1 -0
- package/dist/transforms/jitter.js +1 -0
- package/dist/transforms/map.d.ts +10 -0
- package/dist/transforms/map.js +89 -0
- package/dist/transforms/normalize.d.ts +9 -0
- package/dist/transforms/normalize.js +86 -0
- package/dist/transforms/recordize.d.ts +15 -0
- package/dist/transforms/recordize.js +78 -0
- package/dist/transforms/rename.d.ts +14 -0
- package/dist/transforms/rename.js +42 -0
- package/dist/transforms/select.d.ts +35 -0
- package/dist/transforms/select.js +55 -0
- package/dist/transforms/shift.d.ts +13 -0
- package/dist/transforms/shift.js +45 -0
- package/dist/transforms/sort.d.ts +28 -0
- package/dist/transforms/sort.js +66 -0
- package/dist/transforms/stack.d.ts +10 -0
- package/dist/transforms/stack.js +110 -0
- package/dist/transforms/window.d.ts +24 -0
- package/dist/transforms/window.js +73 -0
- package/dist/types.d.ts +625 -188
- package/dist/ui/Checkbox.svelte +6 -0
- package/dist/ui/Checkbox.svelte.d.ts +13 -0
- package/dist/ui/RadioInput.svelte +27 -0
- package/dist/ui/RadioInput.svelte.d.ts +9 -0
- package/dist/ui/Select.svelte +27 -0
- package/dist/ui/Select.svelte.d.ts +9 -0
- package/dist/ui/Slider.svelte +47 -0
- package/dist/ui/Slider.svelte.d.ts +11 -0
- package/dist/ui/Spiral.svelte +46 -0
- package/dist/ui/Spiral.svelte.d.ts +15 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.js +4 -0
- package/package.json +81 -42
- package/LICENSE +0 -11
- package/dist/classes/Channel.svelte.js +0 -74
- package/dist/classes/Mark.svelte.js +0 -17
- package/dist/classes/Plot.svelte.js +0 -98
- package/dist/contants.d.ts +0 -3
- package/dist/contants.js +0 -40
- package/dist/helpers/GroupMultiple.svelte +0 -8
- package/dist/helpers/GroupMultiple.svelte.d.ts +0 -19
- package/dist/helpers/createScale.d.ts +0 -5
- package/dist/helpers/createScale.js +0 -57
- package/dist/helpers/resolveChannel.d.ts +0 -2
- package/dist/helpers/resolveChannel.js +0 -28
- package/dist/helpers/wrapArray.d.ts +0 -2
- package/dist/helpers/wrapArray.js +0 -4
- package/dist/marks/BaseMark.svelte +0 -22
- package/dist/marks/BaseMark.svelte.d.ts +0 -19
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { mapX, mapY } from './map.js';
|
|
2
|
+
import { min, max, mean, median, sum, deviation, extent } from 'd3-array';
|
|
3
|
+
export function normalizeX(args, basis) {
|
|
4
|
+
return mapX(args, normalize(basis));
|
|
5
|
+
}
|
|
6
|
+
export function normalizeY(args, basis) {
|
|
7
|
+
return mapY(args, normalize(basis));
|
|
8
|
+
}
|
|
9
|
+
function normalize(basis) {
|
|
10
|
+
if (basis === undefined)
|
|
11
|
+
return normalizeFirst;
|
|
12
|
+
if (typeof basis === 'function')
|
|
13
|
+
return normalizeBasis(basis);
|
|
14
|
+
// if (/^p\d{2}$/i.test(basis)) return normalizeAccessor(percentile(basis));
|
|
15
|
+
switch (`${basis}`.toLowerCase()) {
|
|
16
|
+
case 'deviation':
|
|
17
|
+
return normalizeDeviation;
|
|
18
|
+
case 'first':
|
|
19
|
+
return normalizeFirst;
|
|
20
|
+
case 'last':
|
|
21
|
+
return normalizeLast;
|
|
22
|
+
case 'max':
|
|
23
|
+
return normalizeMax;
|
|
24
|
+
case 'mean':
|
|
25
|
+
return normalizeMean;
|
|
26
|
+
case 'median':
|
|
27
|
+
return normalizeMedian;
|
|
28
|
+
case 'min':
|
|
29
|
+
return normalizeMin;
|
|
30
|
+
case 'sum':
|
|
31
|
+
return normalizeSum;
|
|
32
|
+
case 'extent':
|
|
33
|
+
return normalizeExtent;
|
|
34
|
+
}
|
|
35
|
+
throw new Error(`invalid basis: ${basis}`);
|
|
36
|
+
}
|
|
37
|
+
function normalizeBasis(basis) {
|
|
38
|
+
return {
|
|
39
|
+
mapIndex(I, S, T) {
|
|
40
|
+
const b = +basis(I, S);
|
|
41
|
+
for (const i of I) {
|
|
42
|
+
T[i] = S[i] === null ? NaN : S[i] / b;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function normalizeAccessor(f) {
|
|
48
|
+
return normalizeBasis((I, S) => f(I, (i) => S[i]));
|
|
49
|
+
}
|
|
50
|
+
const normalizeExtent = {
|
|
51
|
+
mapIndex(I, S, T) {
|
|
52
|
+
const [s1, s2] = extent(I, (i) => S[i]);
|
|
53
|
+
const d = s2 - s1;
|
|
54
|
+
for (const i of I) {
|
|
55
|
+
T[i] = S[i] === null ? NaN : (S[i] - s1) / d;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const normalizeFirst = normalizeBasis((I, S) => {
|
|
60
|
+
for (let i = 0; i < I.length; ++i) {
|
|
61
|
+
const s = S[I[i]];
|
|
62
|
+
if (s != null && isFinite(s))
|
|
63
|
+
return s;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const normalizeLast = normalizeBasis((I, S) => {
|
|
67
|
+
for (let i = I.length - 1; i >= 0; --i) {
|
|
68
|
+
const s = S[I[i]];
|
|
69
|
+
if (s != null && isFinite(s))
|
|
70
|
+
return s;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
const normalizeDeviation = {
|
|
74
|
+
mapIndex(I, S, T) {
|
|
75
|
+
const m = mean(I, (i) => S[i]);
|
|
76
|
+
const d = deviation(I, (i) => S[i]);
|
|
77
|
+
for (const i of I) {
|
|
78
|
+
T[i] = S[i] === null ? NaN : d ? (S[i] - m) / d : 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const normalizeMax = normalizeAccessor(max);
|
|
83
|
+
const normalizeMean = normalizeAccessor(mean);
|
|
84
|
+
const normalizeMedian = normalizeAccessor(median);
|
|
85
|
+
const normalizeMin = normalizeAccessor(min);
|
|
86
|
+
const normalizeSum = normalizeAccessor(sum);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TransformArgsRow, TransformArgsRecord } from '../types.js';
|
|
2
|
+
export declare const INDEX: unique symbol;
|
|
3
|
+
export declare const RAW_VALUE: unique symbol;
|
|
4
|
+
export declare function recordizeX({ data, ...channels }: TransformArgsRow, { withIndex }?: {
|
|
5
|
+
withIndex: boolean;
|
|
6
|
+
}): TransformArgsRecord;
|
|
7
|
+
export declare function recordizeY({ data, ...channels }: TransformArgsRow, { withIndex }?: {
|
|
8
|
+
withIndex: boolean;
|
|
9
|
+
}): TransformArgsRecord;
|
|
10
|
+
/**
|
|
11
|
+
* This transform is used to allow users to pass an [[x0, y0], [x1, y1], ...] array
|
|
12
|
+
* as dataset to marks that support it. It transforms the arrays into records, so
|
|
13
|
+
* the rest of our code doesn't have to deal with this case anymore.
|
|
14
|
+
*/
|
|
15
|
+
export declare function recordizeXY({ data, ...channels }: TransformArgsRow): TransformArgsRecord;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import isDataRecord from '../helpers/isDataRecord.js';
|
|
2
|
+
export const INDEX = Symbol('index');
|
|
3
|
+
export const RAW_VALUE = Symbol('originalValue');
|
|
4
|
+
/*
|
|
5
|
+
* This transform takes an array of raw values as input and returns data records
|
|
6
|
+
* in which the values are interpreted as x channel and their index as y
|
|
7
|
+
*/
|
|
8
|
+
export function recordizeX({ data, ...channels }, { withIndex } = { withIndex: true }) {
|
|
9
|
+
const dataIsRawValueArray = !isDataRecord(data[0]) && !Array.isArray(data[0]) && channels.x == null;
|
|
10
|
+
if (dataIsRawValueArray) {
|
|
11
|
+
return {
|
|
12
|
+
data: data.map((value, index) => ({
|
|
13
|
+
__value: value,
|
|
14
|
+
...(withIndex ? { __index: index } : {}),
|
|
15
|
+
[RAW_VALUE]: value,
|
|
16
|
+
___orig___: value
|
|
17
|
+
})),
|
|
18
|
+
...channels,
|
|
19
|
+
x: '__value',
|
|
20
|
+
...(withIndex ? { y: '__index' } : {})
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return { data: data, ...channels };
|
|
24
|
+
}
|
|
25
|
+
/*
|
|
26
|
+
* This transform takes an array of raw values as input and returns data records
|
|
27
|
+
* in which the values are interpreted as y channel and their index as yx
|
|
28
|
+
*/
|
|
29
|
+
export function recordizeY({ data, ...channels }, { withIndex } = { withIndex: true }) {
|
|
30
|
+
if (!data)
|
|
31
|
+
return { data, ...channels };
|
|
32
|
+
const dataIsRawValueArray = !isDataRecord(data[0]) && !Array.isArray(data[0]) && channels.y == null;
|
|
33
|
+
if (dataIsRawValueArray) {
|
|
34
|
+
return {
|
|
35
|
+
data: Array.from(data).map((value, index) => ({
|
|
36
|
+
...(withIndex ? { __index: index } : {}),
|
|
37
|
+
[RAW_VALUE]: value,
|
|
38
|
+
___orig___: value
|
|
39
|
+
})),
|
|
40
|
+
...channels,
|
|
41
|
+
...(withIndex ? { x: '__index' } : {}),
|
|
42
|
+
y: RAW_VALUE
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
data: Array.from(data).map((d, index) => ({
|
|
47
|
+
...d,
|
|
48
|
+
...(withIndex ? { __index: index } : {})
|
|
49
|
+
})),
|
|
50
|
+
x: '__index',
|
|
51
|
+
...channels
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* This transform is used to allow users to pass an [[x0, y0], [x1, y1], ...] array
|
|
56
|
+
* as dataset to marks that support it. It transforms the arrays into records, so
|
|
57
|
+
* the rest of our code doesn't have to deal with this case anymore.
|
|
58
|
+
*/
|
|
59
|
+
export function recordizeXY({ data, ...channels }) {
|
|
60
|
+
if (!data)
|
|
61
|
+
return { data, ...channels };
|
|
62
|
+
if (!isDataRecord(data[0]) &&
|
|
63
|
+
Array.isArray(data[0]) &&
|
|
64
|
+
channels.x === undefined &&
|
|
65
|
+
channels.y === undefined) {
|
|
66
|
+
return {
|
|
67
|
+
data: data.map(([x, y, ...rest]) => ({
|
|
68
|
+
[RAW_VALUE]: [x, y, ...rest],
|
|
69
|
+
__x: x,
|
|
70
|
+
__y: y
|
|
71
|
+
})),
|
|
72
|
+
...channels,
|
|
73
|
+
x: '__x',
|
|
74
|
+
y: '__y'
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return { data, ...channels };
|
|
78
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DataRecord } from '../types.js';
|
|
2
|
+
import type { ScaledChannelName, TransformArg } from '../types.js';
|
|
3
|
+
type RenameChannelsOptions = Partial<Record<ScaledChannelName, ScaledChannelName>>;
|
|
4
|
+
type ReplaceChannelsOptions = Partial<Record<ScaledChannelName, ScaledChannelName[]>>;
|
|
5
|
+
/**
|
|
6
|
+
* renames a channel without modifying the data
|
|
7
|
+
*/
|
|
8
|
+
export declare function renameChannels<T>({ data, ...channels }: TransformArg<T, DataRecord>, options: RenameChannelsOptions): TransformArg<T, DataRecord>;
|
|
9
|
+
/**
|
|
10
|
+
* renames a channel and copy the data
|
|
11
|
+
*/
|
|
12
|
+
export declare function renameChannelsAndData<T>({ data, ...channels }: TransformArg<T, DataRecord>, options: RenameChannelsOptions): TransformArg<T, DataRecord>;
|
|
13
|
+
export declare function replaceChannels<T>({ data, ...channels }: TransformArg<T, DataRecord>, options: ReplaceChannelsOptions): TransformArg<T, DataRecord>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* renames a channel without modifying the data
|
|
3
|
+
*/
|
|
4
|
+
export function renameChannels({ data, ...channels }, options) {
|
|
5
|
+
const newChannels = channels;
|
|
6
|
+
for (const [from, to] of Object.entries(options)) {
|
|
7
|
+
if (newChannels[from] !== undefined) {
|
|
8
|
+
newChannels[to] = newChannels[from];
|
|
9
|
+
delete newChannels[from];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return { data, ...newChannels };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* renames a channel and copy the data
|
|
16
|
+
*/
|
|
17
|
+
export function renameChannelsAndData({ data, ...channels }, options) {
|
|
18
|
+
const newData = [];
|
|
19
|
+
for (const datum of data) {
|
|
20
|
+
const newDatum = { ...datum };
|
|
21
|
+
for (const [from, to] of Object.entries(options)) {
|
|
22
|
+
if (channels[from] !== undefined) {
|
|
23
|
+
newDatum[to] = newDatum[from];
|
|
24
|
+
delete newDatum[from];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
newData.push(newDatum);
|
|
28
|
+
}
|
|
29
|
+
return renameChannels({ data: newData, ...channels }, options);
|
|
30
|
+
}
|
|
31
|
+
export function replaceChannels({ data, ...channels }, options) {
|
|
32
|
+
const newChannels = { ...channels };
|
|
33
|
+
for (const [from, to] of Object.entries(options)) {
|
|
34
|
+
if (newChannels[from] !== undefined) {
|
|
35
|
+
for (const t of to) {
|
|
36
|
+
newChannels[t] = newChannels[from];
|
|
37
|
+
}
|
|
38
|
+
delete newChannels[from];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return { data, ...newChannels };
|
|
42
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ChannelName, DataRecord, TransformArg } from '../types.js';
|
|
2
|
+
type AtLeastOne<T, U = {
|
|
3
|
+
[K in keyof T]: Pick<T, K>;
|
|
4
|
+
}> = Partial<T> & U[keyof U];
|
|
5
|
+
type SelectOptions = 'first' | 'last' | AtLeastOne<{
|
|
6
|
+
[k in ChannelName]: 'min' | 'max';
|
|
7
|
+
}>;
|
|
8
|
+
export declare function select({ data, ...channels }: TransformArg<DataRecord>, options: SelectOptions): {
|
|
9
|
+
data: DataRecord[];
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Keeps only the first item of each group
|
|
13
|
+
*/
|
|
14
|
+
export declare function selectFirst(args: TransformArg<DataRecord>): {
|
|
15
|
+
data: DataRecord[];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Keeps only the last item of each group
|
|
19
|
+
*/
|
|
20
|
+
export declare function selectLast(args: TransformArg<DataRecord>): {
|
|
21
|
+
data: DataRecord[];
|
|
22
|
+
};
|
|
23
|
+
export declare function selectMinX(args: TransformArg<DataRecord>): {
|
|
24
|
+
data: DataRecord[];
|
|
25
|
+
};
|
|
26
|
+
export declare function selectMaxX(args: TransformArg<DataRecord>): {
|
|
27
|
+
data: DataRecord[];
|
|
28
|
+
};
|
|
29
|
+
export declare function selectMinY(args: TransformArg<DataRecord>): {
|
|
30
|
+
data: DataRecord[];
|
|
31
|
+
};
|
|
32
|
+
export declare function selectMaxY(args: TransformArg<DataRecord>): {
|
|
33
|
+
data: DataRecord[];
|
|
34
|
+
};
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { groupFacetsAndZ } from '../helpers/group.js';
|
|
2
|
+
import { resolveChannel } from '../helpers/resolve.js';
|
|
3
|
+
// let o: SelectOptions = { x: 'min'};
|
|
4
|
+
export function select({ data, ...channels }, options) {
|
|
5
|
+
const newData = [];
|
|
6
|
+
groupFacetsAndZ(data, channels, (items) => {
|
|
7
|
+
if (typeof options === 'string') {
|
|
8
|
+
if (options !== 'first' && options !== 'last')
|
|
9
|
+
throw new Error('unknown sort option: ' + options);
|
|
10
|
+
newData.push(options === 'first' ? items[0] : items.at(-1));
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
const sortOptions = Object.entries(options);
|
|
14
|
+
if (!sortOptions.length)
|
|
15
|
+
throw new Error('must provide the channel to sort by');
|
|
16
|
+
if (sortOptions.length > 1)
|
|
17
|
+
throw new Error('cannot sort by more than one channel');
|
|
18
|
+
if (sortOptions[0][1] !== 'min' && sortOptions[0][1] !== 'max')
|
|
19
|
+
throw new Error('unknown sort option: ' + sortOptions[0][1]);
|
|
20
|
+
const selected = items
|
|
21
|
+
.map((item) => ({
|
|
22
|
+
...item,
|
|
23
|
+
__sortby: resolveChannel(sortOptions[0][0], item, channels)
|
|
24
|
+
}))
|
|
25
|
+
.sort((a, b) => (a.__sortby > b.__sortby ? 1 : a.__sortby < b.__sortby ? -1 : 0))
|
|
26
|
+
.at(sortOptions[0][1] === 'min' ? 0 : -1);
|
|
27
|
+
newData.push(selected);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
return { data: newData, ...channels };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Keeps only the first item of each group
|
|
34
|
+
*/
|
|
35
|
+
export function selectFirst(args) {
|
|
36
|
+
return select(args, 'first');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Keeps only the last item of each group
|
|
40
|
+
*/
|
|
41
|
+
export function selectLast(args) {
|
|
42
|
+
return select(args, 'last');
|
|
43
|
+
}
|
|
44
|
+
export function selectMinX(args) {
|
|
45
|
+
return select(args, { x: 'min' });
|
|
46
|
+
}
|
|
47
|
+
export function selectMaxX(args) {
|
|
48
|
+
return select(args, { x: 'max' });
|
|
49
|
+
}
|
|
50
|
+
export function selectMinY(args) {
|
|
51
|
+
return select(args, { y: 'min' });
|
|
52
|
+
}
|
|
53
|
+
export function selectMaxY(args) {
|
|
54
|
+
return select(args, { y: 'max' });
|
|
55
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DataRecord, TransformArg } from '../types.js';
|
|
2
|
+
type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> & {
|
|
3
|
+
[K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
|
|
4
|
+
}[Keys];
|
|
5
|
+
type ShiftXOptions = {
|
|
6
|
+
[key in 'x' | 'x1' | 'x2']: string | number;
|
|
7
|
+
};
|
|
8
|
+
export declare function shiftX({ data, ...channels }: TransformArg<DataRecord>, shiftBy: string | number | RequireAtLeastOne<ShiftXOptions>): TransformArg<DataRecord>;
|
|
9
|
+
type ShiftYOptions = {
|
|
10
|
+
[key in 'y' | 'y1' | 'y2']: string | number;
|
|
11
|
+
};
|
|
12
|
+
export declare function shiftY({ data, ...channels }: TransformArg<DataRecord>, shiftBy: string | number | RequireAtLeastOne<ShiftYOptions>): TransformArg<DataRecord>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { resolveChannel } from '../helpers/resolve.js';
|
|
2
|
+
import { maybeTimeInterval } from '../helpers/time.js';
|
|
3
|
+
export function shiftX({ data, ...channels }, shiftBy) {
|
|
4
|
+
if (typeof shiftBy === 'number' || typeof shiftBy === 'string') {
|
|
5
|
+
shiftBy = { x: shiftBy };
|
|
6
|
+
}
|
|
7
|
+
if (shiftBy) {
|
|
8
|
+
if (shiftBy)
|
|
9
|
+
return shiftChannels('x', shiftBy, { data, ...channels });
|
|
10
|
+
}
|
|
11
|
+
return { data, ...channels };
|
|
12
|
+
}
|
|
13
|
+
export function shiftY({ data, ...channels }, shiftBy) {
|
|
14
|
+
if (typeof shiftBy === 'number' || typeof shiftBy === 'string') {
|
|
15
|
+
shiftBy = { y: shiftBy };
|
|
16
|
+
}
|
|
17
|
+
if (shiftBy)
|
|
18
|
+
return shiftChannels('y', shiftBy, { data, ...channels });
|
|
19
|
+
return { data, ...channels };
|
|
20
|
+
}
|
|
21
|
+
function shiftChannels(shiftDim, shiftBy, { data, ...channels }) {
|
|
22
|
+
return {
|
|
23
|
+
data: data.map((d) => {
|
|
24
|
+
const newRow = { ...d };
|
|
25
|
+
for (const [channel, shift] of Object.entries(shiftBy)) {
|
|
26
|
+
const shiftFrom = (channels[channel] != null ? channel : shiftDim);
|
|
27
|
+
if (typeof shift === 'number') {
|
|
28
|
+
newRow[`__shift_${channel}`] =
|
|
29
|
+
resolveChannel(shiftFrom, d, channels) + shift;
|
|
30
|
+
}
|
|
31
|
+
else if (typeof shift === 'string') {
|
|
32
|
+
const [, sign, value, unit] = shift.match(/^([+-])?(\d+)? ?([a-z]+)$/);
|
|
33
|
+
const step = (sign === '-' ? -1 : 1) * (value || 1);
|
|
34
|
+
const interval = maybeTimeInterval(unit);
|
|
35
|
+
if (!interval)
|
|
36
|
+
throw new Error(`Invalid shift interval: ${shift}`);
|
|
37
|
+
newRow[`__shift_${channel}`] = interval.offset(resolveChannel(shiftFrom, d, channels), step);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return newRow;
|
|
41
|
+
}),
|
|
42
|
+
...channels,
|
|
43
|
+
...Object.fromEntries(Object.keys(shiftBy).map((key) => [key, `__shift_${key}`]))
|
|
44
|
+
};
|
|
45
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DataRecord, DataRow, TransformArg } from '../types.js';
|
|
2
|
+
export declare const SORT_KEY: unique symbol;
|
|
3
|
+
export declare function sort({ data, ...channels }: TransformArg<DataRecord>, options?: {
|
|
4
|
+
reverse?: boolean;
|
|
5
|
+
}): {
|
|
6
|
+
sort: null;
|
|
7
|
+
data: {
|
|
8
|
+
___orig___?: import("../types.js").RawValue | [import("../types.js").RawValue, import("../types.js").RawValue];
|
|
9
|
+
}[];
|
|
10
|
+
} | {
|
|
11
|
+
data: DataRecord[];
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* reverses the data row order
|
|
15
|
+
*/
|
|
16
|
+
export declare function shuffle({ data, ...channels }: TransformArg<DataRow[]>, options?: {
|
|
17
|
+
seed?: number;
|
|
18
|
+
}): {
|
|
19
|
+
sort: null;
|
|
20
|
+
data: DataRow[][];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* reverses the data row order
|
|
24
|
+
*/
|
|
25
|
+
export declare function reverse({ data, ...channels }: TransformArg<DataRow[]>): {
|
|
26
|
+
sort: null;
|
|
27
|
+
data: DataRow[][];
|
|
28
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import isDataRecord from '../helpers/isDataRecord.js';
|
|
2
|
+
import { resolveChannel } from '../helpers/resolve.js';
|
|
3
|
+
import { shuffler } from 'd3-array';
|
|
4
|
+
import { randomLcg } from 'd3-random';
|
|
5
|
+
export const SORT_KEY = Symbol('sortKey');
|
|
6
|
+
export function sort({ data, ...channels }, options = {}) {
|
|
7
|
+
if (!Array.isArray(data))
|
|
8
|
+
return { data, ...channels };
|
|
9
|
+
if (channels.sort) {
|
|
10
|
+
const { sort } = channels;
|
|
11
|
+
if (isDataRecord(sort) &&
|
|
12
|
+
typeof sort.channel === 'string' &&
|
|
13
|
+
sort.channel.charAt(0) === '-') {
|
|
14
|
+
sort.channel = sort.channel.substring(1);
|
|
15
|
+
sort.order = 'descending';
|
|
16
|
+
}
|
|
17
|
+
// sort data
|
|
18
|
+
return {
|
|
19
|
+
data: data
|
|
20
|
+
.map((d) => ({
|
|
21
|
+
...d,
|
|
22
|
+
[SORT_KEY]: resolveChannel('sort', d, { ...channels, sort })
|
|
23
|
+
}))
|
|
24
|
+
.toSorted((a, b) => (a[SORT_KEY] > b[SORT_KEY] ? 1 : a[SORT_KEY] < b[SORT_KEY] ? -1 : 0) *
|
|
25
|
+
(options.reverse || (isDataRecord(sort) && sort?.order === 'descending')
|
|
26
|
+
? -1
|
|
27
|
+
: 1))
|
|
28
|
+
.map(({ [SORT_KEY]: a, ...rest }) => rest),
|
|
29
|
+
...channels,
|
|
30
|
+
// set the sort channel to null to disable the implicit alphabetical
|
|
31
|
+
// ordering of ordinal domains, and also to avoid double sorting in case
|
|
32
|
+
// this transform is used "outside" a mark
|
|
33
|
+
sort: null
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
data,
|
|
38
|
+
...channels
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* reverses the data row order
|
|
43
|
+
*/
|
|
44
|
+
export function shuffle({ data, ...channels }, options = {}) {
|
|
45
|
+
const random = randomLcg(options.seed);
|
|
46
|
+
const shuffle = shuffler(random);
|
|
47
|
+
return {
|
|
48
|
+
data: shuffle([...data]),
|
|
49
|
+
...channels,
|
|
50
|
+
// set the sort channel to null to disable the implicit
|
|
51
|
+
// alphabetical ordering of ordinal domains
|
|
52
|
+
sort: null
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* reverses the data row order
|
|
57
|
+
*/
|
|
58
|
+
export function reverse({ data, ...channels }) {
|
|
59
|
+
return {
|
|
60
|
+
data: data.toReversed(),
|
|
61
|
+
...channels,
|
|
62
|
+
// set the sort channel to null to disable the implicit
|
|
63
|
+
// alphabetical ordering of ordinal domains
|
|
64
|
+
sort: null
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TransformArg } from '../types.js';
|
|
2
|
+
export type StackOrder = 'none' | 'appearance' | 'inside-out' | 'sum';
|
|
3
|
+
export type StackOffset = 'none' | 'wiggle' | 'center' | 'normalize' | 'diverging';
|
|
4
|
+
export type StackOptions = {
|
|
5
|
+
offset: null | StackOffset;
|
|
6
|
+
order: null | StackOrder;
|
|
7
|
+
reverse: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function stackY<T>({ data, ...channels }: T, opts?: Partial<StackOptions>): T;
|
|
10
|
+
export declare function stackX({ data, ...channels }: TransformArg, opts?: Partial<StackOptions>): TransformArg;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import isDataRecord from '../helpers/isDataRecord.js';
|
|
2
|
+
import { resolveChannel } from '../helpers/resolve.js';
|
|
3
|
+
import { stack, stackOffsetExpand, stackOffsetSilhouette, stackOffsetWiggle, stackOrderAppearance, stackOrderAscending, stackOrderInsideOut, stackOrderNone, stackOffsetDiverging } from 'd3-shape';
|
|
4
|
+
import { index, union, groups as d3Groups } from 'd3-array';
|
|
5
|
+
const DEFAULT_STACK_OPTIONS = {
|
|
6
|
+
order: null,
|
|
7
|
+
offset: null,
|
|
8
|
+
reverse: false
|
|
9
|
+
};
|
|
10
|
+
const STACK_ORDER = {
|
|
11
|
+
// null
|
|
12
|
+
// TODO: value: ,
|
|
13
|
+
none: stackOrderNone,
|
|
14
|
+
sum: stackOrderAscending,
|
|
15
|
+
appearance: stackOrderAppearance,
|
|
16
|
+
'inside-out': stackOrderInsideOut
|
|
17
|
+
};
|
|
18
|
+
const STACK_OFFSET = {
|
|
19
|
+
none: null,
|
|
20
|
+
diverging: stackOffsetDiverging,
|
|
21
|
+
wiggle: stackOffsetWiggle,
|
|
22
|
+
center: stackOffsetSilhouette,
|
|
23
|
+
normalize: stackOffsetExpand
|
|
24
|
+
};
|
|
25
|
+
function stackXY(byDim, data, channels, options) {
|
|
26
|
+
// we need to stack the data for each facet separately
|
|
27
|
+
const groupFacetsBy = [
|
|
28
|
+
channels.fx != null ? 'fx' : null,
|
|
29
|
+
channels.fy != null ? 'fy' : null
|
|
30
|
+
].filter((d) => d !== null);
|
|
31
|
+
const groupBy = channels.z ? 'z' : channels.fill ? 'fill' : channels.stroke ? 'stroke' : true;
|
|
32
|
+
const secondDim = byDim === 'x' ? (channels.y1 != null ? 'y1' : 'y') : channels.x1 != null ? 'x1' : 'x';
|
|
33
|
+
const byLow = `${byDim}1`;
|
|
34
|
+
const byHigh = `${byDim}2`;
|
|
35
|
+
if (channels[byDim] != null &&
|
|
36
|
+
channels[`${byLow}`] === undefined &&
|
|
37
|
+
channels[`${byHigh}`] === undefined) {
|
|
38
|
+
// resolve all channels for easier computation below
|
|
39
|
+
const resolvedData = data.map((d) => ({
|
|
40
|
+
...(isDataRecord(d) ? d : { __orig: d }),
|
|
41
|
+
[`__${secondDim}`]: resolveChannel(secondDim, d, channels),
|
|
42
|
+
__group: groupBy === true ? 'G' : resolveChannel(groupBy, d, channels),
|
|
43
|
+
__facet: groupFacetsBy.length > 0
|
|
44
|
+
? groupFacetsBy
|
|
45
|
+
.map((channel) => String(resolveChannel(channel, d, channels)))
|
|
46
|
+
.join('---')
|
|
47
|
+
: 'F',
|
|
48
|
+
[`__${byDim}`]: resolveChannel(byDim, d, channels)
|
|
49
|
+
}));
|
|
50
|
+
// the final data ends up here
|
|
51
|
+
const out = [];
|
|
52
|
+
// first we group the dataset by facets to avoid stacking of rows that are
|
|
53
|
+
// in separate panels
|
|
54
|
+
const groups = d3Groups(resolvedData, (d) => d.__facet);
|
|
55
|
+
for (const [, facetData] of groups) {
|
|
56
|
+
// now we index the data on the second dimension, e.g. over x
|
|
57
|
+
// when stacking over y
|
|
58
|
+
const indexed = index(facetData, (d) => d[`__${secondDim}`], (d) => d.__group);
|
|
59
|
+
const stackOrder = (series) => {
|
|
60
|
+
const f = STACK_ORDER[options.order || 'none'];
|
|
61
|
+
return options.reverse ? f(series).reverse() : f(series);
|
|
62
|
+
};
|
|
63
|
+
// now stack the values for each index
|
|
64
|
+
const series = stack()
|
|
65
|
+
.order(stackOrder)
|
|
66
|
+
.offset(STACK_OFFSET[options.offset])
|
|
67
|
+
.keys(union(facetData.map((d) => d.__group)))
|
|
68
|
+
.value(([, group], key) => (group.get(key) ? group.get(key)[`__${byDim}`] : 0))(indexed);
|
|
69
|
+
// and combine it all back into a flat array
|
|
70
|
+
const newData = series
|
|
71
|
+
.map((values) => {
|
|
72
|
+
const groupKey = values.key;
|
|
73
|
+
return values
|
|
74
|
+
.filter((d) => d.data[1].get(groupKey))
|
|
75
|
+
.map((d) => {
|
|
76
|
+
const datum = d.data[1].get(groupKey);
|
|
77
|
+
// cleanup our internal keys
|
|
78
|
+
delete datum.__group;
|
|
79
|
+
delete datum.__facet;
|
|
80
|
+
return { ...datum, [`__${byLow}`]: d[0], [`__${byHigh}`]: d[1] };
|
|
81
|
+
});
|
|
82
|
+
})
|
|
83
|
+
.flat(1);
|
|
84
|
+
// which we then add to the output data
|
|
85
|
+
out.push(newData);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
data: out.flat(1),
|
|
89
|
+
...channels,
|
|
90
|
+
[byDim]: undefined,
|
|
91
|
+
...(typeof channels[byDim] === 'string' && !channels[`__${byDim}_origField`]
|
|
92
|
+
? { [`__${byDim}_origField`]: channels[byDim] }
|
|
93
|
+
: {}),
|
|
94
|
+
...{ [byLow]: `__${byLow}`, [byHigh]: `__${byHigh}` }
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return { data, ...channels };
|
|
98
|
+
}
|
|
99
|
+
export function stackY({ data, ...channels }, opts = {}) {
|
|
100
|
+
return stackXY('y', data, channels, applyDefaults(opts));
|
|
101
|
+
}
|
|
102
|
+
export function stackX({ data, ...channels }, opts = {}) {
|
|
103
|
+
return stackXY('x', data, channels, applyDefaults(opts));
|
|
104
|
+
}
|
|
105
|
+
function applyDefaults(opts) {
|
|
106
|
+
if (opts.offset === 'wiggle' && opts.order === undefined) {
|
|
107
|
+
return { ...DEFAULT_STACK_OPTIONS, order: 'inside-out', ...opts };
|
|
108
|
+
}
|
|
109
|
+
return { ...DEFAULT_STACK_OPTIONS, ...opts };
|
|
110
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ReducerName } from '../helpers/reduce.js';
|
|
2
|
+
import type { DataRecord, TransformArg } from '../types.js';
|
|
3
|
+
type WindowOptions = {
|
|
4
|
+
k: number;
|
|
5
|
+
interval: string;
|
|
6
|
+
anchor: 'start' | 'middle' | 'end';
|
|
7
|
+
reduce: ReducerName;
|
|
8
|
+
strict: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function windowX(args: TransformArg<DataRecord>, options: WindowOptions): {
|
|
11
|
+
data: {
|
|
12
|
+
[x: string]: import("../types.js").RawValue;
|
|
13
|
+
[x: symbol]: import("../types.js").RawValue;
|
|
14
|
+
___orig___?: import("../types.js").RawValue | [import("../types.js").RawValue, import("../types.js").RawValue];
|
|
15
|
+
}[];
|
|
16
|
+
};
|
|
17
|
+
export declare function windowY(args: TransformArg<DataRecord>, options: WindowOptions): {
|
|
18
|
+
data: {
|
|
19
|
+
[x: string]: import("../types.js").RawValue;
|
|
20
|
+
[x: symbol]: import("../types.js").RawValue;
|
|
21
|
+
___orig___?: import("../types.js").RawValue | [import("../types.js").RawValue, import("../types.js").RawValue];
|
|
22
|
+
}[];
|
|
23
|
+
};
|
|
24
|
+
export {};
|