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,93 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
For horizontal bar charts using a band scale as y axis
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import Mark from '../Mark.svelte';
|
|
7
|
+
import { getContext } from 'svelte';
|
|
8
|
+
import { stackX, recordizeX, intervalX, sort } from '../index.js';
|
|
9
|
+
import { resolveProp, resolveStyles } from '../helpers/resolve.js';
|
|
10
|
+
import { roundedRect } from '../helpers/roundedRect.js';
|
|
11
|
+
import type { PlotContext, BaseMarkProps, RectMarkProps, ChannelAccessor } from '../types.js';
|
|
12
|
+
import type { StackOptions } from '../transforms/stack.js';
|
|
13
|
+
import type { DataRow } from '../types.js';
|
|
14
|
+
import { addEventHandlers } from './helpers/events.js';
|
|
15
|
+
import GroupMultiple from './helpers/GroupMultiple.svelte';
|
|
16
|
+
|
|
17
|
+
type BarXProps = BaseMarkProps & {
|
|
18
|
+
data: DataRow[];
|
|
19
|
+
x?: ChannelAccessor;
|
|
20
|
+
x1?: ChannelAccessor;
|
|
21
|
+
x2?: ChannelAccessor;
|
|
22
|
+
y?: ChannelAccessor;
|
|
23
|
+
stack?: StackOptions;
|
|
24
|
+
borderRadius?:
|
|
25
|
+
| number
|
|
26
|
+
| {
|
|
27
|
+
topLeft?: number;
|
|
28
|
+
topRight?: number;
|
|
29
|
+
bottomRight?: number;
|
|
30
|
+
bottomLeft?: number;
|
|
31
|
+
};
|
|
32
|
+
} & RectMarkProps;
|
|
33
|
+
|
|
34
|
+
let { data = [{}], class: className = null, stack, ...options }: BarXProps = $props();
|
|
35
|
+
|
|
36
|
+
const { getPlotState } = getContext<PlotContext>('svelteplot');
|
|
37
|
+
const plot = $derived(getPlotState());
|
|
38
|
+
|
|
39
|
+
const args = $derived(
|
|
40
|
+
stackX(
|
|
41
|
+
intervalX(
|
|
42
|
+
// by default, sort by y channel (the ordinal labels)
|
|
43
|
+
sort(recordizeX({ data, sort: { channel: 'y' }, ...options })),
|
|
44
|
+
{ plot }
|
|
45
|
+
),
|
|
46
|
+
stack
|
|
47
|
+
)
|
|
48
|
+
);
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<Mark
|
|
52
|
+
type="barX"
|
|
53
|
+
requiredScales={{ y: ['band'] }}
|
|
54
|
+
channels={['x1', 'x2', 'y', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity']}
|
|
55
|
+
{...args}>
|
|
56
|
+
{#snippet children({ mark, usedScales, scaledData })}
|
|
57
|
+
<GroupMultiple class="bar-x" length={scaledData.length}>
|
|
58
|
+
{#each scaledData as d}
|
|
59
|
+
{@const bw = plot.scales.y.fn.bandwidth()}
|
|
60
|
+
{@const minx = Math.min(d.x1, d.x2)}
|
|
61
|
+
{@const maxx = Math.max(d.x1, d.x2)}
|
|
62
|
+
{@const insetLeft = resolveProp(args.insetLeft, d.datum, 0)}
|
|
63
|
+
{@const insetRight = resolveProp(args.insetRight, d.datum, 0)}
|
|
64
|
+
{@const insetTop = resolveProp(args.insetTop || args.inset, d.datum, 0)}
|
|
65
|
+
{@const insetBottom = resolveProp(args.insetBottom || args.inset, d.datum, 0)}
|
|
66
|
+
{@const dx = resolveProp(args.dx, d.datum, 0)}
|
|
67
|
+
{@const dy = resolveProp(args.dy, d.datum, 0)}
|
|
68
|
+
{#if d.valid}
|
|
69
|
+
{@const [style, styleClass] = resolveStyles(plot, d, args, 'fill', usedScales)}
|
|
70
|
+
<path
|
|
71
|
+
d={roundedRect(
|
|
72
|
+
0,
|
|
73
|
+
0,
|
|
74
|
+
maxx - minx - insetLeft - insetRight,
|
|
75
|
+
bw - insetTop - insetBottom,
|
|
76
|
+
options.borderRadius
|
|
77
|
+
)}
|
|
78
|
+
class={[styleClass, className]}
|
|
79
|
+
{style}
|
|
80
|
+
transform="translate({[
|
|
81
|
+
minx + dx + insetLeft,
|
|
82
|
+
d.y + insetTop + dy - bw * 0.5
|
|
83
|
+
]})"
|
|
84
|
+
use:addEventHandlers={{
|
|
85
|
+
getPlotState,
|
|
86
|
+
options: args,
|
|
87
|
+
datum: d.datum
|
|
88
|
+
}} />
|
|
89
|
+
{/if}
|
|
90
|
+
{/each}
|
|
91
|
+
</GroupMultiple>
|
|
92
|
+
{/snippet}
|
|
93
|
+
</Mark>
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
For vertical column charts using a band scale as x axis
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import Mark from '../Mark.svelte';
|
|
7
|
+
import { getContext } from 'svelte';
|
|
8
|
+
import { intervalY, stackY, recordizeY, sort } from '../index.js';
|
|
9
|
+
import { resolveProp, resolveStyles } from '../helpers/resolve.js';
|
|
10
|
+
import { roundedRect } from '../helpers/roundedRect.js';
|
|
11
|
+
import {
|
|
12
|
+
type PlotContext,
|
|
13
|
+
type BaseMarkProps,
|
|
14
|
+
type ChannelAccessor,
|
|
15
|
+
type DataRow
|
|
16
|
+
} from '../types.js';
|
|
17
|
+
import type { StackOptions } from '../transforms/stack.js';
|
|
18
|
+
import { maybeData } from '../helpers/index.js';
|
|
19
|
+
import { addEventHandlers } from './helpers/events.js';
|
|
20
|
+
import GroupMultiple from './helpers/GroupMultiple.svelte';
|
|
21
|
+
|
|
22
|
+
type BarYProps = BaseMarkProps & {
|
|
23
|
+
data: DataRow[];
|
|
24
|
+
x?: ChannelAccessor;
|
|
25
|
+
y?: ChannelAccessor;
|
|
26
|
+
y1?: ChannelAccessor;
|
|
27
|
+
y2?: ChannelAccessor;
|
|
28
|
+
stack?: StackOptions;
|
|
29
|
+
/**
|
|
30
|
+
* Converts y into y1/y2 ranges based on the provided interval. Disables the
|
|
31
|
+
* implicit stacking
|
|
32
|
+
*/
|
|
33
|
+
interval?: number | string;
|
|
34
|
+
borderRadius?:
|
|
35
|
+
| number
|
|
36
|
+
| {
|
|
37
|
+
topLeft?: number;
|
|
38
|
+
topRight?: number;
|
|
39
|
+
bottomRight?: number;
|
|
40
|
+
bottomLeft?: number;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
let { data = [{}], class: className = null, stack, ...options }: BarYProps = $props();
|
|
45
|
+
|
|
46
|
+
const { getPlotState } = getContext<PlotContext>('svelteplot');
|
|
47
|
+
const plot = $derived(getPlotState());
|
|
48
|
+
|
|
49
|
+
const args = $derived(
|
|
50
|
+
stackY(
|
|
51
|
+
intervalY(
|
|
52
|
+
// by default, sort by x channel (the ordinal labels)
|
|
53
|
+
sort(recordizeY({ data, sort: { channel: 'x' }, ...options })),
|
|
54
|
+
{ plot }
|
|
55
|
+
),
|
|
56
|
+
stack
|
|
57
|
+
)
|
|
58
|
+
);
|
|
59
|
+
</script>
|
|
60
|
+
|
|
61
|
+
<Mark
|
|
62
|
+
type="barY"
|
|
63
|
+
requiredScales={{ x: ['band'] }}
|
|
64
|
+
channels={['x', 'y1', 'y2', 'fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity']}
|
|
65
|
+
{...args}>
|
|
66
|
+
{#snippet children({ mark, scaledData, usedScales })}
|
|
67
|
+
<GroupMultiple class="bar-y" length={scaledData.length}>
|
|
68
|
+
{#each scaledData as d}
|
|
69
|
+
{@const bw = plot.scales.x.fn.bandwidth()}
|
|
70
|
+
{@const miny = Math.min(d.y1, d.y2)}
|
|
71
|
+
{@const maxy = Math.max(d.y1, d.y2)}
|
|
72
|
+
{@const insetLeft = resolveProp(args.insetLeft || args.inset, d.datum, 0)}
|
|
73
|
+
{@const insetRight = resolveProp(args.insetRight || args.inset, d.datum, 0)}
|
|
74
|
+
{@const insetTop = resolveProp(args.insetTop, d.datum, 0)}
|
|
75
|
+
{@const insetBottom = resolveProp(args.insetBottom, d.datum, 0)}
|
|
76
|
+
{@const dx = resolveProp(args.dx, d.datum, 0)}
|
|
77
|
+
{@const dy = resolveProp(args.dy, d.datum, 0)}
|
|
78
|
+
{#if d.valid}
|
|
79
|
+
{@const [style, styleClass] = resolveStyles(plot, d, args, 'fill', usedScales)}
|
|
80
|
+
<path
|
|
81
|
+
d={roundedRect(
|
|
82
|
+
0,
|
|
83
|
+
0,
|
|
84
|
+
bw - insetLeft - insetRight,
|
|
85
|
+
maxy - miny - insetTop - insetBottom,
|
|
86
|
+
options.borderRadius
|
|
87
|
+
)}
|
|
88
|
+
class={[styleClass, className]}
|
|
89
|
+
{style}
|
|
90
|
+
transform="translate({[
|
|
91
|
+
d.x + insetLeft + dx - bw * 0.5,
|
|
92
|
+
miny + dy + insetTop
|
|
93
|
+
]})"
|
|
94
|
+
use:addEventHandlers={{
|
|
95
|
+
getPlotState,
|
|
96
|
+
options: args,
|
|
97
|
+
datum: d.datum
|
|
98
|
+
}} />
|
|
99
|
+
{/if}
|
|
100
|
+
{/each}
|
|
101
|
+
</GroupMultiple>
|
|
102
|
+
{/snippet}
|
|
103
|
+
</Mark>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type BaseMarkProps, type ChannelAccessor, type DataRow } from '../types.js';
|
|
2
|
+
import type { StackOptions } from '../transforms/stack.js';
|
|
3
|
+
type BarYProps = BaseMarkProps & {
|
|
4
|
+
data: DataRow[];
|
|
5
|
+
x?: ChannelAccessor;
|
|
6
|
+
y?: ChannelAccessor;
|
|
7
|
+
y1?: ChannelAccessor;
|
|
8
|
+
y2?: ChannelAccessor;
|
|
9
|
+
stack?: StackOptions;
|
|
10
|
+
/**
|
|
11
|
+
* Converts y into y1/y2 ranges based on the provided interval. Disables the
|
|
12
|
+
* implicit stacking
|
|
13
|
+
*/
|
|
14
|
+
interval?: number | string;
|
|
15
|
+
borderRadius?: number | {
|
|
16
|
+
topLeft?: number;
|
|
17
|
+
topRight?: number;
|
|
18
|
+
bottomRight?: number;
|
|
19
|
+
bottomLeft?: number;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
/** For vertical column charts using a band scale as x axis */
|
|
23
|
+
declare const BarY: import("svelte").Component<BarYProps, {}, "">;
|
|
24
|
+
type BarY = ReturnType<typeof BarY>;
|
|
25
|
+
export default BarY;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
line representing a moving average and an area representing volatility as a band
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import { Area, Line, bollingerX, recordizeX } from '../index.js';
|
|
7
|
+
import type { BaseMarkProps, ChannelAccessor, DataRow } from '../types.js';
|
|
8
|
+
import { pick } from 'es-toolkit';
|
|
9
|
+
|
|
10
|
+
type BollingerXProps = BaseMarkProps & {
|
|
11
|
+
data: DataRow[];
|
|
12
|
+
x?: ChannelAccessor;
|
|
13
|
+
y?: ChannelAccessor;
|
|
14
|
+
/**
|
|
15
|
+
* the window size (the window transform’s k option), an integer; defaults to 20
|
|
16
|
+
*/
|
|
17
|
+
n?: number;
|
|
18
|
+
/**
|
|
19
|
+
* the band radius, a number representing a multiple of standard deviations; defaults to 2
|
|
20
|
+
*/
|
|
21
|
+
k?: number;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
let { data, class: className = null, n = 20, k = 2, ...options }: BollingerXProps = $props();
|
|
25
|
+
|
|
26
|
+
let args = $derived(bollingerX(recordizeX({ data, ...options }), { n, k }));
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<g class="bollinger {className || ''}">
|
|
30
|
+
<Line
|
|
31
|
+
{...{
|
|
32
|
+
x: '__avg',
|
|
33
|
+
y: '__x',
|
|
34
|
+
...pick(args, ['data', 'stroke', 'strokeOpacity', 'opacity'])
|
|
35
|
+
}} />
|
|
36
|
+
<Area
|
|
37
|
+
{...{
|
|
38
|
+
y1: '__x',
|
|
39
|
+
x1: '__lo',
|
|
40
|
+
x2: '__hi',
|
|
41
|
+
fillOpacity: 0.2,
|
|
42
|
+
...pick(args, ['data', 'fill', 'fillOpacity', 'opacity'])
|
|
43
|
+
}} />
|
|
44
|
+
</g>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BaseMarkProps, ChannelAccessor, DataRow } from '../types.js';
|
|
2
|
+
type BollingerXProps = BaseMarkProps & {
|
|
3
|
+
data: DataRow[];
|
|
4
|
+
x?: ChannelAccessor;
|
|
5
|
+
y?: ChannelAccessor;
|
|
6
|
+
/**
|
|
7
|
+
* the window size (the window transform’s k option), an integer; defaults to 20
|
|
8
|
+
*/
|
|
9
|
+
n?: number;
|
|
10
|
+
/**
|
|
11
|
+
* the band radius, a number representing a multiple of standard deviations; defaults to 2
|
|
12
|
+
*/
|
|
13
|
+
k?: number;
|
|
14
|
+
};
|
|
15
|
+
/** line representing a moving average and an area representing volatility as a band */
|
|
16
|
+
declare const BollingerX: import("svelte").Component<BollingerXProps, {}, "">;
|
|
17
|
+
type BollingerX = ReturnType<typeof BollingerX>;
|
|
18
|
+
export default BollingerX;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
line representing a moving average and an area representing volatility as a band
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import { Area, Line, bollingerY, recordizeY } from '../index.js';
|
|
7
|
+
import type { BaseMarkProps, ChannelAccessor, DataRow } from '../types.js';
|
|
8
|
+
import { pick } from 'es-toolkit';
|
|
9
|
+
|
|
10
|
+
type BollingerYProps = BaseMarkProps & {
|
|
11
|
+
data: DataRow[];
|
|
12
|
+
x?: ChannelAccessor;
|
|
13
|
+
y?: ChannelAccessor;
|
|
14
|
+
/**
|
|
15
|
+
* the window size (the window transform’s k option), an integer; defaults to 20
|
|
16
|
+
*/
|
|
17
|
+
n?: number;
|
|
18
|
+
/**
|
|
19
|
+
* the band radius, a number representing a multiple of standard deviations; defaults to 2
|
|
20
|
+
*/
|
|
21
|
+
k?: number;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
let { data, n = 20, k = 2, class: className, ...options }: BollingerYProps = $props();
|
|
25
|
+
|
|
26
|
+
const args = $derived(bollingerY(recordizeY({ data, ...options }), { n, k }));
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<g class="bollinger {className || ''}">
|
|
30
|
+
<Line {...pick(args, ['x', 'y', 'data', 'stroke', 'strokeOpacity', 'opacity'])} />
|
|
31
|
+
<Area
|
|
32
|
+
{...{
|
|
33
|
+
x1: '__x',
|
|
34
|
+
y1: '__lo',
|
|
35
|
+
y2: '__hi',
|
|
36
|
+
fillOpacity: 0.2,
|
|
37
|
+
...pick(args, ['data', 'fill', 'fillOpacity', 'opacity'])
|
|
38
|
+
}} />
|
|
39
|
+
</g>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BaseMarkProps, ChannelAccessor, DataRow } from '../types.js';
|
|
2
|
+
type BollingerYProps = BaseMarkProps & {
|
|
3
|
+
data: DataRow[];
|
|
4
|
+
x?: ChannelAccessor;
|
|
5
|
+
y?: ChannelAccessor;
|
|
6
|
+
/**
|
|
7
|
+
* the window size (the window transform’s k option), an integer; defaults to 20
|
|
8
|
+
*/
|
|
9
|
+
n?: number;
|
|
10
|
+
/**
|
|
11
|
+
* the band radius, a number representing a multiple of standard deviations; defaults to 2
|
|
12
|
+
*/
|
|
13
|
+
k?: number;
|
|
14
|
+
};
|
|
15
|
+
/** line representing a moving average and an area representing volatility as a band */
|
|
16
|
+
declare const BollingerY: import("svelte").Component<BollingerYProps, {}, "">;
|
|
17
|
+
type BollingerY = ReturnType<typeof BollingerY>;
|
|
18
|
+
export default BollingerY;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import GroupMultiple from './helpers/GroupMultiple.svelte';
|
|
3
|
+
import type { BoxProps } from './BoxY.svelte';
|
|
4
|
+
import { BarX, TickX, RuleY, Dot, groupY } from '../index.js';
|
|
5
|
+
import { resolveChannel } from '../helpers/resolve.js';
|
|
6
|
+
|
|
7
|
+
let {
|
|
8
|
+
data = [{}],
|
|
9
|
+
x,
|
|
10
|
+
y,
|
|
11
|
+
rule,
|
|
12
|
+
bar,
|
|
13
|
+
tickMedian = true,
|
|
14
|
+
tickMinMax = false,
|
|
15
|
+
dot,
|
|
16
|
+
class: className = null
|
|
17
|
+
}: BoxProps = $props();
|
|
18
|
+
|
|
19
|
+
const { data: grouped } = $derived(
|
|
20
|
+
groupY(
|
|
21
|
+
{
|
|
22
|
+
data: data.filter((d) => resolveChannel('x', d, { x, y }) != null),
|
|
23
|
+
x,
|
|
24
|
+
y,
|
|
25
|
+
x1: x,
|
|
26
|
+
x2: x
|
|
27
|
+
},
|
|
28
|
+
{ x: 'median', x1: 'p25', x2: 'p75', fill: (rows) => rows }
|
|
29
|
+
)
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
const boxData = $derived(
|
|
33
|
+
grouped
|
|
34
|
+
.map((row) => {
|
|
35
|
+
const iqr = row.__x2 - row.__x1;
|
|
36
|
+
const whisker = iqr * 1.5;
|
|
37
|
+
const lower = row.__x1 - whisker;
|
|
38
|
+
const upper = row.__x2 + whisker;
|
|
39
|
+
const data = row.__fill.map((d) => ({
|
|
40
|
+
...d,
|
|
41
|
+
__x: resolveChannel('x', d, { x, y })
|
|
42
|
+
}));
|
|
43
|
+
const outliers = data.filter((d) => d.__x < lower || d.__x > upper);
|
|
44
|
+
const inside = data
|
|
45
|
+
.filter((d) => d.__x >= lower && d.__x <= upper)
|
|
46
|
+
.sort((a, b) => a.__x - b.__x);
|
|
47
|
+
// if (inside.length === 0) console.log('No data inside boxplot', data, row, lower, upper);
|
|
48
|
+
return {
|
|
49
|
+
[y]: row[y],
|
|
50
|
+
__y: row[y],
|
|
51
|
+
p25: row.__x1,
|
|
52
|
+
p75: row.__x2,
|
|
53
|
+
median: row.__x,
|
|
54
|
+
min: inside[0].__x,
|
|
55
|
+
max: inside.at(-1).__x,
|
|
56
|
+
outliers
|
|
57
|
+
};
|
|
58
|
+
})
|
|
59
|
+
.sort((a, b) => b.median - a.median)
|
|
60
|
+
);
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<GroupMultiple class="box-x {className || ''}" length={className ? 2 : grouped.length}>
|
|
64
|
+
<RuleY data={boxData} y="__y" x1="min" x2="max" {...rule || {}} />
|
|
65
|
+
<BarX data={boxData} y="__y" x1="p25" x2="p75" fill="#ddd" {...bar || {}} />
|
|
66
|
+
{#if tickMedian}
|
|
67
|
+
<TickX
|
|
68
|
+
data={boxData}
|
|
69
|
+
y="__y"
|
|
70
|
+
x="median"
|
|
71
|
+
strokeWidth={2}
|
|
72
|
+
{...typeof tickMedian === 'object' ? tickMedian : {}} />
|
|
73
|
+
{/if}
|
|
74
|
+
{#if tickMinMax}
|
|
75
|
+
<TickX
|
|
76
|
+
data={boxData}
|
|
77
|
+
x="min"
|
|
78
|
+
y="__y"
|
|
79
|
+
inset="20%"
|
|
80
|
+
{...typeof tickMinMax === 'object' ? tickMinMax : {}} />
|
|
81
|
+
<TickX
|
|
82
|
+
data={boxData}
|
|
83
|
+
x="max"
|
|
84
|
+
y="__y"
|
|
85
|
+
inset="20%"
|
|
86
|
+
{...typeof tickMinMax === 'object' ? tickMinMax : {}} />
|
|
87
|
+
{/if}
|
|
88
|
+
<Dot data={boxData.map((d) => d.outliers).flat()} {x} {y} {...dot || {}} />
|
|
89
|
+
</GroupMultiple>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
export type BoxProps = {
|
|
3
|
+
data: DataRecord[];
|
|
4
|
+
x: ChannelAccessor;
|
|
5
|
+
y: ChannelAccessor;
|
|
6
|
+
/**
|
|
7
|
+
* Options for the rule marks that represent the min/max range
|
|
8
|
+
*/
|
|
9
|
+
rule: Record<string, ChannelAccessor>;
|
|
10
|
+
/**
|
|
11
|
+
* Options for the bar marks that represent the IQR range
|
|
12
|
+
*/
|
|
13
|
+
bar: Record<string, ChannelAccessor>;
|
|
14
|
+
/**
|
|
15
|
+
* Options for the tick marks that represent the median
|
|
16
|
+
*/
|
|
17
|
+
tickMedian: Record<string, ChannelAccessor> | boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Options for the tick marks that represent the min/max range
|
|
20
|
+
*/
|
|
21
|
+
tickMinMax: Record<string, ChannelAccessor> | boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Options for the dot marks that represent the outliers
|
|
24
|
+
*/
|
|
25
|
+
dot: Record<string, ChannelAccessor>;
|
|
26
|
+
};
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<script lang="ts">
|
|
30
|
+
import GroupMultiple from './helpers/GroupMultiple.svelte';
|
|
31
|
+
import type { ChannelAccessor, DataRecord } from '../types.js';
|
|
32
|
+
import { groupX, BarY, TickY, RuleX, Dot } from '../index.js';
|
|
33
|
+
import { resolveChannel } from '../helpers/resolve.js';
|
|
34
|
+
|
|
35
|
+
let {
|
|
36
|
+
data = [{}],
|
|
37
|
+
x,
|
|
38
|
+
y,
|
|
39
|
+
rule,
|
|
40
|
+
bar,
|
|
41
|
+
tickMedian = true,
|
|
42
|
+
tickMinMax = false,
|
|
43
|
+
dot,
|
|
44
|
+
class: className = null
|
|
45
|
+
}: BoxProps = $props();
|
|
46
|
+
|
|
47
|
+
let { data: grouped } = $derived(
|
|
48
|
+
groupX(
|
|
49
|
+
{
|
|
50
|
+
data: data.filter((d) => resolveChannel('x', d, { x, y }) != null),
|
|
51
|
+
x,
|
|
52
|
+
y,
|
|
53
|
+
y1: y,
|
|
54
|
+
y2: y
|
|
55
|
+
},
|
|
56
|
+
{ y: 'median', y1: 'p25', y2: 'p75', fill: (rows) => rows }
|
|
57
|
+
)
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
let boxData = $derived(
|
|
61
|
+
grouped.map((row) => {
|
|
62
|
+
const iqr = row.__y2 - row.__y1;
|
|
63
|
+
const whisker = iqr * 1.5;
|
|
64
|
+
const lower = row.__y1 - whisker;
|
|
65
|
+
const upper = row.__y2 + whisker;
|
|
66
|
+
const data = row.__fill.map((d) => ({ ...d, __y: resolveChannel('y', d, { x, y }) }));
|
|
67
|
+
const outliers = data.filter((d) => d.__y < lower || d.__y > upper);
|
|
68
|
+
const inside = data
|
|
69
|
+
.filter((d) => d.__y >= lower && d.__y <= upper)
|
|
70
|
+
.sort((a, b) => a.__y - b.__y);
|
|
71
|
+
return {
|
|
72
|
+
__x: row[x],
|
|
73
|
+
p25: row.__y1,
|
|
74
|
+
p75: row.__y2,
|
|
75
|
+
median: row.__y,
|
|
76
|
+
min: inside[0].__y,
|
|
77
|
+
max: inside.at(-1).__y,
|
|
78
|
+
outliers
|
|
79
|
+
};
|
|
80
|
+
})
|
|
81
|
+
);
|
|
82
|
+
</script>
|
|
83
|
+
|
|
84
|
+
<GroupMultiple class="box-y {className || ''}" length={className ? 2 : grouped.length}>
|
|
85
|
+
<RuleX data={boxData} x="__x" y1="min" y2="max" {...rule || {}} />
|
|
86
|
+
<BarY data={boxData} x="__x" y1="p25" y2="p75" fill="#ddd" {...bar || {}} />
|
|
87
|
+
{#if tickMedian}
|
|
88
|
+
<TickY
|
|
89
|
+
data={boxData}
|
|
90
|
+
x="__x"
|
|
91
|
+
y="median"
|
|
92
|
+
strokeWidth={2}
|
|
93
|
+
{...typeof tickMedian === 'object' ? tickMedian : {}} />
|
|
94
|
+
{/if}
|
|
95
|
+
{#if tickMinMax}
|
|
96
|
+
<TickY
|
|
97
|
+
data={boxData}
|
|
98
|
+
x="__x"
|
|
99
|
+
y="min"
|
|
100
|
+
inset="20%"
|
|
101
|
+
{...typeof tickMinMax === 'object' ? tickMinMax : {}} />
|
|
102
|
+
<TickY
|
|
103
|
+
data={boxData}
|
|
104
|
+
x="__x"
|
|
105
|
+
y="max"
|
|
106
|
+
inset="20%"
|
|
107
|
+
{...typeof tickMinMax === 'object' ? tickMinMax : {}} />
|
|
108
|
+
{/if}
|
|
109
|
+
<Dot data={boxData.map((d) => d.outliers).flat()} {x} {y} {...dot || {}} />
|
|
110
|
+
</GroupMultiple>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type BoxProps = {
|
|
2
|
+
data: DataRecord[];
|
|
3
|
+
x: ChannelAccessor;
|
|
4
|
+
y: ChannelAccessor;
|
|
5
|
+
/**
|
|
6
|
+
* Options for the rule marks that represent the min/max range
|
|
7
|
+
*/
|
|
8
|
+
rule: Record<string, ChannelAccessor>;
|
|
9
|
+
/**
|
|
10
|
+
* Options for the bar marks that represent the IQR range
|
|
11
|
+
*/
|
|
12
|
+
bar: Record<string, ChannelAccessor>;
|
|
13
|
+
/**
|
|
14
|
+
* Options for the tick marks that represent the median
|
|
15
|
+
*/
|
|
16
|
+
tickMedian: Record<string, ChannelAccessor> | boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Options for the tick marks that represent the min/max range
|
|
19
|
+
*/
|
|
20
|
+
tickMinMax: Record<string, ChannelAccessor> | boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Options for the dot marks that represent the outliers
|
|
23
|
+
*/
|
|
24
|
+
dot: Record<string, ChannelAccessor>;
|
|
25
|
+
};
|
|
26
|
+
import type { ChannelAccessor, DataRecord } from '../types.js';
|
|
27
|
+
declare const BoxY: import("svelte").Component<BoxProps, {}, "">;
|
|
28
|
+
type BoxY = ReturnType<typeof BoxY>;
|
|
29
|
+
export default BoxY;
|