layerchart 0.0.3 → 0.0.7
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/README.md +2 -37
- package/components/Arc.svelte +77 -0
- package/components/Arc.svelte.d.ts +34 -0
- package/components/Area.svelte +19 -10
- package/components/Area.svelte.d.ts +4 -1
- package/components/AreaStack.svelte +3 -0
- package/components/AreaStack.svelte.d.ts +1 -0
- package/components/AxisX.svelte +1 -1
- package/components/AxisY.svelte +1 -4
- package/components/{Bar.svelte → Bars.svelte} +27 -14
- package/components/{Bar.svelte.d.ts → Bars.svelte.d.ts} +10 -4
- package/components/ConnectedPoints.svelte +68 -0
- package/components/ConnectedPoints.svelte.d.ts +18 -0
- package/components/Group.svelte +26 -0
- package/components/Group.svelte.d.ts +21 -0
- package/components/{HighlightBar.svelte → HighlightRect.svelte} +0 -0
- package/components/HighlightRect.svelte.d.ts +18 -0
- package/components/{Label.svelte → Labels.svelte} +0 -0
- package/components/{Label.svelte.d.ts → Labels.svelte.d.ts} +4 -4
- package/components/LinearGradient.svelte +27 -0
- package/components/LinearGradient.svelte.d.ts +27 -0
- package/components/Path.svelte +19 -15
- package/components/Path.svelte.d.ts +4 -2
- package/components/Points.svelte +58 -0
- package/components/Points.svelte.d.ts +19 -0
- package/components/Threshold.svelte +25 -22
- package/components/index.d.ts +8 -5
- package/components/index.js +8 -5
- package/docs/Preview.svelte +7 -3
- package/docs/Preview.svelte.d.ts +2 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +17 -10
- package/stores/motionStore.d.ts +2 -2
- package/utils/genData.d.ts +13 -0
- package/utils/genData.js +24 -0
- package/utils/math.d.ts +4 -0
- package/utils/math.js +6 -0
- package/utils/path.d.ts +5 -0
- package/utils/path.js +14 -0
- package/utils/pivot.js +1 -1
- package/utils/stack.d.ts +14 -0
- package/utils/stack.js +69 -0
- package/components/ClevelandDotPlot.svelte +0 -44
- package/components/ClevelandDotPlot.svelte.d.ts +0 -21
- package/components/HighlightBar.svelte.d.ts +0 -18
- package/components/Scatter.svelte +0 -25
- package/components/Scatter.svelte.d.ts +0 -33
package/components/Path.svelte
CHANGED
|
@@ -1,31 +1,35 @@
|
|
|
1
1
|
<script >import { getContext } from 'svelte';
|
|
2
2
|
import { line as d3Line } from 'd3-shape';
|
|
3
|
+
// import { interpolateString } from 'd3-interpolate';
|
|
4
|
+
import { interpolatePath } from 'd3-interpolate-path';
|
|
5
|
+
import { getMotionStore } from '../stores/motionStore';
|
|
3
6
|
const { data: contextData, xGet, yGet, zGet } = getContext('LayerCake');
|
|
4
7
|
// Properties to override what is used from context
|
|
5
8
|
export let data = undefined; // TODO: Update Type
|
|
6
9
|
export let x = undefined; // TODO: Update Type
|
|
7
10
|
export let y = undefined; // TODO: Update Type
|
|
8
11
|
export let pathData = undefined;
|
|
12
|
+
export let tweened = undefined;
|
|
9
13
|
export let curve = undefined;
|
|
10
14
|
export let defined = undefined;
|
|
11
|
-
export let color = '
|
|
15
|
+
export let color = 'black';
|
|
12
16
|
export let width = undefined;
|
|
13
|
-
$:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
$: tweenedOptions = tweened ? { interpolate: interpolatePath, ...tweened } : false;
|
|
18
|
+
$: tweened_d = getMotionStore('', { tweened: tweenedOptions });
|
|
19
|
+
$: {
|
|
20
|
+
const path = d3Line()
|
|
21
|
+
.x(x ?? $xGet)
|
|
22
|
+
.y(y ?? $yGet);
|
|
23
|
+
if (curve)
|
|
24
|
+
path.curve(curve);
|
|
25
|
+
if (defined)
|
|
26
|
+
path.defined(defined);
|
|
27
|
+
const d = pathData ?? path(data ?? $contextData);
|
|
28
|
+
tweened_d.set(d);
|
|
29
|
+
}
|
|
20
30
|
</script>
|
|
21
31
|
|
|
22
|
-
<path
|
|
23
|
-
class="path-line"
|
|
24
|
-
d={pathData ?? path(data ?? $contextData)}
|
|
25
|
-
stroke={color}
|
|
26
|
-
stroke-width={width}
|
|
27
|
-
{...$$restProps}
|
|
28
|
-
/>
|
|
32
|
+
<path class="path-line" d={$tweened_d} stroke={color} stroke-width={width} {...$$restProps} />
|
|
29
33
|
|
|
30
34
|
<style >
|
|
31
35
|
.path-line {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type {
|
|
2
|
+
import type { tweened as tweenedStore } from 'svelte/motion';
|
|
3
|
+
import type { CurveFactory, CurveFactoryLineOnly, Line } from 'd3-shape';
|
|
3
4
|
declare const __propDef: {
|
|
4
5
|
props: {
|
|
5
6
|
[x: string]: any;
|
|
@@ -7,8 +8,9 @@ declare const __propDef: {
|
|
|
7
8
|
x?: any;
|
|
8
9
|
y?: any;
|
|
9
10
|
pathData?: string;
|
|
11
|
+
tweened?: boolean | Parameters<typeof tweenedStore>[1];
|
|
10
12
|
curve?: CurveFactory | CurveFactoryLineOnly;
|
|
11
|
-
defined?:
|
|
13
|
+
defined?: Parameters<Line<any>['defined']>[0];
|
|
12
14
|
color?: string;
|
|
13
15
|
width?: any;
|
|
14
16
|
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<script >import { getContext } from 'svelte';
|
|
2
|
+
import Circle from './Circle.svelte';
|
|
3
|
+
const context = getContext('LayerCake');
|
|
4
|
+
const { data, xGet, yGet, config } = context;
|
|
5
|
+
export let r = 5;
|
|
6
|
+
export let offsetX = 0;
|
|
7
|
+
export let offsetY = 0;
|
|
8
|
+
function getOffset(value, offset) {
|
|
9
|
+
if (typeof offset === 'function') {
|
|
10
|
+
return offset(value, context);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return offset;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
$: points = $data.flatMap((d) => {
|
|
17
|
+
if (Array.isArray($config.x)) {
|
|
18
|
+
/*
|
|
19
|
+
x={["prop1" ,"prop2"]}
|
|
20
|
+
y="prop3"
|
|
21
|
+
*/
|
|
22
|
+
return $xGet(d).map((x) => {
|
|
23
|
+
return {
|
|
24
|
+
x: x + getOffset(x, offsetX),
|
|
25
|
+
y: $yGet(d) + getOffset($yGet(d), offsetY)
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else if (Array.isArray($config.y)) {
|
|
30
|
+
/*
|
|
31
|
+
x="prop1"
|
|
32
|
+
y={["prop2" ,"prop3"]}
|
|
33
|
+
*/
|
|
34
|
+
return $yGet(d).map((y) => {
|
|
35
|
+
return {
|
|
36
|
+
x: $xGet(d) + getOffset($xGet(d), offsetX),
|
|
37
|
+
y: y + getOffset(y, offsetY)
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
/*
|
|
43
|
+
x="prop1"
|
|
44
|
+
y="prop2"
|
|
45
|
+
*/
|
|
46
|
+
return {
|
|
47
|
+
x: $xGet(d) + getOffset($xGet(d), offsetX),
|
|
48
|
+
y: $yGet(d) + getOffset($yGet(d), offsetY)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
<g class="point-group">
|
|
55
|
+
{#each points as p}
|
|
56
|
+
<Circle cx={p.x} cy={p.y} {r} {...$$restProps} />
|
|
57
|
+
{/each}
|
|
58
|
+
</g>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
[x: string]: any;
|
|
5
|
+
r?: number;
|
|
6
|
+
offsetX?: number | ((value: number, context: any) => number);
|
|
7
|
+
offsetY?: number | ((value: number, context: any) => number);
|
|
8
|
+
};
|
|
9
|
+
events: {
|
|
10
|
+
[evt: string]: CustomEvent<any>;
|
|
11
|
+
};
|
|
12
|
+
slots: {};
|
|
13
|
+
};
|
|
14
|
+
export declare type PointsProps = typeof __propDef.props;
|
|
15
|
+
export declare type PointsEvents = typeof __propDef.events;
|
|
16
|
+
export declare type PointsSlots = typeof __propDef.slots;
|
|
17
|
+
export default class Points extends SvelteComponentTyped<PointsProps, PointsEvents, PointsSlots> {
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -54,30 +54,33 @@ $: if (defined)
|
|
|
54
54
|
linePathBelow.defined(defined);
|
|
55
55
|
</script>
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
</
|
|
57
|
+
<!-- Recreate on curve change as otherwise is 1 state change behind for some reason -->
|
|
58
|
+
{#key curve}
|
|
59
|
+
<g class="clip-paths">
|
|
60
|
+
<defs>
|
|
61
|
+
<clipPath id="threshold-clip-below-{id}">
|
|
62
|
+
<path d={clipPathBelow(data ?? $contextData)} />
|
|
63
|
+
</clipPath>
|
|
64
|
+
<clipPath id="threshold-clip-above-{id}">
|
|
65
|
+
<path d={clipPathAbove(data ?? $contextData)} />
|
|
66
|
+
</clipPath>
|
|
67
|
+
</defs>
|
|
68
|
+
</g>
|
|
67
69
|
|
|
68
|
-
<slot
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
/>
|
|
70
|
+
<slot
|
|
71
|
+
name="pathAbove"
|
|
72
|
+
areaPathData={areaPath(data ?? $contextData)}
|
|
73
|
+
clipPath="url(#threshold-clip-below-{id})"
|
|
74
|
+
linePathData={linePathAbove(data ?? $contextData)}
|
|
75
|
+
/>
|
|
74
76
|
|
|
75
|
-
<slot
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
/>
|
|
77
|
+
<slot
|
|
78
|
+
name="pathBelow"
|
|
79
|
+
areaPathData={areaPath(data ?? $contextData)}
|
|
80
|
+
clipPath="url(#threshold-clip-above-{id})"
|
|
81
|
+
linePathData={linePathBelow(data ?? $contextData)}
|
|
82
|
+
/>
|
|
83
|
+
{/key}
|
|
81
84
|
|
|
82
85
|
<!-- Fix `<Threshold> received an unexpected slot "default".` warning -->
|
|
83
86
|
<slot />
|
package/components/index.d.ts
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
+
export { default as Arc } from './Arc.svelte';
|
|
1
2
|
export { default as Area } from './Area.svelte';
|
|
2
3
|
export { default as AreaStack } from './AreaStack.svelte';
|
|
3
4
|
export { default as AxisX } from './AxisX.svelte';
|
|
4
5
|
export { default as AxisY } from './AxisY.svelte';
|
|
5
|
-
export { default as
|
|
6
|
+
export { default as Bars } from './Bars.svelte';
|
|
6
7
|
export { default as Baseline } from './Baseline.svelte';
|
|
7
8
|
export { default as Chart } from './Chart.svelte';
|
|
8
9
|
export { default as Circle } from './Circle.svelte';
|
|
9
|
-
export { default as
|
|
10
|
-
export { default as
|
|
10
|
+
export { default as ConnectedPoints } from './ConnectedPoints.svelte';
|
|
11
|
+
export { default as Group } from './Group.svelte';
|
|
11
12
|
export { default as HighlightLine } from './HighlightLine.svelte';
|
|
12
|
-
export { default as
|
|
13
|
+
export { default as HighlightRect } from './HighlightRect.svelte';
|
|
14
|
+
export { default as Labels } from './Labels.svelte';
|
|
13
15
|
export { default as Line } from './Line.svelte';
|
|
16
|
+
export { default as LinearGradient } from './LinearGradient.svelte';
|
|
14
17
|
export { default as Path } from './Path.svelte';
|
|
18
|
+
export { default as Points } from './Points.svelte';
|
|
15
19
|
export { default as Rect } from './Rect.svelte';
|
|
16
|
-
export { default as Scatter } from './Scatter.svelte';
|
|
17
20
|
export { default as Text } from './Text.svelte';
|
|
18
21
|
export { default as Threshold } from './Threshold.svelte';
|
|
19
22
|
export { default as Tooltip } from './Tooltip.svelte';
|
package/components/index.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
+
export { default as Arc } from './Arc.svelte';
|
|
1
2
|
export { default as Area } from './Area.svelte';
|
|
2
3
|
export { default as AreaStack } from './AreaStack.svelte';
|
|
3
4
|
export { default as AxisX } from './AxisX.svelte';
|
|
4
5
|
export { default as AxisY } from './AxisY.svelte';
|
|
5
|
-
export { default as
|
|
6
|
+
export { default as Bars } from './Bars.svelte';
|
|
6
7
|
export { default as Baseline } from './Baseline.svelte';
|
|
7
8
|
export { default as Chart } from './Chart.svelte';
|
|
8
9
|
export { default as Circle } from './Circle.svelte';
|
|
9
|
-
export { default as
|
|
10
|
-
export { default as
|
|
10
|
+
export { default as ConnectedPoints } from './ConnectedPoints.svelte';
|
|
11
|
+
export { default as Group } from './Group.svelte';
|
|
11
12
|
export { default as HighlightLine } from './HighlightLine.svelte';
|
|
12
|
-
export { default as
|
|
13
|
+
export { default as HighlightRect } from './HighlightRect.svelte';
|
|
14
|
+
export { default as Labels } from './Labels.svelte';
|
|
13
15
|
export { default as Line } from './Line.svelte';
|
|
16
|
+
export { default as LinearGradient } from './LinearGradient.svelte';
|
|
14
17
|
export { default as Path } from './Path.svelte';
|
|
18
|
+
export { default as Points } from './Points.svelte';
|
|
15
19
|
export { default as Rect } from './Rect.svelte';
|
|
16
|
-
export { default as Scatter } from './Scatter.svelte';
|
|
17
20
|
export { default as Text } from './Text.svelte';
|
|
18
21
|
export { default as Threshold } from './Threshold.svelte';
|
|
19
22
|
export { default as Tooltip } from './Tooltip.svelte';
|
package/docs/Preview.svelte
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
<script >
|
|
1
|
+
<script >import Prism from 'prismjs';
|
|
2
|
+
import 'prism-svelte';
|
|
3
|
+
export let code = null;
|
|
2
4
|
export let language = 'svelte';
|
|
5
|
+
export let highlight = false;
|
|
6
|
+
$: displayCode = highlight ? Prism.highlight(code, Prism.languages.svelte, 'svelte') : code;
|
|
3
7
|
</script>
|
|
4
8
|
|
|
5
9
|
<div class="border border-black/20 rounded bg-white">
|
|
@@ -7,12 +11,12 @@ export let language = 'svelte';
|
|
|
7
11
|
<slot />
|
|
8
12
|
</div>
|
|
9
13
|
|
|
10
|
-
{#if
|
|
14
|
+
{#if displayCode}
|
|
11
15
|
<pre
|
|
12
16
|
class="language-{language} rounded"
|
|
13
17
|
style="margin: 0">
|
|
14
18
|
<code class="language-{language}">
|
|
15
|
-
{@html
|
|
19
|
+
{@html displayCode}
|
|
16
20
|
</code>
|
|
17
21
|
</pre>
|
|
18
22
|
{/if}
|
package/docs/Preview.svelte.d.ts
CHANGED
package/index.d.ts
CHANGED
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
"author": "Sean Lynch <techniq35@gmail.com>",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": "techniq/layerchart",
|
|
6
|
-
"version": "0.0.
|
|
6
|
+
"version": "0.0.7",
|
|
7
7
|
"devDependencies": {
|
|
8
8
|
"@sveltejs/adapter-static": "^1.0.0-next.21",
|
|
9
|
-
"@sveltejs/kit": "1.0.0-next.
|
|
9
|
+
"@sveltejs/kit": "^1.0.0-next.201",
|
|
10
10
|
"@types/d3-array": "^3.0.2",
|
|
11
11
|
"@types/d3-scale": "^4.0.2",
|
|
12
12
|
"@types/d3-shape": "^3.0.2",
|
|
13
13
|
"@types/lodash-es": "^4.17.5",
|
|
14
14
|
"autoprefixer": "^10.4.0",
|
|
15
15
|
"mdsvex": "^0.9.8",
|
|
16
|
-
"prettier": "^2.
|
|
16
|
+
"prettier": "^2.5.0",
|
|
17
17
|
"prettier-plugin-svelte": "^2.5.0",
|
|
18
18
|
"prism-themes": "^1.9.0",
|
|
19
19
|
"svelte": "^3.44.2",
|
|
@@ -30,31 +30,35 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@mdi/js": "^6.5.95",
|
|
32
32
|
"d3-array": "^3.1.1",
|
|
33
|
+
"d3-interpolate-path": "^2.2.3",
|
|
33
34
|
"d3-scale": "^4.0.2",
|
|
34
35
|
"d3-shape": "^3.0.1",
|
|
35
36
|
"date-fns": "^2.26.0",
|
|
36
|
-
"layercake": "^5.0.
|
|
37
|
+
"layercake": "^5.0.1",
|
|
37
38
|
"lodash-es": "^4.17.21",
|
|
38
|
-
"svelte-ux": "^0.0.
|
|
39
|
+
"svelte-ux": "^0.0.105"
|
|
39
40
|
},
|
|
40
41
|
"exports": {
|
|
41
42
|
"./package.json": "./package.json",
|
|
43
|
+
"./components/Arc.svelte": "./components/Arc.svelte",
|
|
42
44
|
"./components/Area.svelte": "./components/Area.svelte",
|
|
43
45
|
"./components/AreaStack.svelte": "./components/AreaStack.svelte",
|
|
44
46
|
"./components/AxisX.svelte": "./components/AxisX.svelte",
|
|
45
47
|
"./components/AxisY.svelte": "./components/AxisY.svelte",
|
|
46
|
-
"./components/
|
|
48
|
+
"./components/Bars.svelte": "./components/Bars.svelte",
|
|
47
49
|
"./components/Baseline.svelte": "./components/Baseline.svelte",
|
|
48
50
|
"./components/Chart.svelte": "./components/Chart.svelte",
|
|
49
51
|
"./components/Circle.svelte": "./components/Circle.svelte",
|
|
50
|
-
"./components/
|
|
51
|
-
"./components/
|
|
52
|
+
"./components/ConnectedPoints.svelte": "./components/ConnectedPoints.svelte",
|
|
53
|
+
"./components/Group.svelte": "./components/Group.svelte",
|
|
52
54
|
"./components/HighlightLine.svelte": "./components/HighlightLine.svelte",
|
|
53
|
-
"./components/
|
|
55
|
+
"./components/HighlightRect.svelte": "./components/HighlightRect.svelte",
|
|
56
|
+
"./components/Labels.svelte": "./components/Labels.svelte",
|
|
54
57
|
"./components/Line.svelte": "./components/Line.svelte",
|
|
58
|
+
"./components/LinearGradient.svelte": "./components/LinearGradient.svelte",
|
|
55
59
|
"./components/Path.svelte": "./components/Path.svelte",
|
|
60
|
+
"./components/Points.svelte": "./components/Points.svelte",
|
|
56
61
|
"./components/Rect.svelte": "./components/Rect.svelte",
|
|
57
|
-
"./components/Scatter.svelte": "./components/Scatter.svelte",
|
|
58
62
|
"./components/Text.svelte": "./components/Text.svelte",
|
|
59
63
|
"./components/Threshold.svelte": "./components/Threshold.svelte",
|
|
60
64
|
"./components/Tooltip.svelte": "./components/Tooltip.svelte",
|
|
@@ -69,8 +73,11 @@
|
|
|
69
73
|
"./utils/event": "./utils/event.js",
|
|
70
74
|
"./utils/genData": "./utils/genData.js",
|
|
71
75
|
"./utils": "./utils/index.js",
|
|
76
|
+
"./utils/math": "./utils/math.js",
|
|
77
|
+
"./utils/path": "./utils/path.js",
|
|
72
78
|
"./utils/pivot": "./utils/pivot.js",
|
|
73
79
|
"./utils/scales": "./utils/scales.js",
|
|
80
|
+
"./utils/stack": "./utils/stack.js",
|
|
74
81
|
"./utils/string": "./utils/string.js",
|
|
75
82
|
"./utils/ticks": "./utils/ticks.js"
|
|
76
83
|
},
|
package/stores/motionStore.d.ts
CHANGED
|
@@ -3,6 +3,6 @@ import { spring, tweened } from 'svelte/motion';
|
|
|
3
3
|
* Convenient wrapper to get motion store based on properties, or fall back to basic writable() store
|
|
4
4
|
*/
|
|
5
5
|
export declare function getMotionStore(value: any, options: {
|
|
6
|
-
spring
|
|
7
|
-
tweened
|
|
6
|
+
spring?: boolean | Parameters<typeof spring>[1];
|
|
7
|
+
tweened?: boolean | Parameters<typeof tweened>[1];
|
|
8
8
|
}): import("svelte/motion").Tweened<unknown> | import("svelte/motion").Spring<any> | import("svelte/store").Writable<any>;
|
package/utils/genData.d.ts
CHANGED
|
@@ -17,3 +17,16 @@ export declare function createDateSeries(options: {
|
|
|
17
17
|
}): {
|
|
18
18
|
date: Date;
|
|
19
19
|
}[];
|
|
20
|
+
export declare const wideData: {
|
|
21
|
+
year: string;
|
|
22
|
+
apples: number;
|
|
23
|
+
bananas: number;
|
|
24
|
+
cherries: number;
|
|
25
|
+
dates: number;
|
|
26
|
+
}[];
|
|
27
|
+
export declare const longData: {
|
|
28
|
+
year: string;
|
|
29
|
+
basket: number;
|
|
30
|
+
fruit: string;
|
|
31
|
+
value: number;
|
|
32
|
+
}[];
|
package/utils/genData.js
CHANGED
|
@@ -33,3 +33,27 @@ export function createDateSeries(options) {
|
|
|
33
33
|
};
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
|
+
export const wideData = [
|
|
37
|
+
{ year: '2019', apples: 3840, bananas: 1920, cherries: 960, dates: 400 },
|
|
38
|
+
{ year: '2018', apples: 1600, bananas: 1440, cherries: 960, dates: 400 },
|
|
39
|
+
{ year: '2017', apples: 820, bananas: 1000, cherries: 640, dates: 400 },
|
|
40
|
+
{ year: '2016', apples: 820, bananas: 560, cherries: 720, dates: 400 }
|
|
41
|
+
];
|
|
42
|
+
export const longData = [
|
|
43
|
+
{ year: '2019', basket: 1, fruit: 'apples', value: 3840 },
|
|
44
|
+
{ year: '2019', basket: 1, fruit: 'bananas', value: 1920 },
|
|
45
|
+
{ year: '2019', basket: 2, fruit: 'cherries', value: 960 },
|
|
46
|
+
{ year: '2019', basket: 2, fruit: 'dates', value: 400 },
|
|
47
|
+
{ year: '2018', basket: 1, fruit: 'apples', value: 1600 },
|
|
48
|
+
{ year: '2018', basket: 1, fruit: 'bananas', value: 1440 },
|
|
49
|
+
{ year: '2018', basket: 2, fruit: 'cherries', value: 960 },
|
|
50
|
+
{ year: '2018', basket: 2, fruit: 'dates', value: 400 },
|
|
51
|
+
{ year: '2017', basket: 1, fruit: 'apples', value: 820 },
|
|
52
|
+
{ year: '2017', basket: 1, fruit: 'bananas', value: 1000 },
|
|
53
|
+
{ year: '2017', basket: 2, fruit: 'cherries', value: 640 },
|
|
54
|
+
{ year: '2017', basket: 2, fruit: 'dates', value: 400 },
|
|
55
|
+
{ year: '2016', basket: 1, fruit: 'apples', value: 820 },
|
|
56
|
+
{ year: '2016', basket: 1, fruit: 'bananas', value: 560 },
|
|
57
|
+
{ year: '2016', basket: 2, fruit: 'cherries', value: 720 },
|
|
58
|
+
{ year: '2016', basket: 2, fruit: 'dates', value: 400 }
|
|
59
|
+
];
|
package/utils/math.d.ts
ADDED
package/utils/math.js
ADDED
package/utils/path.d.ts
ADDED
package/utils/path.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert easing into path data with number of points
|
|
3
|
+
* see: https://svelte.dev/examples#easing
|
|
4
|
+
*/
|
|
5
|
+
export function getEasingPath(easing, count = 1000) {
|
|
6
|
+
let pathData = `M0 ${count}`;
|
|
7
|
+
for (let i = 1; i <= count; i++) {
|
|
8
|
+
pathData += `
|
|
9
|
+
L${(i / count) * count}
|
|
10
|
+
${count - easing(i / count) * count}
|
|
11
|
+
`;
|
|
12
|
+
}
|
|
13
|
+
return pathData;
|
|
14
|
+
}
|
package/utils/pivot.js
CHANGED
|
@@ -13,7 +13,7 @@ export function getAccessor(key) {
|
|
|
13
13
|
* - see also: https://observablehq.com/d/ac2a320cf2b0adc4 as generator
|
|
14
14
|
*/
|
|
15
15
|
export function pivotLonger(data, columns, name, value) {
|
|
16
|
-
const keep = data.
|
|
16
|
+
const keep = Object.keys(data[0]).filter((c) => !columns.includes(c));
|
|
17
17
|
return data.flatMap((d) => {
|
|
18
18
|
const base = keep.map((k) => [k, d[k]]);
|
|
19
19
|
return columns.map((column) => {
|
package/utils/stack.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { stackOffsetNone } from 'd3-shape';
|
|
2
|
+
declare type OffsetType = typeof stackOffsetNone;
|
|
3
|
+
export declare function createStackData(data: any[], options: {
|
|
4
|
+
xKey: string;
|
|
5
|
+
groupBy?: string;
|
|
6
|
+
stackBy?: string;
|
|
7
|
+
offset?: OffsetType;
|
|
8
|
+
}): any[];
|
|
9
|
+
/**
|
|
10
|
+
* Function to offset each layer by the maximum of the previous layer
|
|
11
|
+
* - see: https://observablehq.com/@mkfreeman/separated-bar-chart
|
|
12
|
+
*/
|
|
13
|
+
export declare function stackOffsetSeparated(series: any, order: any): void;
|
|
14
|
+
export {};
|
package/utils/stack.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { flatGroup, max, sum } from 'd3-array';
|
|
2
|
+
import { stack } from 'd3-shape';
|
|
3
|
+
import { pivotWider } from './pivot';
|
|
4
|
+
export function createStackData(data, options) {
|
|
5
|
+
if (options.groupBy) {
|
|
6
|
+
// Group then Stack (if needed)
|
|
7
|
+
const groupedData = flatGroup(data, (d) => d[options.xKey], (d) => d[options.groupBy]);
|
|
8
|
+
const result = groupedData.flatMap((d, i) => {
|
|
9
|
+
const groupKeys = d.slice(0, -1); // all but last item
|
|
10
|
+
const itemData = d.slice(-1)[0]; // last item
|
|
11
|
+
const pivotData = pivotWider(itemData, options.xKey, options.stackBy, 'value');
|
|
12
|
+
const stackKeys = [...new Set(itemData.map((d) => d[options.stackBy]))];
|
|
13
|
+
const stackData = stack().keys(stackKeys).offset(options.offset)(pivotData);
|
|
14
|
+
//console.log({ pivotData, stackData })
|
|
15
|
+
return stackData.flatMap((series) => {
|
|
16
|
+
//console.log({ series })
|
|
17
|
+
return series.flatMap((s) => {
|
|
18
|
+
return {
|
|
19
|
+
...itemData[0],
|
|
20
|
+
keys: options.stackBy ? [...groupKeys, series.key] : groupKeys,
|
|
21
|
+
values: options.stackBy ? [s[0], s[1]] : [0, sum(itemData, (d) => d.value)]
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
else if (options.stackBy) {
|
|
29
|
+
// Stack only
|
|
30
|
+
const pivotData = pivotWider(data, options.xKey, options.stackBy, 'value');
|
|
31
|
+
const stackKeys = [...new Set(data.map((d) => d[options.stackBy]))];
|
|
32
|
+
const stackData = stack().keys(stackKeys).offset(options.offset)(pivotData);
|
|
33
|
+
const result = stackData.flatMap((series) => {
|
|
34
|
+
return series.flatMap((s) => {
|
|
35
|
+
return {
|
|
36
|
+
...s.data,
|
|
37
|
+
keys: [s.data[options.xKey], series.key],
|
|
38
|
+
values: [s[0], s[1]]
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// TODO: Do anything if no group or stack? Convert to { ...d, keys: [...}, values: [...] ]}?
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Function to offset each layer by the maximum of the previous layer
|
|
51
|
+
* - see: https://observablehq.com/@mkfreeman/separated-bar-chart
|
|
52
|
+
*/
|
|
53
|
+
// TODO: Try to find way to support separated with createStackData() (which has isolated stacked per group)
|
|
54
|
+
export function stackOffsetSeparated(series, order) {
|
|
55
|
+
const gap = 200; // TODO: Determine way to pass in as option (curry?)
|
|
56
|
+
if (!((n = series.length) > 1))
|
|
57
|
+
return;
|
|
58
|
+
// Standard series
|
|
59
|
+
for (var i = 1, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
|
|
60
|
+
(s0 = s1), (s1 = series[order[i]]);
|
|
61
|
+
let base = max(s0, (d) => d[1]) + gap; // here is where you calculate the maximum of the previous layer
|
|
62
|
+
for (var j = 0; j < m; ++j) {
|
|
63
|
+
// Set the height based on the data values, shifted up by the previous layer
|
|
64
|
+
let diff = s1[j][1] - s1[j][0];
|
|
65
|
+
s1[j][0] = base;
|
|
66
|
+
s1[j][1] = base + diff;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
<script >import { getContext } from 'svelte';
|
|
2
|
-
const { data, xGet, yGet, y, yScale, rGet, config } = getContext('LayerCake');
|
|
3
|
-
export let color = 'var(--color-blue-500)';
|
|
4
|
-
export let radius = 5;
|
|
5
|
-
$: midHeight = $yScale.bandwidth() / 2;
|
|
6
|
-
function getColor(item, index) {
|
|
7
|
-
if (typeof color == 'function') {
|
|
8
|
-
return color({ value: $y(item), item, index });
|
|
9
|
-
}
|
|
10
|
-
else if ($config.r) {
|
|
11
|
-
return $rGet(item);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
return color;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
</script>
|
|
18
|
-
|
|
19
|
-
<g class="dot-plot">
|
|
20
|
-
{#each $data as row}
|
|
21
|
-
<g class="dot-row">
|
|
22
|
-
<line
|
|
23
|
-
x1={Math.min(...$xGet(row))}
|
|
24
|
-
y1={$yGet(row) + midHeight}
|
|
25
|
-
x2={Math.max(...$xGet(row))}
|
|
26
|
-
y2={$yGet(row) + midHeight}
|
|
27
|
-
/>
|
|
28
|
-
{#each $xGet(row) as circleX, i}
|
|
29
|
-
<circle cx={circleX} cy={$yGet(row) + midHeight} r={radius} fill={getColor(row, i)} />
|
|
30
|
-
{/each}
|
|
31
|
-
</g>
|
|
32
|
-
{/each}
|
|
33
|
-
</g>
|
|
34
|
-
|
|
35
|
-
<style >
|
|
36
|
-
line {
|
|
37
|
-
stroke-width: 1px;
|
|
38
|
-
stroke: #000;
|
|
39
|
-
}
|
|
40
|
-
circle {
|
|
41
|
-
stroke: #000;
|
|
42
|
-
stroke-width: 1px;
|
|
43
|
-
}
|
|
44
|
-
</style>
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
declare const __propDef: {
|
|
3
|
-
props: {
|
|
4
|
-
color?: string | ((obj: {
|
|
5
|
-
value: any;
|
|
6
|
-
item: any;
|
|
7
|
-
index: number;
|
|
8
|
-
}) => string);
|
|
9
|
-
radius?: number;
|
|
10
|
-
};
|
|
11
|
-
events: {
|
|
12
|
-
[evt: string]: CustomEvent<any>;
|
|
13
|
-
};
|
|
14
|
-
slots: {};
|
|
15
|
-
};
|
|
16
|
-
export declare type ClevelandDotPlotProps = typeof __propDef.props;
|
|
17
|
-
export declare type ClevelandDotPlotEvents = typeof __propDef.events;
|
|
18
|
-
export declare type ClevelandDotPlotSlots = typeof __propDef.slots;
|
|
19
|
-
export default class ClevelandDotPlot extends SvelteComponentTyped<ClevelandDotPlotProps, ClevelandDotPlotEvents, ClevelandDotPlotSlots> {
|
|
20
|
-
}
|
|
21
|
-
export {};
|