svelteplot 0.0.1-alpha.1 → 0.0.1-alpha.11
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/dist/Plot.svelte +172 -0
- package/dist/Plot.svelte.d.ts +15 -0
- package/dist/classes/Channel.svelte.js +74 -0
- package/dist/classes/Mark.svelte.js +17 -0
- package/dist/classes/Plot.svelte.js +98 -0
- package/dist/contants.d.ts +3 -0
- package/dist/contants.js +40 -0
- package/dist/helpers/GroupMultiple.svelte +8 -0
- package/dist/helpers/GroupMultiple.svelte.d.ts +19 -0
- package/dist/helpers/autoTimeFormat.d.ts +2 -0
- package/dist/helpers/autoTimeFormat.js +10 -0
- package/dist/helpers/callWithProps.d.ts +4 -0
- package/dist/helpers/callWithProps.js +9 -0
- package/dist/helpers/colors.d.ts +13 -0
- package/dist/helpers/colors.js +200 -0
- package/dist/helpers/createScale.d.ts +5 -0
- package/dist/helpers/createScale.js +57 -0
- package/dist/helpers/getBaseStyles.d.ts +2 -0
- package/dist/helpers/getBaseStyles.js +18 -0
- package/dist/helpers/getLogTicks.d.ts +1 -0
- package/dist/helpers/getLogTicks.js +57 -0
- package/dist/helpers/isDataRecord.d.ts +2 -0
- package/dist/helpers/isDataRecord.js +13 -0
- package/dist/helpers/mergeDeep.d.ts +5 -0
- package/dist/helpers/mergeDeep.js +26 -0
- package/dist/helpers/removeIdenticalLines.d.ts +1 -0
- package/dist/helpers/removeIdenticalLines.js +16 -0
- package/dist/helpers/resolveChannel.d.ts +2 -0
- package/dist/helpers/resolveChannel.js +28 -0
- package/dist/helpers/symbols.d.ts +5 -0
- package/dist/helpers/symbols.js +51 -0
- package/dist/helpers/typeChecks.d.ts +7 -0
- package/dist/helpers/typeChecks.js +21 -0
- package/dist/helpers/wrapArray.d.ts +2 -0
- package/dist/helpers/wrapArray.js +4 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +20 -0
- package/dist/marks/Area.svelte +81 -0
- package/dist/marks/Area.svelte.d.ts +15 -0
- package/dist/marks/AreaX.svelte +19 -0
- package/dist/marks/AreaX.svelte.d.ts +17 -0
- package/dist/marks/AreaY.svelte +14 -0
- package/dist/marks/AreaY.svelte.d.ts +17 -0
- package/dist/marks/AxisX.svelte +102 -0
- package/dist/marks/AxisX.svelte.d.ts +17 -0
- package/dist/marks/AxisY.svelte +80 -0
- package/dist/marks/AxisY.svelte.d.ts +15 -0
- package/dist/marks/BaseMark.svelte +22 -0
- package/dist/marks/BaseMark.svelte.d.ts +19 -0
- package/dist/marks/ColorLegend.svelte +54 -0
- package/dist/marks/ColorLegend.svelte.d.ts +14 -0
- package/dist/marks/Dot.svelte +82 -0
- package/dist/marks/Dot.svelte.d.ts +15 -0
- package/dist/marks/DotX.svelte +5 -0
- package/dist/marks/DotX.svelte.d.ts +17 -0
- package/dist/marks/DotY.svelte +5 -0
- package/dist/marks/DotY.svelte.d.ts +17 -0
- package/dist/marks/Frame.svelte +37 -0
- package/dist/marks/Frame.svelte.d.ts +15 -0
- package/dist/marks/GridX.svelte +42 -0
- package/dist/marks/GridX.svelte.d.ts +19 -0
- package/dist/marks/GridY.svelte +31 -0
- package/dist/marks/GridY.svelte.d.ts +15 -0
- package/dist/marks/Line.svelte +59 -0
- package/dist/marks/Line.svelte.d.ts +15 -0
- package/dist/marks/LineX.svelte +10 -0
- package/dist/marks/LineX.svelte.d.ts +17 -0
- package/dist/marks/LineY.svelte +10 -0
- package/dist/marks/LineY.svelte.d.ts +17 -0
- package/dist/marks/RuleX.svelte +30 -0
- package/dist/marks/RuleX.svelte.d.ts +15 -0
- package/dist/marks/RuleY.svelte +30 -0
- package/dist/marks/RuleY.svelte.d.ts +15 -0
- package/dist/marks/SymbolLegend.svelte +50 -0
- package/dist/marks/SymbolLegend.svelte.d.ts +14 -0
- package/dist/types.d.ts +209 -0
- package/dist/types.js +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { interpolateBlues, interpolateBrBG, interpolateBuGn, interpolateBuPu, interpolateGnBu, interpolateGreens, interpolateGreys, interpolateOranges, interpolateOrRd, interpolatePiYG, interpolatePRGn, interpolatePuBu, interpolatePuBuGn, interpolatePuOr, interpolatePuRd, interpolatePurples, interpolateRdBu, interpolateRdGy, interpolateRdPu, interpolateRdYlBu, interpolateRdYlGn, interpolateReds, interpolateSpectral, interpolateYlGn, interpolateYlGnBu, interpolateYlOrBr, interpolateYlOrRd, interpolateTurbo, interpolateViridis, interpolateMagma, interpolateInferno, interpolatePlasma, interpolateCividis, interpolateCubehelixDefault, interpolateWarm, interpolateCool, interpolateRainbow, interpolateSinebow, schemeAccent, schemeBlues, schemeBrBG, schemeBuGn, schemeBuPu, schemeCategory10, schemeDark2, schemeGnBu, schemeGreens, schemeGreys, schemeOranges, schemeOrRd, schemePaired, schemePastel1, schemePastel2, schemePiYG, schemePRGn, schemePuBu, schemePuBuGn, schemePuOr, schemePuRd, schemePurples, schemeRdBu, schemeRdGy, schemeRdPu, schemeRdYlBu, schemeRdYlGn, schemeReds, schemeSet1, schemeSet2, schemeSet3, schemeSpectral, schemeTableau10, schemeYlGn, schemeYlGnBu, schemeYlOrBr, schemeYlOrRd } from 'd3-scale-chromatic';
|
|
2
|
+
import { quantize } from 'd3-interpolate';
|
|
3
|
+
export const categoricalSchemes = new Map([
|
|
4
|
+
['accent', schemeAccent],
|
|
5
|
+
['category10', schemeCategory10],
|
|
6
|
+
['dark2', schemeDark2],
|
|
7
|
+
['paired', schemePaired],
|
|
8
|
+
['pastel1', schemePastel1],
|
|
9
|
+
['pastel2', schemePastel2],
|
|
10
|
+
['set1', schemeSet1],
|
|
11
|
+
['set2', schemeSet2],
|
|
12
|
+
['set3', schemeSet3],
|
|
13
|
+
['tableau10', schemeTableau10]
|
|
14
|
+
]);
|
|
15
|
+
export function isCategoricalScheme(scheme) {
|
|
16
|
+
return scheme != null && categoricalSchemes.has(`${scheme}`.toLowerCase());
|
|
17
|
+
}
|
|
18
|
+
const ordinalSchemes = new Map([
|
|
19
|
+
// diverging
|
|
20
|
+
['brbg', scheme11(schemeBrBG, interpolateBrBG)],
|
|
21
|
+
['prgn', scheme11(schemePRGn, interpolatePRGn)],
|
|
22
|
+
['piyg', scheme11(schemePiYG, interpolatePiYG)],
|
|
23
|
+
['puor', scheme11(schemePuOr, interpolatePuOr)],
|
|
24
|
+
['rdbu', scheme11(schemeRdBu, interpolateRdBu)],
|
|
25
|
+
['rdgy', scheme11(schemeRdGy, interpolateRdGy)],
|
|
26
|
+
['rdylbu', scheme11(schemeRdYlBu, interpolateRdYlBu)],
|
|
27
|
+
['rdylgn', scheme11(schemeRdYlGn, interpolateRdYlGn)],
|
|
28
|
+
['spectral', scheme11(schemeSpectral, interpolateSpectral)],
|
|
29
|
+
// reversed diverging (for temperature data)
|
|
30
|
+
['burd', scheme11r(schemeRdBu, interpolateRdBu)],
|
|
31
|
+
['buylrd', scheme11r(schemeRdYlBu, interpolateRdYlBu)],
|
|
32
|
+
// sequential (single-hue)
|
|
33
|
+
['blues', scheme9(schemeBlues, interpolateBlues)],
|
|
34
|
+
['greens', scheme9(schemeGreens, interpolateGreens)],
|
|
35
|
+
['greys', scheme9(schemeGreys, interpolateGreys)],
|
|
36
|
+
['oranges', scheme9(schemeOranges, interpolateOranges)],
|
|
37
|
+
['purples', scheme9(schemePurples, interpolatePurples)],
|
|
38
|
+
['reds', scheme9(schemeReds, interpolateReds)],
|
|
39
|
+
// sequential (multi-hue)
|
|
40
|
+
['turbo', schemei(interpolateTurbo)],
|
|
41
|
+
['viridis', schemei(interpolateViridis)],
|
|
42
|
+
['magma', schemei(interpolateMagma)],
|
|
43
|
+
['inferno', schemei(interpolateInferno)],
|
|
44
|
+
['plasma', schemei(interpolatePlasma)],
|
|
45
|
+
['cividis', schemei(interpolateCividis)],
|
|
46
|
+
['cubehelix', schemei(interpolateCubehelixDefault)],
|
|
47
|
+
['warm', schemei(interpolateWarm)],
|
|
48
|
+
['cool', schemei(interpolateCool)],
|
|
49
|
+
['bugn', scheme9(schemeBuGn, interpolateBuGn)],
|
|
50
|
+
['bupu', scheme9(schemeBuPu, interpolateBuPu)],
|
|
51
|
+
['gnbu', scheme9(schemeGnBu, interpolateGnBu)],
|
|
52
|
+
['orrd', scheme9(schemeOrRd, interpolateOrRd)],
|
|
53
|
+
['pubu', scheme9(schemePuBu, interpolatePuBu)],
|
|
54
|
+
['pubugn', scheme9(schemePuBuGn, interpolatePuBuGn)],
|
|
55
|
+
['purd', scheme9(schemePuRd, interpolatePuRd)],
|
|
56
|
+
['rdpu', scheme9(schemeRdPu, interpolateRdPu)],
|
|
57
|
+
['ylgn', scheme9(schemeYlGn, interpolateYlGn)],
|
|
58
|
+
['ylgnbu', scheme9(schemeYlGnBu, interpolateYlGnBu)],
|
|
59
|
+
['ylorbr', scheme9(schemeYlOrBr, interpolateYlOrBr)],
|
|
60
|
+
['ylorrd', scheme9(schemeYlOrRd, interpolateYlOrRd)],
|
|
61
|
+
// cyclical
|
|
62
|
+
['rainbow', schemeicyclical(interpolateRainbow)],
|
|
63
|
+
['sinebow', schemeicyclical(interpolateSinebow)]
|
|
64
|
+
]);
|
|
65
|
+
export function isOrdinalScheme(scheme) {
|
|
66
|
+
return ordinalSchemes.has(scheme);
|
|
67
|
+
}
|
|
68
|
+
function scheme9(scheme, interpolate) {
|
|
69
|
+
return (n) => {
|
|
70
|
+
if (n === 1)
|
|
71
|
+
return [scheme[3][1]]; // favor midpoint
|
|
72
|
+
if (n === 2)
|
|
73
|
+
return [scheme[3][1], scheme[3][2]]; // favor darker
|
|
74
|
+
n = Math.max(3, Math.floor(n));
|
|
75
|
+
return n > 9 ? quantize(interpolate, n) : scheme[n];
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function scheme11(scheme, interpolate) {
|
|
79
|
+
return (n) => {
|
|
80
|
+
if (n === 2)
|
|
81
|
+
return [scheme[3][0], scheme[3][2]]; // favor diverging extrema
|
|
82
|
+
n = Math.max(3, Math.floor(n));
|
|
83
|
+
return n > 11 ? quantize(interpolate, n) : scheme[n];
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function scheme11r(scheme, interpolate) {
|
|
87
|
+
return (n) => {
|
|
88
|
+
if (n === 2)
|
|
89
|
+
return [scheme[3][2], scheme[3][0]]; // favor diverging extrema
|
|
90
|
+
n = Math.max(3, Math.floor(n));
|
|
91
|
+
return n > 11 ? quantize((t) => interpolate(1 - t), n) : scheme[n].slice().reverse();
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function schemei(interpolate) {
|
|
95
|
+
return (n) => quantize(interpolate, Math.max(2, Math.floor(n)));
|
|
96
|
+
}
|
|
97
|
+
function schemeicyclical(interpolate) {
|
|
98
|
+
return (n) => quantize(interpolate, Math.floor(n) + 1).slice(0, -1);
|
|
99
|
+
}
|
|
100
|
+
export function ordinalScheme(scheme) {
|
|
101
|
+
const s = `${scheme}`.toLowerCase();
|
|
102
|
+
if (!ordinalSchemes.has(s))
|
|
103
|
+
throw new Error(`unknown ordinal scheme: ${s}`);
|
|
104
|
+
return ordinalSchemes.get(s);
|
|
105
|
+
}
|
|
106
|
+
export function ordinalRange(scheme, length) {
|
|
107
|
+
const s = ordinalScheme(scheme);
|
|
108
|
+
const r = typeof s === 'function' ? s({ length }) : s;
|
|
109
|
+
return r.length !== length ? r.slice(0, length) : r;
|
|
110
|
+
}
|
|
111
|
+
// If the specified domain contains only booleans (ignoring null and undefined),
|
|
112
|
+
// returns a corresponding range where false is mapped to the low color and true
|
|
113
|
+
// is mapped to the high color of the specified scheme.
|
|
114
|
+
export function maybeBooleanRange(domain, scheme = 'greys') {
|
|
115
|
+
const range = new Set();
|
|
116
|
+
const [f, t] = ordinalRange(scheme, 2);
|
|
117
|
+
for (const value of domain) {
|
|
118
|
+
if (value == null)
|
|
119
|
+
continue;
|
|
120
|
+
if (value === true)
|
|
121
|
+
range.add(t);
|
|
122
|
+
else if (value === false)
|
|
123
|
+
range.add(f);
|
|
124
|
+
else
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
return [...range];
|
|
128
|
+
}
|
|
129
|
+
const quantitativeSchemes = new Map([
|
|
130
|
+
// diverging
|
|
131
|
+
['brbg', interpolateBrBG],
|
|
132
|
+
['prgn', interpolatePRGn],
|
|
133
|
+
['piyg', interpolatePiYG],
|
|
134
|
+
['puor', interpolatePuOr],
|
|
135
|
+
['rdbu', interpolateRdBu],
|
|
136
|
+
['rdgy', interpolateRdGy],
|
|
137
|
+
['rdylbu', interpolateRdYlBu],
|
|
138
|
+
['rdylgn', interpolateRdYlGn],
|
|
139
|
+
['spectral', interpolateSpectral],
|
|
140
|
+
// reversed diverging (for temperature data)
|
|
141
|
+
['burd', (t) => interpolateRdBu(1 - t)],
|
|
142
|
+
['buylrd', (t) => interpolateRdYlBu(1 - t)],
|
|
143
|
+
// sequential (single-hue)
|
|
144
|
+
['blues', interpolateBlues],
|
|
145
|
+
['greens', interpolateGreens],
|
|
146
|
+
['greys', interpolateGreys],
|
|
147
|
+
['purples', interpolatePurples],
|
|
148
|
+
['reds', interpolateReds],
|
|
149
|
+
['oranges', interpolateOranges],
|
|
150
|
+
// sequential (multi-hue)
|
|
151
|
+
['turbo', interpolateTurbo],
|
|
152
|
+
['viridis', interpolateViridis],
|
|
153
|
+
['magma', interpolateMagma],
|
|
154
|
+
['inferno', interpolateInferno],
|
|
155
|
+
['plasma', interpolatePlasma],
|
|
156
|
+
['cividis', interpolateCividis],
|
|
157
|
+
['cubehelix', interpolateCubehelixDefault],
|
|
158
|
+
['warm', interpolateWarm],
|
|
159
|
+
['cool', interpolateCool],
|
|
160
|
+
['bugn', interpolateBuGn],
|
|
161
|
+
['bupu', interpolateBuPu],
|
|
162
|
+
['gnbu', interpolateGnBu],
|
|
163
|
+
['orrd', interpolateOrRd],
|
|
164
|
+
['pubugn', interpolatePuBuGn],
|
|
165
|
+
['pubu', interpolatePuBu],
|
|
166
|
+
['purd', interpolatePuRd],
|
|
167
|
+
['rdpu', interpolateRdPu],
|
|
168
|
+
['ylgnbu', interpolateYlGnBu],
|
|
169
|
+
['ylgn', interpolateYlGn],
|
|
170
|
+
['ylorbr', interpolateYlOrBr],
|
|
171
|
+
['ylorrd', interpolateYlOrRd],
|
|
172
|
+
// cyclical
|
|
173
|
+
['rainbow', interpolateRainbow],
|
|
174
|
+
['sinebow', interpolateSinebow]
|
|
175
|
+
]);
|
|
176
|
+
export function isQuantitativeScheme(scheme) {
|
|
177
|
+
return quantitativeSchemes.has(scheme);
|
|
178
|
+
}
|
|
179
|
+
export function quantitativeScheme(scheme) {
|
|
180
|
+
const s = `${scheme}`.toLowerCase();
|
|
181
|
+
if (!quantitativeSchemes.has(s))
|
|
182
|
+
throw new Error(`unknown quantitative scheme: ${s}`);
|
|
183
|
+
return quantitativeSchemes.get(s);
|
|
184
|
+
}
|
|
185
|
+
const divergingSchemes = new Set([
|
|
186
|
+
'brbg',
|
|
187
|
+
'prgn',
|
|
188
|
+
'piyg',
|
|
189
|
+
'puor',
|
|
190
|
+
'rdbu',
|
|
191
|
+
'rdgy',
|
|
192
|
+
'rdylbu',
|
|
193
|
+
'rdylgn',
|
|
194
|
+
'spectral',
|
|
195
|
+
'burd',
|
|
196
|
+
'buylrd'
|
|
197
|
+
]);
|
|
198
|
+
export function isDivergingScheme(scheme) {
|
|
199
|
+
return scheme != null && divergingSchemes.has(`${scheme}`.toLowerCase());
|
|
200
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ColorScheme, RawValue } from '../types.js';
|
|
2
|
+
declare const Scales: Record<string, (domain: number[], range: [number, number]) => (val: any) => any>;
|
|
3
|
+
export declare function createScale(type: keyof typeof Scales, domain: any, range: any, options?: {}): (val: any) => any;
|
|
4
|
+
export declare function createColorScale(type: any, domain: string[] | [number, number] | [Date, Date] | [boolean | boolean], range: RawValue[] | null, scheme: ColorScheme | null): ((d: any) => any) | (unknown[] & string[] & import("d3-scale").ScaleOrdinal<string, unknown, never>) | import("d3-scale").ScaleSequential<string, never>;
|
|
5
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { scaleBand, scaleLinear, scaleTime, scaleSqrt, scaleLog, scaleOrdinal } from 'd3-scale';
|
|
2
|
+
import { scaleSequential, scaleDiverging } from 'd3-scale';
|
|
3
|
+
import { getLogTicks } from './getLogTicks.js';
|
|
4
|
+
import { categoricalSchemes, isCategoricalScheme, isQuantitativeScheme, ordinalScheme, quantitativeScheme } from './colors.js';
|
|
5
|
+
import { isColorOrNull } from './typeChecks.js';
|
|
6
|
+
const Scales = {
|
|
7
|
+
band: scaleBand,
|
|
8
|
+
linear: scaleLinear,
|
|
9
|
+
time: scaleTime,
|
|
10
|
+
sqrt: scaleSqrt,
|
|
11
|
+
log: scaleLog,
|
|
12
|
+
ordinal: scaleOrdinal,
|
|
13
|
+
sequential: scaleSequential,
|
|
14
|
+
diverging: scaleDiverging
|
|
15
|
+
};
|
|
16
|
+
export function createScale(type, domain, range, options = {}) {
|
|
17
|
+
const scale = Scales[type](domain, range);
|
|
18
|
+
// allow setting arbiraty scale options
|
|
19
|
+
for (const [key, val] of Object.entries(options)) {
|
|
20
|
+
if (typeof scale[key] === 'function')
|
|
21
|
+
scale[key](val);
|
|
22
|
+
else
|
|
23
|
+
console.warn('unknown scale setter ' + key);
|
|
24
|
+
}
|
|
25
|
+
if (type === 'log') {
|
|
26
|
+
// overwrite scaleLog's internal ticks() method
|
|
27
|
+
scale.ticks = (count) => getLogTicks(domain, count);
|
|
28
|
+
// console.log({domain})
|
|
29
|
+
// console.log(getLogTicks(domain, 5))
|
|
30
|
+
}
|
|
31
|
+
return scale;
|
|
32
|
+
}
|
|
33
|
+
const identity = (d) => d;
|
|
34
|
+
export function createColorScale(type, domain, range, scheme) {
|
|
35
|
+
if (type === 'identity')
|
|
36
|
+
return identity;
|
|
37
|
+
if (type === 'band') {
|
|
38
|
+
if (domain.every(isColorOrNull)) {
|
|
39
|
+
return identity;
|
|
40
|
+
}
|
|
41
|
+
const colorRange = Array.isArray(range)
|
|
42
|
+
? range
|
|
43
|
+
: !scheme
|
|
44
|
+
? categoricalSchemes.get('tableau10')
|
|
45
|
+
: isCategoricalScheme(scheme)
|
|
46
|
+
? categoricalSchemes.get(scheme)
|
|
47
|
+
: ordinalScheme(scheme)(domain.length);
|
|
48
|
+
return scaleOrdinal().domain(domain).range(colorRange);
|
|
49
|
+
}
|
|
50
|
+
else if (type === 'linear') {
|
|
51
|
+
const colorInterpolator = isQuantitativeScheme(scheme)
|
|
52
|
+
? quantitativeScheme(scheme)
|
|
53
|
+
: quantitativeScheme('blues');
|
|
54
|
+
return scaleSequential(domain, colorInterpolator);
|
|
55
|
+
}
|
|
56
|
+
return (d) => d;
|
|
57
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MARK_PROP_CHANNEL } from '../contants.js';
|
|
2
|
+
import resolveChannel from './resolveChannel.js';
|
|
3
|
+
const styleProps = {
|
|
4
|
+
fill: 'fill',
|
|
5
|
+
stroke: 'stroke',
|
|
6
|
+
strokeWidth: 'stroke-width',
|
|
7
|
+
strokeDasharray: 'stroke-dasharray',
|
|
8
|
+
fillOpacity: 'fill-opacity',
|
|
9
|
+
strokeOpacity: 'stroke-opacity',
|
|
10
|
+
fontSize: 'font-size',
|
|
11
|
+
opacity: 'opacity'
|
|
12
|
+
};
|
|
13
|
+
export default function (datum, props) {
|
|
14
|
+
return Object.entries(styleProps)
|
|
15
|
+
.filter(([key, cssKey]) => cssKey && props[key] != null)
|
|
16
|
+
.map(([key, cssKey]) => `${cssKey}: ${resolveChannel(MARK_PROP_CHANNEL[key], datum, props[key])}`)
|
|
17
|
+
.join(';');
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getLogTicks(domain: [number, number], count?: number): number[];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ticks as ticksArray } from 'd3-array';
|
|
2
|
+
export function getLogTicks(domain, count = 6) {
|
|
3
|
+
const inverted = domain[0] < 0 && domain[1] < 0;
|
|
4
|
+
if (inverted)
|
|
5
|
+
domain = [domain[0] * -1, domain[1] * -1];
|
|
6
|
+
const reversed = domain[1] < domain[0];
|
|
7
|
+
if (reversed)
|
|
8
|
+
domain = domain.slice(0).reverse();
|
|
9
|
+
if (domain[0] < 0 || domain[1] < 0)
|
|
10
|
+
return [];
|
|
11
|
+
if (domain[0] === 0)
|
|
12
|
+
return ticksArray(domain[0], domain[1], count - 2);
|
|
13
|
+
let mult = Math.pow(10, Math.floor(Math.log10(Math.abs(domain[1] - domain[0]))) - 1);
|
|
14
|
+
count += 2;
|
|
15
|
+
let candidates = getTickCandidates(domain, mult);
|
|
16
|
+
if (candidates[0].num > count) {
|
|
17
|
+
// too many ticks
|
|
18
|
+
while (candidates[0].num > count) {
|
|
19
|
+
mult *= 10;
|
|
20
|
+
candidates = getTickCandidates(domain, mult);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (candidates[candidates.length - 1].num < count) {
|
|
24
|
+
// not enough ticks, let's fallback to linear ticks
|
|
25
|
+
const ticksList = ticksArray(domain[0], domain[1], count - 2);
|
|
26
|
+
if (reversed)
|
|
27
|
+
ticksList.reverse();
|
|
28
|
+
return ticksList;
|
|
29
|
+
}
|
|
30
|
+
count -= 2;
|
|
31
|
+
const ticksList = candidates
|
|
32
|
+
.map((d) => ({
|
|
33
|
+
...d,
|
|
34
|
+
ticks: d.ticks.filter((t) => t >= domain[0] && t <= domain[1])
|
|
35
|
+
}))
|
|
36
|
+
.map((d) => ({ ...d, diff: Math.abs(d.ticks.length - count) }))
|
|
37
|
+
.sort((a, b) => a.diff - b.diff)[0].ticks;
|
|
38
|
+
if (reversed)
|
|
39
|
+
ticksList.reverse();
|
|
40
|
+
if (inverted)
|
|
41
|
+
return ticksList.map((t) => t * -1);
|
|
42
|
+
return ticksList;
|
|
43
|
+
}
|
|
44
|
+
const logSeries = [[10], [5, 4, 5], [3, 10 / 3], [2, 2.5, 2], [1.5, 2, 5 / 3, 2]];
|
|
45
|
+
function getTickCandidates(domain, mult = 1) {
|
|
46
|
+
return logSeries.map((factors) => {
|
|
47
|
+
let i = Math.pow(10, Math.floor(Math.log10(domain[0])));
|
|
48
|
+
let f = 0;
|
|
49
|
+
const r = [i];
|
|
50
|
+
while (i < domain[1] && r.length < 50) {
|
|
51
|
+
i *= factors[f] * mult;
|
|
52
|
+
r.push(i);
|
|
53
|
+
f = (f + 1) % factors.length;
|
|
54
|
+
}
|
|
55
|
+
return { ticks: r, num: r.length };
|
|
56
|
+
});
|
|
57
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default function (value) {
|
|
2
|
+
if (typeof value !== 'object' || value === null)
|
|
3
|
+
return false;
|
|
4
|
+
if (Object.prototype.toString.call(value) !== '[object Object]')
|
|
5
|
+
return false;
|
|
6
|
+
const proto = Object.getPrototypeOf(value);
|
|
7
|
+
if (proto === null)
|
|
8
|
+
return true;
|
|
9
|
+
const Ctor = Object.prototype.hasOwnProperty.call(proto, 'constructor') && proto.constructor;
|
|
10
|
+
return (typeof Ctor === 'function' &&
|
|
11
|
+
Ctor instanceof Ctor &&
|
|
12
|
+
Function.prototype.call(Ctor) === Function.prototype.call(value));
|
|
13
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2
|
+
function isObject(item) {
|
|
3
|
+
return item && typeof item === 'object' && !Array.isArray(item);
|
|
4
|
+
}
|
|
5
|
+
export default function mergeDeep(target, ...sources) {
|
|
6
|
+
if (!sources.length)
|
|
7
|
+
return target;
|
|
8
|
+
const source = sources.shift();
|
|
9
|
+
if (isObject(target) && isObject(source)) {
|
|
10
|
+
for (const key in source) {
|
|
11
|
+
if (isObject(source[key])) {
|
|
12
|
+
if (!target[key]) {
|
|
13
|
+
Object.assign(target, { [key]: {} });
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
target[key] = Object.assign({}, target[key]);
|
|
17
|
+
}
|
|
18
|
+
mergeDeep(target[key], source[key]);
|
|
19
|
+
}
|
|
20
|
+
else if (source[key] !== null) {
|
|
21
|
+
Object.assign(target, { [key]: source[key] });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return mergeDeep(target, ...sources);
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function removeIdenticalLines(input: string[][]): string[][];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export default function removeIdenticalLines(input) {
|
|
2
|
+
const uniqueLines = [];
|
|
3
|
+
if (!input.length)
|
|
4
|
+
return input;
|
|
5
|
+
for (let c = 0; c < input.length; c++) {
|
|
6
|
+
uniqueLines.push([]);
|
|
7
|
+
}
|
|
8
|
+
for (let l = 0; l < input[0].length; l++) {
|
|
9
|
+
const isIdentical = input.every((value) => input[0][l] === value[l]);
|
|
10
|
+
for (let c = 0; c < input.length; c++) {
|
|
11
|
+
if (!isIdentical)
|
|
12
|
+
uniqueLines[c].push(input[c][l]);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return uniqueLines;
|
|
16
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import isDataRecord from './isDataRecord.js';
|
|
2
|
+
export default function (channel, datum, accessor = null) {
|
|
3
|
+
if ((channel === 'x' || channel === 'y') && Array.isArray(datum) && accessor === null) {
|
|
4
|
+
// special case for [[x0,y0], [x1,y1], ...] format
|
|
5
|
+
return datum[channel === 'x' ? 0 : 1];
|
|
6
|
+
}
|
|
7
|
+
else if (isDataRecord(datum)) {
|
|
8
|
+
// use accessor function
|
|
9
|
+
if (typeof accessor === 'function')
|
|
10
|
+
return accessor(datum.___orig___ ? datum.___orig___ : datum);
|
|
11
|
+
// use accessor string
|
|
12
|
+
if (typeof accessor === 'string' && datum[accessor] !== undefined)
|
|
13
|
+
return datum[accessor];
|
|
14
|
+
// fallback to channel name as accessor
|
|
15
|
+
if (accessor === null && datum[channel] !== undefined)
|
|
16
|
+
return datum[channel];
|
|
17
|
+
// interpret accessor as constant
|
|
18
|
+
return accessor;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
// return single value or accessor
|
|
22
|
+
return typeof accessor === 'function'
|
|
23
|
+
? accessor(datum)
|
|
24
|
+
: accessor !== null
|
|
25
|
+
? accessor
|
|
26
|
+
: datum;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type SymbolType } from 'd3-shape';
|
|
2
|
+
export declare const sqrt3: number;
|
|
3
|
+
export declare const sqrt4_3: number;
|
|
4
|
+
export declare function isSymbol(value: string | SymbolType): boolean;
|
|
5
|
+
export declare function maybeSymbol(symbol: SymbolType | string): SymbolType;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { symbolAsterisk, symbolDiamond2, symbolPlus, symbolSquare2, symbolTriangle2, symbolX as symbolTimes, symbolCircle, symbolCross, symbolDiamond, symbolSquare, symbolStar, symbolTriangle, symbolWye } from 'd3-shape';
|
|
2
|
+
export const sqrt3 = Math.sqrt(3);
|
|
3
|
+
export const sqrt4_3 = 2 / sqrt3;
|
|
4
|
+
const symbolHexagon = {
|
|
5
|
+
draw(context, size) {
|
|
6
|
+
const rx = Math.sqrt(size / Math.PI), ry = rx * sqrt4_3, hy = ry / 2;
|
|
7
|
+
context.moveTo(0, ry);
|
|
8
|
+
context.lineTo(rx, hy);
|
|
9
|
+
context.lineTo(rx, -hy);
|
|
10
|
+
context.lineTo(0, -ry);
|
|
11
|
+
context.lineTo(-rx, -hy);
|
|
12
|
+
context.lineTo(-rx, hy);
|
|
13
|
+
context.closePath();
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const symbols = new Map([
|
|
17
|
+
['asterisk', symbolAsterisk],
|
|
18
|
+
['circle', symbolCircle],
|
|
19
|
+
['cross', symbolCross],
|
|
20
|
+
['diamond', symbolDiamond],
|
|
21
|
+
['diamond2', symbolDiamond2],
|
|
22
|
+
['hexagon', symbolHexagon],
|
|
23
|
+
['plus', symbolPlus],
|
|
24
|
+
['square', symbolSquare],
|
|
25
|
+
['square2', symbolSquare2],
|
|
26
|
+
['star', symbolStar],
|
|
27
|
+
['times', symbolTimes],
|
|
28
|
+
['triangle', symbolTriangle],
|
|
29
|
+
['triangle2', symbolTriangle2],
|
|
30
|
+
['wye', symbolWye]
|
|
31
|
+
]);
|
|
32
|
+
function isSymbolObject(value) {
|
|
33
|
+
if (typeof value === 'string')
|
|
34
|
+
return false;
|
|
35
|
+
return value && typeof value.draw === 'function';
|
|
36
|
+
}
|
|
37
|
+
export function isSymbol(value) {
|
|
38
|
+
if (isSymbolObject(value))
|
|
39
|
+
return true;
|
|
40
|
+
if (typeof value !== 'string')
|
|
41
|
+
return false;
|
|
42
|
+
return symbols.has(value.toLowerCase());
|
|
43
|
+
}
|
|
44
|
+
export function maybeSymbol(symbol) {
|
|
45
|
+
if (symbol == null || isSymbolObject(symbol))
|
|
46
|
+
return symbol;
|
|
47
|
+
const value = symbols.get(`${symbol}`.toLowerCase());
|
|
48
|
+
if (value)
|
|
49
|
+
return value;
|
|
50
|
+
throw new Error(`invalid symbol: ${symbol}`);
|
|
51
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RawValue } from '../types.js';
|
|
2
|
+
export declare function isBooleanOrNull(v: RawValue): boolean;
|
|
3
|
+
export declare function isDateOrNull(v: RawValue): boolean;
|
|
4
|
+
export declare function isNumberOrNull(v: RawValue): boolean;
|
|
5
|
+
export declare function isStringOrNull(v: RawValue): boolean;
|
|
6
|
+
export declare function isColorOrNull(v: RawValue): boolean;
|
|
7
|
+
export declare function isOpacityOrNull(v: RawValue): boolean;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import chroma from 'chroma-js';
|
|
2
|
+
import { isDate, isFinite } from 'underscore';
|
|
3
|
+
export function isBooleanOrNull(v) {
|
|
4
|
+
return v == null || typeof v === 'boolean';
|
|
5
|
+
}
|
|
6
|
+
export function isDateOrNull(v) {
|
|
7
|
+
return v == null || isDate(v);
|
|
8
|
+
}
|
|
9
|
+
export function isNumberOrNull(v) {
|
|
10
|
+
return v == null || isFinite(v);
|
|
11
|
+
}
|
|
12
|
+
export function isStringOrNull(v) {
|
|
13
|
+
return v == null || typeof v === 'string';
|
|
14
|
+
}
|
|
15
|
+
export function isColorOrNull(v) {
|
|
16
|
+
// todo: maybe not use chroma.js here to save kb
|
|
17
|
+
return v == null || (typeof v === 'string' && chroma.valid(v));
|
|
18
|
+
}
|
|
19
|
+
export function isOpacityOrNull(v) {
|
|
20
|
+
return v == null || (typeof v === 'number' && isFinite(v) && v >= 0 && v <= 1);
|
|
21
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { default as AxisX } from './marks/AxisX.svelte';
|
|
2
|
+
export { default as AxisY } from './marks/AxisY.svelte';
|
|
3
|
+
export { default as ColorLegend } from './marks/ColorLegend.svelte';
|
|
4
|
+
export { default as Area } from './marks/Area.svelte';
|
|
5
|
+
export { default as AreaX } from './marks/AreaX.svelte';
|
|
6
|
+
export { default as AreaY } from './marks/AreaY.svelte';
|
|
7
|
+
export { default as Dot } from './marks/Dot.svelte';
|
|
8
|
+
export { default as DotX } from './marks/DotX.svelte';
|
|
9
|
+
export { default as DotY } from './marks/DotY.svelte';
|
|
10
|
+
export { default as Frame } from './marks/Frame.svelte';
|
|
11
|
+
export { default as GridX } from './marks/GridX.svelte';
|
|
12
|
+
export { default as GridY } from './marks/GridY.svelte';
|
|
13
|
+
export { default as Line } from './marks/Line.svelte';
|
|
14
|
+
export { default as LineX } from './marks/LineX.svelte';
|
|
15
|
+
export { default as LineY } from './marks/LineY.svelte';
|
|
16
|
+
export { default as Plot } from './Plot.svelte';
|
|
17
|
+
export { default as RuleX } from './marks/RuleX.svelte';
|
|
18
|
+
export { default as RuleY } from './marks/RuleY.svelte';
|
|
19
|
+
export { default as SymbolLegend } from './marks/SymbolLegend.svelte';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Reexport your entry components here
|
|
2
|
+
export { default as AxisX } from './marks/AxisX.svelte';
|
|
3
|
+
export { default as AxisY } from './marks/AxisY.svelte';
|
|
4
|
+
export { default as ColorLegend } from './marks/ColorLegend.svelte';
|
|
5
|
+
export { default as Area } from './marks/Area.svelte';
|
|
6
|
+
export { default as AreaX } from './marks/AreaX.svelte';
|
|
7
|
+
export { default as AreaY } from './marks/AreaY.svelte';
|
|
8
|
+
export { default as Dot } from './marks/Dot.svelte';
|
|
9
|
+
export { default as DotX } from './marks/DotX.svelte';
|
|
10
|
+
export { default as DotY } from './marks/DotY.svelte';
|
|
11
|
+
export { default as Frame } from './marks/Frame.svelte';
|
|
12
|
+
export { default as GridX } from './marks/GridX.svelte';
|
|
13
|
+
export { default as GridY } from './marks/GridY.svelte';
|
|
14
|
+
export { default as Line } from './marks/Line.svelte';
|
|
15
|
+
export { default as LineX } from './marks/LineX.svelte';
|
|
16
|
+
export { default as LineY } from './marks/LineY.svelte';
|
|
17
|
+
export { default as Plot } from './Plot.svelte';
|
|
18
|
+
export { default as RuleX } from './marks/RuleX.svelte';
|
|
19
|
+
export { default as RuleY } from './marks/RuleY.svelte';
|
|
20
|
+
export { default as SymbolLegend } from './marks/SymbolLegend.svelte';
|