@uwdata/mosaic-plot 0.7.0 → 0.7.1
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/mosaic-plot.js +759 -755
- package/dist/mosaic-plot.min.js +12 -12
- package/package.json +5 -5
package/dist/mosaic-plot.js
CHANGED
|
@@ -14157,7 +14157,7 @@ function decimalToNumber(v2, scale3) {
|
|
|
14157
14157
|
let x3 = 0;
|
|
14158
14158
|
if (v2.signed && (v2[n - 1] | 0) < 0) {
|
|
14159
14159
|
for (let i = 0; i < n; ++i) {
|
|
14160
|
-
x3 += ~
|
|
14160
|
+
x3 += ~v2[i] * BASE32[i];
|
|
14161
14161
|
}
|
|
14162
14162
|
x3 = -(x3 + 1);
|
|
14163
14163
|
} else {
|
|
@@ -25954,6 +25954,9 @@ var Accent_default = colors_default("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b176
|
|
|
25954
25954
|
// ../../node_modules/d3-scale-chromatic/src/categorical/Dark2.js
|
|
25955
25955
|
var Dark2_default = colors_default("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
|
|
25956
25956
|
|
|
25957
|
+
// ../../node_modules/d3-scale-chromatic/src/categorical/observable10.js
|
|
25958
|
+
var observable10_default = colors_default("4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0");
|
|
25959
|
+
|
|
25957
25960
|
// ../../node_modules/d3-scale-chromatic/src/categorical/Paired.js
|
|
25958
25961
|
var Paired_default = colors_default("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
|
|
25959
25962
|
|
|
@@ -28164,6 +28167,15 @@ function parse(string2, fallback) {
|
|
|
28164
28167
|
return new Date(string2);
|
|
28165
28168
|
}
|
|
28166
28169
|
|
|
28170
|
+
// ../../node_modules/@observablehq/plot/src/order.js
|
|
28171
|
+
function orderof(values2) {
|
|
28172
|
+
if (values2 == null)
|
|
28173
|
+
return;
|
|
28174
|
+
const first3 = values2[0];
|
|
28175
|
+
const last2 = values2[values2.length - 1];
|
|
28176
|
+
return descending(first3, last2);
|
|
28177
|
+
}
|
|
28178
|
+
|
|
28167
28179
|
// ../../node_modules/@observablehq/plot/src/time.js
|
|
28168
28180
|
var durationSecond2 = 1e3;
|
|
28169
28181
|
var durationMinute2 = durationSecond2 * 60;
|
|
@@ -28757,13 +28769,6 @@ function maybeAnchor(value, name) {
|
|
|
28757
28769
|
function maybeFrameAnchor(value = "middle") {
|
|
28758
28770
|
return maybeAnchor(value, "frameAnchor");
|
|
28759
28771
|
}
|
|
28760
|
-
function orderof(values2) {
|
|
28761
|
-
if (values2 == null)
|
|
28762
|
-
return;
|
|
28763
|
-
const first3 = values2[0];
|
|
28764
|
-
const last2 = values2[values2.length - 1];
|
|
28765
|
-
return descending(first3, last2);
|
|
28766
|
-
}
|
|
28767
28772
|
function inherit2(options = {}, ...rest) {
|
|
28768
28773
|
let o = options;
|
|
28769
28774
|
for (const defaults23 of rest) {
|
|
@@ -28800,6 +28805,15 @@ function named2(things) {
|
|
|
28800
28805
|
function maybeNamed(things) {
|
|
28801
28806
|
return isIterable2(things) ? named2(things) : things;
|
|
28802
28807
|
}
|
|
28808
|
+
function maybeClip(clip) {
|
|
28809
|
+
if (clip === true)
|
|
28810
|
+
clip = "frame";
|
|
28811
|
+
else if (clip === false)
|
|
28812
|
+
clip = null;
|
|
28813
|
+
else if (clip != null)
|
|
28814
|
+
clip = keyword(clip, "clip", ["frame", "sphere"]);
|
|
28815
|
+
return clip;
|
|
28816
|
+
}
|
|
28803
28817
|
|
|
28804
28818
|
// ../../node_modules/@observablehq/plot/src/scales/index.js
|
|
28805
28819
|
var position = Symbol("position");
|
|
@@ -29119,6 +29133,8 @@ function groupn(x3, y3, {
|
|
|
29119
29133
|
extent4.x = x4;
|
|
29120
29134
|
if (Y3)
|
|
29121
29135
|
extent4.y = y4;
|
|
29136
|
+
if (G)
|
|
29137
|
+
extent4.z = f;
|
|
29122
29138
|
if (filter3 && !filter3.reduce(g, extent4))
|
|
29123
29139
|
continue;
|
|
29124
29140
|
groupFacet.push(i++);
|
|
@@ -29217,10 +29233,7 @@ function maybeEvaluator(name, reduce, inputs, asReduce = maybeReduce) {
|
|
|
29217
29233
|
};
|
|
29218
29234
|
}
|
|
29219
29235
|
function maybeGroup(I, X3) {
|
|
29220
|
-
return X3 ?
|
|
29221
|
-
group(I, (i) => X3[i]),
|
|
29222
|
-
first2
|
|
29223
|
-
) : [[, I]];
|
|
29236
|
+
return X3 ? group(I, (i) => X3[i]) : [[, I]];
|
|
29224
29237
|
}
|
|
29225
29238
|
function maybeReduce(reduce, value, fallback = invalidReduce) {
|
|
29226
29239
|
if (reduce == null)
|
|
@@ -29292,6 +29305,8 @@ function maybeGroupReduceFallback(reduce) {
|
|
|
29292
29305
|
return reduceX;
|
|
29293
29306
|
case "y":
|
|
29294
29307
|
return reduceY;
|
|
29308
|
+
case "z":
|
|
29309
|
+
return reduceZ;
|
|
29295
29310
|
}
|
|
29296
29311
|
throw new Error(`invalid group reduce: ${reduce}`);
|
|
29297
29312
|
}
|
|
@@ -29402,6 +29417,11 @@ var reduceY = {
|
|
|
29402
29417
|
return y3;
|
|
29403
29418
|
}
|
|
29404
29419
|
};
|
|
29420
|
+
var reduceZ = {
|
|
29421
|
+
reduceIndex(I, X3, { z }) {
|
|
29422
|
+
return z;
|
|
29423
|
+
}
|
|
29424
|
+
};
|
|
29405
29425
|
function find2(test) {
|
|
29406
29426
|
if (typeof test !== "function")
|
|
29407
29427
|
throw new Error(`invalid test function: ${test}`);
|
|
@@ -29578,48 +29598,14 @@ function getSource(channels, key) {
|
|
|
29578
29598
|
return channel.source === null ? null : channel;
|
|
29579
29599
|
}
|
|
29580
29600
|
|
|
29581
|
-
// ../../node_modules/@observablehq/plot/src/
|
|
29582
|
-
function
|
|
29583
|
-
|
|
29584
|
-
return (
|
|
29585
|
-
if (cacheKeys?.length !== keys.length || cacheKeys.some((k2, i) => k2 !== keys[i])) {
|
|
29586
|
-
cacheKeys = keys;
|
|
29587
|
-
cacheValue = compute(...keys);
|
|
29588
|
-
}
|
|
29589
|
-
return cacheValue;
|
|
29590
|
-
};
|
|
29591
|
-
}
|
|
29592
|
-
|
|
29593
|
-
// ../../node_modules/@observablehq/plot/src/format.js
|
|
29594
|
-
var numberFormat = memoize1((locale3) => {
|
|
29595
|
-
return new Intl.NumberFormat(locale3);
|
|
29596
|
-
});
|
|
29597
|
-
var monthFormat = memoize1((locale3, month) => {
|
|
29598
|
-
return new Intl.DateTimeFormat(locale3, { timeZone: "UTC", ...month && { month } });
|
|
29599
|
-
});
|
|
29600
|
-
var weekdayFormat = memoize1((locale3, weekday) => {
|
|
29601
|
-
return new Intl.DateTimeFormat(locale3, { timeZone: "UTC", ...weekday && { weekday } });
|
|
29602
|
-
});
|
|
29603
|
-
function formatNumber(locale3 = "en-US") {
|
|
29604
|
-
const format3 = numberFormat(locale3);
|
|
29605
|
-
return (i) => i != null && !isNaN(i) ? format3.format(i) : void 0;
|
|
29606
|
-
}
|
|
29607
|
-
function formatMonth(locale3 = "en-US", format3 = "short") {
|
|
29608
|
-
const fmt = monthFormat(locale3, format3);
|
|
29609
|
-
return (i) => i != null && !isNaN(i = +new Date(Date.UTC(2e3, +i))) ? fmt.format(i) : void 0;
|
|
29610
|
-
}
|
|
29611
|
-
function formatWeekday(locale3 = "en-US", format3 = "short") {
|
|
29612
|
-
const fmt = weekdayFormat(locale3, format3);
|
|
29613
|
-
return (i) => i != null && !isNaN(i = +new Date(Date.UTC(2001, 0, +i))) ? fmt.format(i) : void 0;
|
|
29614
|
-
}
|
|
29615
|
-
function formatIsoDate(date2) {
|
|
29616
|
-
return format2(date2, "Invalid Date");
|
|
29601
|
+
// ../../node_modules/@observablehq/plot/src/context.js
|
|
29602
|
+
function createContext(options = {}) {
|
|
29603
|
+
const { document: document2 = typeof window !== "undefined" ? window.document : void 0, clip } = options;
|
|
29604
|
+
return { document: document2, clip: maybeClip(clip) };
|
|
29617
29605
|
}
|
|
29618
|
-
function
|
|
29619
|
-
|
|
29620
|
-
return (v2) => (v2 instanceof Date ? formatIsoDate : typeof v2 === "number" ? number7 : string)(v2);
|
|
29606
|
+
function create3(name, { document: document2 }) {
|
|
29607
|
+
return select_default2(creator_default(name).call(document2.documentElement));
|
|
29621
29608
|
}
|
|
29622
|
-
var formatDefault = formatAuto();
|
|
29623
29609
|
|
|
29624
29610
|
// ../../node_modules/@observablehq/plot/src/warnings.js
|
|
29625
29611
|
var warnings = 0;
|
|
@@ -29638,578 +29624,182 @@ function warn(message) {
|
|
|
29638
29624
|
++warnings;
|
|
29639
29625
|
}
|
|
29640
29626
|
|
|
29641
|
-
// ../../node_modules/@observablehq/plot/src/
|
|
29642
|
-
var
|
|
29643
|
-
var
|
|
29644
|
-
|
|
29645
|
-
|
|
29646
|
-
|
|
29647
|
-
|
|
29648
|
-
|
|
29649
|
-
|
|
29650
|
-
|
|
29651
|
-
|
|
29652
|
-
|
|
29653
|
-
|
|
29654
|
-
|
|
29655
|
-
|
|
29656
|
-
|
|
29657
|
-
|
|
29658
|
-
|
|
29659
|
-
|
|
29660
|
-
|
|
29661
|
-
|
|
29662
|
-
|
|
29663
|
-
|
|
29664
|
-
|
|
29665
|
-
|
|
29666
|
-
|
|
29667
|
-
|
|
29668
|
-
|
|
29669
|
-
|
|
29670
|
-
|
|
29671
|
-
|
|
29672
|
-
|
|
29673
|
-
|
|
29674
|
-
|
|
29675
|
-
stroke: defaultStroke = "none",
|
|
29676
|
-
strokeOpacity: defaultStrokeOpacity,
|
|
29677
|
-
strokeWidth: defaultStrokeWidth,
|
|
29678
|
-
strokeLinecap: defaultStrokeLinecap,
|
|
29679
|
-
strokeLinejoin: defaultStrokeLinejoin,
|
|
29680
|
-
strokeMiterlimit: defaultStrokeMiterlimit,
|
|
29681
|
-
paintOrder: defaultPaintOrder
|
|
29682
|
-
}) {
|
|
29683
|
-
if (defaultFill === null) {
|
|
29684
|
-
fill = null;
|
|
29685
|
-
fillOpacity = null;
|
|
29686
|
-
}
|
|
29687
|
-
if (defaultStroke === null) {
|
|
29688
|
-
stroke = null;
|
|
29689
|
-
strokeOpacity = null;
|
|
29627
|
+
// ../../node_modules/@observablehq/plot/src/projection.js
|
|
29628
|
+
var pi4 = Math.PI;
|
|
29629
|
+
var tau5 = 2 * pi4;
|
|
29630
|
+
var defaultAspectRatio = 0.618;
|
|
29631
|
+
function createProjection({
|
|
29632
|
+
projection: projection3,
|
|
29633
|
+
inset: globalInset = 0,
|
|
29634
|
+
insetTop = globalInset,
|
|
29635
|
+
insetRight = globalInset,
|
|
29636
|
+
insetBottom = globalInset,
|
|
29637
|
+
insetLeft = globalInset
|
|
29638
|
+
} = {}, dimensions) {
|
|
29639
|
+
if (projection3 == null)
|
|
29640
|
+
return;
|
|
29641
|
+
if (typeof projection3.stream === "function")
|
|
29642
|
+
return projection3;
|
|
29643
|
+
let options;
|
|
29644
|
+
let domain;
|
|
29645
|
+
let clip = "frame";
|
|
29646
|
+
if (isObject2(projection3)) {
|
|
29647
|
+
let inset;
|
|
29648
|
+
({
|
|
29649
|
+
type: projection3,
|
|
29650
|
+
domain,
|
|
29651
|
+
inset,
|
|
29652
|
+
insetTop = inset !== void 0 ? inset : insetTop,
|
|
29653
|
+
insetRight = inset !== void 0 ? inset : insetRight,
|
|
29654
|
+
insetBottom = inset !== void 0 ? inset : insetBottom,
|
|
29655
|
+
insetLeft = inset !== void 0 ? inset : insetLeft,
|
|
29656
|
+
clip = clip,
|
|
29657
|
+
...options
|
|
29658
|
+
} = projection3);
|
|
29659
|
+
if (projection3 == null)
|
|
29660
|
+
return;
|
|
29690
29661
|
}
|
|
29691
|
-
if (
|
|
29692
|
-
|
|
29693
|
-
|
|
29694
|
-
|
|
29695
|
-
|
|
29696
|
-
|
|
29662
|
+
if (typeof projection3 !== "function")
|
|
29663
|
+
({ type: projection3 } = namedProjection(projection3));
|
|
29664
|
+
const { width, height, marginLeft, marginRight, marginTop, marginBottom } = dimensions;
|
|
29665
|
+
const dx = width - marginLeft - marginRight - insetLeft - insetRight;
|
|
29666
|
+
const dy = height - marginTop - marginBottom - insetTop - insetBottom;
|
|
29667
|
+
projection3 = projection3?.({ width: dx, height: dy, clip, ...options });
|
|
29668
|
+
if (projection3 == null)
|
|
29669
|
+
return;
|
|
29670
|
+
clip = maybePostClip(clip, marginLeft, marginTop, width - marginRight, height - marginBottom);
|
|
29671
|
+
let tx = marginLeft + insetLeft;
|
|
29672
|
+
let ty = marginTop + insetTop;
|
|
29673
|
+
let transform3;
|
|
29674
|
+
if (domain != null) {
|
|
29675
|
+
const [[x06, y06], [x12, y12]] = path_default(projection3).bounds(domain);
|
|
29676
|
+
const k2 = Math.min(dx / (x12 - x06), dy / (y12 - y06));
|
|
29677
|
+
if (k2 > 0) {
|
|
29678
|
+
tx -= (k2 * (x06 + x12) - dx) / 2;
|
|
29679
|
+
ty -= (k2 * (y06 + y12) - dy) / 2;
|
|
29680
|
+
transform3 = transform_default({
|
|
29681
|
+
point(x3, y3) {
|
|
29682
|
+
this.stream.point(x3 * k2 + tx, y3 * k2 + ty);
|
|
29683
|
+
}
|
|
29684
|
+
});
|
|
29685
|
+
} else {
|
|
29686
|
+
warn(`Warning: the projection could not be fit to the specified domain; using the default scale.`);
|
|
29687
|
+
}
|
|
29697
29688
|
}
|
|
29698
|
-
|
|
29699
|
-
|
|
29700
|
-
|
|
29701
|
-
|
|
29702
|
-
|
|
29703
|
-
|
|
29704
|
-
|
|
29705
|
-
|
|
29706
|
-
|
|
29707
|
-
|
|
29708
|
-
|
|
29709
|
-
|
|
29710
|
-
|
|
29711
|
-
|
|
29712
|
-
|
|
29713
|
-
|
|
29689
|
+
transform3 ??= tx === 0 && ty === 0 ? identity8() : transform_default({
|
|
29690
|
+
point(x3, y3) {
|
|
29691
|
+
this.stream.point(x3 + tx, y3 + ty);
|
|
29692
|
+
}
|
|
29693
|
+
});
|
|
29694
|
+
return { stream: (s2) => projection3.stream(transform3.stream(clip(s2))) };
|
|
29695
|
+
}
|
|
29696
|
+
function namedProjection(projection3) {
|
|
29697
|
+
switch (`${projection3}`.toLowerCase()) {
|
|
29698
|
+
case "albers-usa":
|
|
29699
|
+
return scaleProjection(albersUsa_default, 0.7463, 0.4673);
|
|
29700
|
+
case "albers":
|
|
29701
|
+
return conicProjection2(albers_default, 0.7463, 0.4673);
|
|
29702
|
+
case "azimuthal-equal-area":
|
|
29703
|
+
return scaleProjection(azimuthalEqualArea_default, 4, 4);
|
|
29704
|
+
case "azimuthal-equidistant":
|
|
29705
|
+
return scaleProjection(azimuthalEquidistant_default, tau5, tau5);
|
|
29706
|
+
case "conic-conformal":
|
|
29707
|
+
return conicProjection2(conicConformal_default, tau5, tau5);
|
|
29708
|
+
case "conic-equal-area":
|
|
29709
|
+
return conicProjection2(conicEqualArea_default, 6.1702, 2.9781);
|
|
29710
|
+
case "conic-equidistant":
|
|
29711
|
+
return conicProjection2(conicEquidistant_default, 7.312, 3.6282);
|
|
29712
|
+
case "equal-earth":
|
|
29713
|
+
return scaleProjection(equalEarth_default, 5.4133, 2.6347);
|
|
29714
|
+
case "equirectangular":
|
|
29715
|
+
return scaleProjection(equirectangular_default, tau5, pi4);
|
|
29716
|
+
case "gnomonic":
|
|
29717
|
+
return scaleProjection(gnomonic_default, 3.4641, 3.4641);
|
|
29718
|
+
case "identity":
|
|
29719
|
+
return { type: identity8 };
|
|
29720
|
+
case "reflect-y":
|
|
29721
|
+
return { type: reflectY };
|
|
29722
|
+
case "mercator":
|
|
29723
|
+
return scaleProjection(mercator_default, tau5, tau5);
|
|
29724
|
+
case "orthographic":
|
|
29725
|
+
return scaleProjection(orthographic_default, 2, 2);
|
|
29726
|
+
case "stereographic":
|
|
29727
|
+
return scaleProjection(stereographic_default, 2, 2);
|
|
29728
|
+
case "transverse-mercator":
|
|
29729
|
+
return scaleProjection(transverseMercator_default, tau5, tau5);
|
|
29730
|
+
default:
|
|
29731
|
+
throw new Error(`unknown projection type: ${projection3}`);
|
|
29714
29732
|
}
|
|
29715
|
-
|
|
29716
|
-
|
|
29717
|
-
|
|
29718
|
-
|
|
29733
|
+
}
|
|
29734
|
+
function maybePostClip(clip, x12, y12, x22, y22) {
|
|
29735
|
+
if (clip === false || clip == null || typeof clip === "number")
|
|
29736
|
+
return (s2) => s2;
|
|
29737
|
+
if (clip === true)
|
|
29738
|
+
clip = "frame";
|
|
29739
|
+
switch (`${clip}`.toLowerCase()) {
|
|
29740
|
+
case "frame":
|
|
29741
|
+
return clipRectangle(x12, y12, x22, y22);
|
|
29742
|
+
default:
|
|
29743
|
+
throw new Error(`unknown projection clip type: ${clip}`);
|
|
29719
29744
|
}
|
|
29720
|
-
|
|
29721
|
-
|
|
29722
|
-
mark.strokeWidth = impliedNumber(cstrokeWidth, 1);
|
|
29723
|
-
mark.strokeOpacity = impliedNumber(cstrokeOpacity, 1);
|
|
29724
|
-
mark.strokeLinejoin = impliedString(strokeLinejoin, "miter");
|
|
29725
|
-
mark.strokeLinecap = impliedString(strokeLinecap, "butt");
|
|
29726
|
-
mark.strokeMiterlimit = impliedNumber(strokeMiterlimit, 4);
|
|
29727
|
-
mark.strokeDasharray = impliedString(strokeDasharray, "none");
|
|
29728
|
-
mark.strokeDashoffset = impliedString(strokeDashoffset, "0");
|
|
29729
|
-
}
|
|
29730
|
-
mark.target = string(target);
|
|
29731
|
-
mark.ariaLabel = string(cariaLabel);
|
|
29732
|
-
mark.ariaDescription = string(ariaDescription);
|
|
29733
|
-
mark.ariaHidden = string(ariaHidden);
|
|
29734
|
-
mark.opacity = impliedNumber(copacity, 1);
|
|
29735
|
-
mark.mixBlendMode = impliedString(mixBlendMode, "normal");
|
|
29736
|
-
mark.imageFilter = impliedString(imageFilter, "none");
|
|
29737
|
-
mark.paintOrder = impliedString(paintOrder, "normal");
|
|
29738
|
-
mark.pointerEvents = impliedString(pointerEvents, "auto");
|
|
29739
|
-
mark.shapeRendering = impliedString(shapeRendering, "auto");
|
|
29745
|
+
}
|
|
29746
|
+
function scaleProjection(createProjection2, kx2, ky2) {
|
|
29740
29747
|
return {
|
|
29741
|
-
|
|
29742
|
-
|
|
29743
|
-
|
|
29744
|
-
|
|
29745
|
-
|
|
29746
|
-
|
|
29747
|
-
|
|
29748
|
-
|
|
29749
|
-
|
|
29748
|
+
type: ({ width, height, rotate, precision = 0.15, clip }) => {
|
|
29749
|
+
const projection3 = createProjection2();
|
|
29750
|
+
if (precision != null)
|
|
29751
|
+
projection3.precision?.(precision);
|
|
29752
|
+
if (rotate != null)
|
|
29753
|
+
projection3.rotate?.(rotate);
|
|
29754
|
+
if (typeof clip === "number")
|
|
29755
|
+
projection3.clipAngle?.(clip);
|
|
29756
|
+
projection3.scale(Math.min(width / kx2, height / ky2));
|
|
29757
|
+
projection3.translate([width / 2, height / 2]);
|
|
29758
|
+
return projection3;
|
|
29759
|
+
},
|
|
29760
|
+
aspectRatio: ky2 / kx2
|
|
29750
29761
|
};
|
|
29751
29762
|
}
|
|
29752
|
-
function
|
|
29753
|
-
|
|
29754
|
-
|
|
29755
|
-
|
|
29756
|
-
|
|
29757
|
-
|
|
29758
|
-
|
|
29759
|
-
|
|
29760
|
-
|
|
29761
|
-
|
|
29762
|
-
selection2.text((i) => formatDefault(T[i]));
|
|
29763
|
-
}
|
|
29764
|
-
function applyTextGroup(selection2, T) {
|
|
29765
|
-
if (T)
|
|
29766
|
-
selection2.text(([i]) => formatDefault(T[i]));
|
|
29767
|
-
}
|
|
29768
|
-
function applyChannelStyles(selection2, { target, tip: tip2 }, {
|
|
29769
|
-
ariaLabel: AL,
|
|
29770
|
-
title: T,
|
|
29771
|
-
fill: F,
|
|
29772
|
-
fillOpacity: FO,
|
|
29773
|
-
stroke: S,
|
|
29774
|
-
strokeOpacity: SO,
|
|
29775
|
-
strokeWidth: SW,
|
|
29776
|
-
opacity: O,
|
|
29777
|
-
href: H
|
|
29778
|
-
}) {
|
|
29779
|
-
if (AL)
|
|
29780
|
-
applyAttr(selection2, "aria-label", (i) => AL[i]);
|
|
29781
|
-
if (F)
|
|
29782
|
-
applyAttr(selection2, "fill", (i) => F[i]);
|
|
29783
|
-
if (FO)
|
|
29784
|
-
applyAttr(selection2, "fill-opacity", (i) => FO[i]);
|
|
29785
|
-
if (S)
|
|
29786
|
-
applyAttr(selection2, "stroke", (i) => S[i]);
|
|
29787
|
-
if (SO)
|
|
29788
|
-
applyAttr(selection2, "stroke-opacity", (i) => SO[i]);
|
|
29789
|
-
if (SW)
|
|
29790
|
-
applyAttr(selection2, "stroke-width", (i) => SW[i]);
|
|
29791
|
-
if (O)
|
|
29792
|
-
applyAttr(selection2, "opacity", (i) => O[i]);
|
|
29793
|
-
if (H)
|
|
29794
|
-
applyHref(selection2, (i) => H[i], target);
|
|
29795
|
-
if (!tip2)
|
|
29796
|
-
applyTitle(selection2, T);
|
|
29797
|
-
}
|
|
29798
|
-
function applyGroupedChannelStyles(selection2, { target, tip: tip2 }, {
|
|
29799
|
-
ariaLabel: AL,
|
|
29800
|
-
title: T,
|
|
29801
|
-
fill: F,
|
|
29802
|
-
fillOpacity: FO,
|
|
29803
|
-
stroke: S,
|
|
29804
|
-
strokeOpacity: SO,
|
|
29805
|
-
strokeWidth: SW,
|
|
29806
|
-
opacity: O,
|
|
29807
|
-
href: H
|
|
29808
|
-
}) {
|
|
29809
|
-
if (AL)
|
|
29810
|
-
applyAttr(selection2, "aria-label", ([i]) => AL[i]);
|
|
29811
|
-
if (F)
|
|
29812
|
-
applyAttr(selection2, "fill", ([i]) => F[i]);
|
|
29813
|
-
if (FO)
|
|
29814
|
-
applyAttr(selection2, "fill-opacity", ([i]) => FO[i]);
|
|
29815
|
-
if (S)
|
|
29816
|
-
applyAttr(selection2, "stroke", ([i]) => S[i]);
|
|
29817
|
-
if (SO)
|
|
29818
|
-
applyAttr(selection2, "stroke-opacity", ([i]) => SO[i]);
|
|
29819
|
-
if (SW)
|
|
29820
|
-
applyAttr(selection2, "stroke-width", ([i]) => SW[i]);
|
|
29821
|
-
if (O)
|
|
29822
|
-
applyAttr(selection2, "opacity", ([i]) => O[i]);
|
|
29823
|
-
if (H)
|
|
29824
|
-
applyHref(selection2, ([i]) => H[i], target);
|
|
29825
|
-
if (!tip2)
|
|
29826
|
-
applyTitleGroup(selection2, T);
|
|
29827
|
-
}
|
|
29828
|
-
function groupAesthetics({
|
|
29829
|
-
ariaLabel: AL,
|
|
29830
|
-
title: T,
|
|
29831
|
-
fill: F,
|
|
29832
|
-
fillOpacity: FO,
|
|
29833
|
-
stroke: S,
|
|
29834
|
-
strokeOpacity: SO,
|
|
29835
|
-
strokeWidth: SW,
|
|
29836
|
-
opacity: O,
|
|
29837
|
-
href: H
|
|
29838
|
-
}, { tip: tip2 }) {
|
|
29839
|
-
return [AL, tip2 ? void 0 : T, F, FO, S, SO, SW, O, H].filter((c4) => c4 !== void 0);
|
|
29840
|
-
}
|
|
29841
|
-
function groupZ2(I, Z, z) {
|
|
29842
|
-
const G = group(I, (i) => Z[i]);
|
|
29843
|
-
if (z === void 0 && G.size > 1 + I.length >> 1) {
|
|
29844
|
-
warn(
|
|
29845
|
-
`Warning: the implicit z channel has high cardinality. This may occur when the fill or stroke channel is associated with quantitative data rather than ordinal or categorical data. You can suppress this warning by setting the z option explicitly; if this data represents a single series, set z to null.`
|
|
29846
|
-
);
|
|
29847
|
-
}
|
|
29848
|
-
return G.values();
|
|
29849
|
-
}
|
|
29850
|
-
function* groupIndex(I, position3, mark, channels) {
|
|
29851
|
-
const { z } = mark;
|
|
29852
|
-
const { z: Z } = channels;
|
|
29853
|
-
const A5 = groupAesthetics(channels, mark);
|
|
29854
|
-
const C3 = [...position3, ...A5];
|
|
29855
|
-
for (const G of Z ? groupZ2(I, Z, z) : [I]) {
|
|
29856
|
-
let Ag;
|
|
29857
|
-
let Gg;
|
|
29858
|
-
out:
|
|
29859
|
-
for (const i of G) {
|
|
29860
|
-
for (const c4 of C3) {
|
|
29861
|
-
if (!defined(c4[i])) {
|
|
29862
|
-
if (Gg)
|
|
29863
|
-
Gg.push(-1);
|
|
29864
|
-
continue out;
|
|
29865
|
-
}
|
|
29866
|
-
}
|
|
29867
|
-
if (Ag === void 0) {
|
|
29868
|
-
if (Gg)
|
|
29869
|
-
yield Gg;
|
|
29870
|
-
Ag = A5.map((c4) => keyof2(c4[i])), Gg = [i];
|
|
29871
|
-
continue;
|
|
29872
|
-
}
|
|
29873
|
-
Gg.push(i);
|
|
29874
|
-
for (let j = 0; j < A5.length; ++j) {
|
|
29875
|
-
const k2 = keyof2(A5[j][i]);
|
|
29876
|
-
if (k2 !== Ag[j]) {
|
|
29877
|
-
yield Gg;
|
|
29878
|
-
Ag = A5.map((c4) => keyof2(c4[i])), Gg = [i];
|
|
29879
|
-
continue out;
|
|
29880
|
-
}
|
|
29763
|
+
function conicProjection2(createProjection2, kx2, ky2) {
|
|
29764
|
+
const { type: type2, aspectRatio } = scaleProjection(createProjection2, kx2, ky2);
|
|
29765
|
+
return {
|
|
29766
|
+
type: (options) => {
|
|
29767
|
+
const { parallels, domain, width, height } = options;
|
|
29768
|
+
const projection3 = type2(options);
|
|
29769
|
+
if (parallels != null) {
|
|
29770
|
+
projection3.parallels(parallels);
|
|
29771
|
+
if (domain === void 0) {
|
|
29772
|
+
projection3.fitSize([width, height], { type: "Sphere" });
|
|
29881
29773
|
}
|
|
29882
29774
|
}
|
|
29883
|
-
|
|
29884
|
-
|
|
29885
|
-
|
|
29886
|
-
}
|
|
29887
|
-
function maybeClip(clip) {
|
|
29888
|
-
if (clip === true)
|
|
29889
|
-
clip = "frame";
|
|
29890
|
-
else if (clip === false)
|
|
29891
|
-
clip = null;
|
|
29892
|
-
else if (clip != null)
|
|
29893
|
-
clip = keyword(clip, "clip", ["frame", "sphere"]);
|
|
29894
|
-
return clip;
|
|
29775
|
+
return projection3;
|
|
29776
|
+
},
|
|
29777
|
+
aspectRatio
|
|
29778
|
+
};
|
|
29895
29779
|
}
|
|
29896
|
-
|
|
29897
|
-
|
|
29898
|
-
|
|
29899
|
-
|
|
29900
|
-
|
|
29901
|
-
const { width, height, marginLeft, marginRight, marginTop, marginBottom } = dimensions;
|
|
29902
|
-
const id2 = getClipId();
|
|
29903
|
-
clipUrl = `url(#${id2})`;
|
|
29904
|
-
selection2 = create3("svg:g", context).call(
|
|
29905
|
-
(g) => g.append("svg:clipPath").attr("id", id2).append("rect").attr("x", marginLeft).attr("y", marginTop).attr("width", width - marginRight - marginLeft).attr("height", height - marginTop - marginBottom)
|
|
29906
|
-
).each(function() {
|
|
29907
|
-
this.appendChild(selection2.node());
|
|
29908
|
-
selection2.node = () => this;
|
|
29909
|
-
});
|
|
29910
|
-
break;
|
|
29780
|
+
var identity8 = constant({ stream: (stream) => stream });
|
|
29781
|
+
var reflectY = constant(
|
|
29782
|
+
transform_default({
|
|
29783
|
+
point(x3, y3) {
|
|
29784
|
+
this.stream.point(x3, -y3);
|
|
29911
29785
|
}
|
|
29912
|
-
|
|
29913
|
-
|
|
29914
|
-
|
|
29915
|
-
|
|
29916
|
-
|
|
29917
|
-
|
|
29918
|
-
|
|
29919
|
-
|
|
29786
|
+
})
|
|
29787
|
+
);
|
|
29788
|
+
function project(cx, cy, values2, projection3) {
|
|
29789
|
+
const x3 = values2[cx];
|
|
29790
|
+
const y3 = values2[cy];
|
|
29791
|
+
const n = x3.length;
|
|
29792
|
+
const X3 = values2[cx] = new Float64Array(n).fill(NaN);
|
|
29793
|
+
const Y3 = values2[cy] = new Float64Array(n).fill(NaN);
|
|
29794
|
+
let i;
|
|
29795
|
+
const stream = projection3.stream({
|
|
29796
|
+
point(x4, y4) {
|
|
29797
|
+
X3[i] = x4;
|
|
29798
|
+
Y3[i] = y4;
|
|
29920
29799
|
}
|
|
29921
|
-
}
|
|
29922
|
-
|
|
29923
|
-
|
|
29924
|
-
applyAttr(selection2, "aria-hidden", mark.ariaHidden);
|
|
29925
|
-
applyAttr(selection2, "clip-path", clipUrl);
|
|
29926
|
-
}
|
|
29927
|
-
function applyIndirectStyles(selection2, mark, dimensions, context) {
|
|
29928
|
-
applyClip(selection2, mark, dimensions, context);
|
|
29929
|
-
applyAttr(selection2, "fill", mark.fill);
|
|
29930
|
-
applyAttr(selection2, "fill-opacity", mark.fillOpacity);
|
|
29931
|
-
applyAttr(selection2, "stroke", mark.stroke);
|
|
29932
|
-
applyAttr(selection2, "stroke-width", mark.strokeWidth);
|
|
29933
|
-
applyAttr(selection2, "stroke-opacity", mark.strokeOpacity);
|
|
29934
|
-
applyAttr(selection2, "stroke-linejoin", mark.strokeLinejoin);
|
|
29935
|
-
applyAttr(selection2, "stroke-linecap", mark.strokeLinecap);
|
|
29936
|
-
applyAttr(selection2, "stroke-miterlimit", mark.strokeMiterlimit);
|
|
29937
|
-
applyAttr(selection2, "stroke-dasharray", mark.strokeDasharray);
|
|
29938
|
-
applyAttr(selection2, "stroke-dashoffset", mark.strokeDashoffset);
|
|
29939
|
-
applyAttr(selection2, "shape-rendering", mark.shapeRendering);
|
|
29940
|
-
applyAttr(selection2, "filter", mark.imageFilter);
|
|
29941
|
-
applyAttr(selection2, "paint-order", mark.paintOrder);
|
|
29942
|
-
const { pointerEvents = context.pointerSticky === false ? "none" : void 0 } = mark;
|
|
29943
|
-
applyAttr(selection2, "pointer-events", pointerEvents);
|
|
29944
|
-
}
|
|
29945
|
-
function applyDirectStyles(selection2, mark) {
|
|
29946
|
-
applyStyle(selection2, "mix-blend-mode", mark.mixBlendMode);
|
|
29947
|
-
applyAttr(selection2, "opacity", mark.opacity);
|
|
29948
|
-
}
|
|
29949
|
-
function applyHref(selection2, href, target) {
|
|
29950
|
-
selection2.each(function(i) {
|
|
29951
|
-
const h = href(i);
|
|
29952
|
-
if (h != null) {
|
|
29953
|
-
const a2 = this.ownerDocument.createElementNS(namespaces_default.svg, "a");
|
|
29954
|
-
a2.setAttribute("fill", "inherit");
|
|
29955
|
-
a2.setAttributeNS(namespaces_default.xlink, "href", h);
|
|
29956
|
-
if (target != null)
|
|
29957
|
-
a2.setAttribute("target", target);
|
|
29958
|
-
this.parentNode.insertBefore(a2, this).appendChild(this);
|
|
29959
|
-
}
|
|
29960
|
-
});
|
|
29961
|
-
}
|
|
29962
|
-
function applyAttr(selection2, name, value) {
|
|
29963
|
-
if (value != null)
|
|
29964
|
-
selection2.attr(name, value);
|
|
29965
|
-
}
|
|
29966
|
-
function applyStyle(selection2, name, value) {
|
|
29967
|
-
if (value != null)
|
|
29968
|
-
selection2.style(name, value);
|
|
29969
|
-
}
|
|
29970
|
-
function applyTransform(selection2, mark, { x: x3, y: y3 }, tx = offset, ty = offset) {
|
|
29971
|
-
tx += mark.dx;
|
|
29972
|
-
ty += mark.dy;
|
|
29973
|
-
if (x3?.bandwidth)
|
|
29974
|
-
tx += x3.bandwidth() / 2;
|
|
29975
|
-
if (y3?.bandwidth)
|
|
29976
|
-
ty += y3.bandwidth() / 2;
|
|
29977
|
-
if (tx || ty)
|
|
29978
|
-
selection2.attr("transform", `translate(${tx},${ty})`);
|
|
29979
|
-
}
|
|
29980
|
-
function impliedString(value, impliedValue) {
|
|
29981
|
-
if ((value = string(value)) !== impliedValue)
|
|
29982
|
-
return value;
|
|
29983
|
-
}
|
|
29984
|
-
function impliedNumber(value, impliedValue) {
|
|
29985
|
-
if ((value = number5(value)) !== impliedValue)
|
|
29986
|
-
return value;
|
|
29987
|
-
}
|
|
29988
|
-
var validClassName = /^-?([_a-z]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])([_a-z0-9-]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*$/i;
|
|
29989
|
-
function maybeClassName(name) {
|
|
29990
|
-
if (name === void 0)
|
|
29991
|
-
return "plot-d6a7b5";
|
|
29992
|
-
name = `${name}`;
|
|
29993
|
-
if (!validClassName.test(name))
|
|
29994
|
-
throw new Error(`invalid class name: ${name}`);
|
|
29995
|
-
return name;
|
|
29996
|
-
}
|
|
29997
|
-
function applyInlineStyles(selection2, style) {
|
|
29998
|
-
if (typeof style === "string") {
|
|
29999
|
-
selection2.property("style", style);
|
|
30000
|
-
} else if (style != null) {
|
|
30001
|
-
for (const element of selection2) {
|
|
30002
|
-
Object.assign(element.style, style);
|
|
30003
|
-
}
|
|
30004
|
-
}
|
|
30005
|
-
}
|
|
30006
|
-
function applyFrameAnchor({ frameAnchor }, { width, height, marginTop, marginRight, marginBottom, marginLeft }) {
|
|
30007
|
-
return [
|
|
30008
|
-
/left$/.test(frameAnchor) ? marginLeft : /right$/.test(frameAnchor) ? width - marginRight : (marginLeft + width - marginRight) / 2,
|
|
30009
|
-
/^top/.test(frameAnchor) ? marginTop : /^bottom/.test(frameAnchor) ? height - marginBottom : (marginTop + height - marginBottom) / 2
|
|
30010
|
-
];
|
|
30011
|
-
}
|
|
30012
|
-
|
|
30013
|
-
// ../../node_modules/@observablehq/plot/src/context.js
|
|
30014
|
-
function createContext(options = {}) {
|
|
30015
|
-
const { document: document2 = typeof window !== "undefined" ? window.document : void 0, clip } = options;
|
|
30016
|
-
return { document: document2, clip: maybeClip(clip) };
|
|
30017
|
-
}
|
|
30018
|
-
function create3(name, { document: document2 }) {
|
|
30019
|
-
return select_default2(creator_default(name).call(document2.documentElement));
|
|
30020
|
-
}
|
|
30021
|
-
|
|
30022
|
-
// ../../node_modules/@observablehq/plot/src/projection.js
|
|
30023
|
-
var pi4 = Math.PI;
|
|
30024
|
-
var tau5 = 2 * pi4;
|
|
30025
|
-
var defaultAspectRatio = 0.618;
|
|
30026
|
-
function createProjection({
|
|
30027
|
-
projection: projection3,
|
|
30028
|
-
inset: globalInset = 0,
|
|
30029
|
-
insetTop = globalInset,
|
|
30030
|
-
insetRight = globalInset,
|
|
30031
|
-
insetBottom = globalInset,
|
|
30032
|
-
insetLeft = globalInset
|
|
30033
|
-
} = {}, dimensions) {
|
|
30034
|
-
if (projection3 == null)
|
|
30035
|
-
return;
|
|
30036
|
-
if (typeof projection3.stream === "function")
|
|
30037
|
-
return projection3;
|
|
30038
|
-
let options;
|
|
30039
|
-
let domain;
|
|
30040
|
-
let clip = "frame";
|
|
30041
|
-
if (isObject2(projection3)) {
|
|
30042
|
-
let inset;
|
|
30043
|
-
({
|
|
30044
|
-
type: projection3,
|
|
30045
|
-
domain,
|
|
30046
|
-
inset,
|
|
30047
|
-
insetTop = inset !== void 0 ? inset : insetTop,
|
|
30048
|
-
insetRight = inset !== void 0 ? inset : insetRight,
|
|
30049
|
-
insetBottom = inset !== void 0 ? inset : insetBottom,
|
|
30050
|
-
insetLeft = inset !== void 0 ? inset : insetLeft,
|
|
30051
|
-
clip = clip,
|
|
30052
|
-
...options
|
|
30053
|
-
} = projection3);
|
|
30054
|
-
if (projection3 == null)
|
|
30055
|
-
return;
|
|
30056
|
-
}
|
|
30057
|
-
if (typeof projection3 !== "function")
|
|
30058
|
-
({ type: projection3 } = namedProjection(projection3));
|
|
30059
|
-
const { width, height, marginLeft, marginRight, marginTop, marginBottom } = dimensions;
|
|
30060
|
-
const dx = width - marginLeft - marginRight - insetLeft - insetRight;
|
|
30061
|
-
const dy = height - marginTop - marginBottom - insetTop - insetBottom;
|
|
30062
|
-
projection3 = projection3?.({ width: dx, height: dy, clip, ...options });
|
|
30063
|
-
if (projection3 == null)
|
|
30064
|
-
return;
|
|
30065
|
-
clip = maybePostClip(clip, marginLeft, marginTop, width - marginRight, height - marginBottom);
|
|
30066
|
-
let tx = marginLeft + insetLeft;
|
|
30067
|
-
let ty = marginTop + insetTop;
|
|
30068
|
-
let transform3;
|
|
30069
|
-
if (domain != null) {
|
|
30070
|
-
const [[x06, y06], [x12, y12]] = path_default(projection3).bounds(domain);
|
|
30071
|
-
const k2 = Math.min(dx / (x12 - x06), dy / (y12 - y06));
|
|
30072
|
-
if (k2 > 0) {
|
|
30073
|
-
tx -= (k2 * (x06 + x12) - dx) / 2;
|
|
30074
|
-
ty -= (k2 * (y06 + y12) - dy) / 2;
|
|
30075
|
-
transform3 = Object.assign(
|
|
30076
|
-
transform_default({
|
|
30077
|
-
point(x3, y3) {
|
|
30078
|
-
this.stream.point(x3 * k2 + tx, y3 * k2 + ty);
|
|
30079
|
-
}
|
|
30080
|
-
}),
|
|
30081
|
-
{ invert: ([x3, y3]) => [(x3 - tx) / k2, (y3 - ty) / k2] }
|
|
30082
|
-
);
|
|
30083
|
-
} else {
|
|
30084
|
-
warn(`Warning: the projection could not be fit to the specified domain; using the default scale.`);
|
|
30085
|
-
}
|
|
30086
|
-
}
|
|
30087
|
-
transform3 ??= tx === 0 && ty === 0 ? identity8() : Object.assign(
|
|
30088
|
-
transform_default({
|
|
30089
|
-
point(x3, y3) {
|
|
30090
|
-
this.stream.point(x3 + tx, y3 + ty);
|
|
30091
|
-
}
|
|
30092
|
-
}),
|
|
30093
|
-
{ invert: ([x3, y3]) => [x3 - tx, y3 - ty] }
|
|
30094
|
-
);
|
|
30095
|
-
return {
|
|
30096
|
-
stream: (s2) => projection3.stream(transform3.stream(clip(s2))),
|
|
30097
|
-
invert: (p) => projection3.invert(transform3.invert(p))
|
|
30098
|
-
};
|
|
30099
|
-
}
|
|
30100
|
-
function namedProjection(projection3) {
|
|
30101
|
-
switch (`${projection3}`.toLowerCase()) {
|
|
30102
|
-
case "albers-usa":
|
|
30103
|
-
return scaleProjection(albersUsa_default, 0.7463, 0.4673);
|
|
30104
|
-
case "albers":
|
|
30105
|
-
return conicProjection2(albers_default, 0.7463, 0.4673);
|
|
30106
|
-
case "azimuthal-equal-area":
|
|
30107
|
-
return scaleProjection(azimuthalEqualArea_default, 4, 4);
|
|
30108
|
-
case "azimuthal-equidistant":
|
|
30109
|
-
return scaleProjection(azimuthalEquidistant_default, tau5, tau5);
|
|
30110
|
-
case "conic-conformal":
|
|
30111
|
-
return conicProjection2(conicConformal_default, tau5, tau5);
|
|
30112
|
-
case "conic-equal-area":
|
|
30113
|
-
return conicProjection2(conicEqualArea_default, 6.1702, 2.9781);
|
|
30114
|
-
case "conic-equidistant":
|
|
30115
|
-
return conicProjection2(conicEquidistant_default, 7.312, 3.6282);
|
|
30116
|
-
case "equal-earth":
|
|
30117
|
-
return scaleProjection(equalEarth_default, 5.4133, 2.6347);
|
|
30118
|
-
case "equirectangular":
|
|
30119
|
-
return scaleProjection(equirectangular_default, tau5, pi4);
|
|
30120
|
-
case "gnomonic":
|
|
30121
|
-
return scaleProjection(gnomonic_default, 3.4641, 3.4641);
|
|
30122
|
-
case "identity":
|
|
30123
|
-
return { type: identity8 };
|
|
30124
|
-
case "reflect-y":
|
|
30125
|
-
return { type: reflectY };
|
|
30126
|
-
case "mercator":
|
|
30127
|
-
return scaleProjection(mercator_default, tau5, tau5);
|
|
30128
|
-
case "orthographic":
|
|
30129
|
-
return scaleProjection(orthographic_default, 2, 2);
|
|
30130
|
-
case "stereographic":
|
|
30131
|
-
return scaleProjection(stereographic_default, 2, 2);
|
|
30132
|
-
case "transverse-mercator":
|
|
30133
|
-
return scaleProjection(transverseMercator_default, tau5, tau5);
|
|
30134
|
-
default:
|
|
30135
|
-
throw new Error(`unknown projection type: ${projection3}`);
|
|
30136
|
-
}
|
|
30137
|
-
}
|
|
30138
|
-
function maybePostClip(clip, x12, y12, x22, y22) {
|
|
30139
|
-
if (clip === false || clip == null || typeof clip === "number")
|
|
30140
|
-
return (s2) => s2;
|
|
30141
|
-
if (clip === true)
|
|
30142
|
-
clip = "frame";
|
|
30143
|
-
switch (`${clip}`.toLowerCase()) {
|
|
30144
|
-
case "frame":
|
|
30145
|
-
return clipRectangle(x12, y12, x22, y22);
|
|
30146
|
-
default:
|
|
30147
|
-
throw new Error(`unknown projection clip type: ${clip}`);
|
|
30148
|
-
}
|
|
30149
|
-
}
|
|
30150
|
-
function scaleProjection(createProjection2, kx2, ky2) {
|
|
30151
|
-
return {
|
|
30152
|
-
type: ({ width, height, rotate, precision = 0.15, clip }) => {
|
|
30153
|
-
const projection3 = createProjection2();
|
|
30154
|
-
if (precision != null)
|
|
30155
|
-
projection3.precision?.(precision);
|
|
30156
|
-
if (rotate != null)
|
|
30157
|
-
projection3.rotate?.(rotate);
|
|
30158
|
-
if (typeof clip === "number")
|
|
30159
|
-
projection3.clipAngle?.(clip);
|
|
30160
|
-
projection3.scale(Math.min(width / kx2, height / ky2));
|
|
30161
|
-
projection3.translate([width / 2, height / 2]);
|
|
30162
|
-
return projection3;
|
|
30163
|
-
},
|
|
30164
|
-
aspectRatio: ky2 / kx2
|
|
30165
|
-
};
|
|
30166
|
-
}
|
|
30167
|
-
function conicProjection2(createProjection2, kx2, ky2) {
|
|
30168
|
-
const { type: type2, aspectRatio } = scaleProjection(createProjection2, kx2, ky2);
|
|
30169
|
-
return {
|
|
30170
|
-
type: (options) => {
|
|
30171
|
-
const { parallels, domain, width, height } = options;
|
|
30172
|
-
const projection3 = type2(options);
|
|
30173
|
-
if (parallels != null) {
|
|
30174
|
-
projection3.parallels(parallels);
|
|
30175
|
-
if (domain === void 0) {
|
|
30176
|
-
projection3.fitSize([width, height], { type: "Sphere" });
|
|
30177
|
-
}
|
|
30178
|
-
}
|
|
30179
|
-
return projection3;
|
|
30180
|
-
},
|
|
30181
|
-
aspectRatio
|
|
30182
|
-
};
|
|
30183
|
-
}
|
|
30184
|
-
var identity8 = constant({
|
|
30185
|
-
stream: (stream) => stream,
|
|
30186
|
-
invert: (p) => p
|
|
30187
|
-
});
|
|
30188
|
-
var reflectY = constant(
|
|
30189
|
-
Object.assign(
|
|
30190
|
-
transform_default({
|
|
30191
|
-
point(x3, y3) {
|
|
30192
|
-
this.stream.point(x3, -y3);
|
|
30193
|
-
}
|
|
30194
|
-
}),
|
|
30195
|
-
{ invert: ([x3, y3]) => [x3, -y3] }
|
|
30196
|
-
)
|
|
30197
|
-
);
|
|
30198
|
-
function project(cx, cy, values2, projection3) {
|
|
30199
|
-
const x3 = values2[cx];
|
|
30200
|
-
const y3 = values2[cy];
|
|
30201
|
-
const n = x3.length;
|
|
30202
|
-
const X3 = values2[cx] = new Float64Array(n).fill(NaN);
|
|
30203
|
-
const Y3 = values2[cy] = new Float64Array(n).fill(NaN);
|
|
30204
|
-
let i;
|
|
30205
|
-
const stream = projection3.stream({
|
|
30206
|
-
point(x4, y4) {
|
|
30207
|
-
X3[i] = x4;
|
|
30208
|
-
Y3[i] = y4;
|
|
30209
|
-
}
|
|
30210
|
-
});
|
|
30211
|
-
for (i = 0; i < n; ++i) {
|
|
30212
|
-
stream.point(x3[i], y3[i]);
|
|
29800
|
+
});
|
|
29801
|
+
for (i = 0; i < n; ++i) {
|
|
29802
|
+
stream.point(x3[i], y3[i]);
|
|
30213
29803
|
}
|
|
30214
29804
|
}
|
|
30215
29805
|
function hasProjection({ projection: projection3 } = {}) {
|
|
@@ -30278,23 +29868,11 @@ function getGeometryChannels(channel) {
|
|
|
30278
29868
|
}
|
|
30279
29869
|
|
|
30280
29870
|
// ../../node_modules/@observablehq/plot/src/scales/schemes.js
|
|
30281
|
-
var schemeObservable10 = [
|
|
30282
|
-
"#4269d0",
|
|
30283
|
-
"#efb118",
|
|
30284
|
-
"#ff725c",
|
|
30285
|
-
"#6cc5b0",
|
|
30286
|
-
"#3ca951",
|
|
30287
|
-
"#ff8ab7",
|
|
30288
|
-
"#a463f2",
|
|
30289
|
-
"#97bbf5",
|
|
30290
|
-
"#9c6b4e",
|
|
30291
|
-
"#9498a0"
|
|
30292
|
-
];
|
|
30293
29871
|
var categoricalSchemes = /* @__PURE__ */ new Map([
|
|
30294
29872
|
["accent", Accent_default],
|
|
30295
29873
|
["category10", category10_default],
|
|
30296
29874
|
["dark2", Dark2_default],
|
|
30297
|
-
["observable10",
|
|
29875
|
+
["observable10", observable10_default],
|
|
30298
29876
|
["paired", Paired_default],
|
|
30299
29877
|
["pastel1", Pastel1_default],
|
|
30300
29878
|
["pastel2", Pastel2_default],
|
|
@@ -31329,111 +30907,517 @@ function inferScaleType(key, channels, { type: type2, domain, range: range3, sch
|
|
|
31329
30907
|
if (isCategoricalScheme(scheme28))
|
|
31330
30908
|
return "categorical";
|
|
31331
30909
|
}
|
|
31332
|
-
return "linear";
|
|
30910
|
+
return "linear";
|
|
30911
|
+
}
|
|
30912
|
+
function asOrdinalType(kind) {
|
|
30913
|
+
switch (kind) {
|
|
30914
|
+
case position:
|
|
30915
|
+
return "point";
|
|
30916
|
+
case color2:
|
|
30917
|
+
return ordinalImplicit;
|
|
30918
|
+
default:
|
|
30919
|
+
return "ordinal";
|
|
30920
|
+
}
|
|
30921
|
+
}
|
|
30922
|
+
function isOrdinalScale({ type: type2 }) {
|
|
30923
|
+
return type2 === "ordinal" || type2 === "point" || type2 === "band" || type2 === ordinalImplicit;
|
|
30924
|
+
}
|
|
30925
|
+
function isThresholdScale({ type: type2 }) {
|
|
30926
|
+
return type2 === "threshold";
|
|
30927
|
+
}
|
|
30928
|
+
function isBandScale({ type: type2 }) {
|
|
30929
|
+
return type2 === "point" || type2 === "band";
|
|
30930
|
+
}
|
|
30931
|
+
function isCollapsed(scale3) {
|
|
30932
|
+
if (scale3 === void 0)
|
|
30933
|
+
return true;
|
|
30934
|
+
const domain = scale3.domain();
|
|
30935
|
+
const value = scale3(domain[0]);
|
|
30936
|
+
for (let i = 1, n = domain.length; i < n; ++i) {
|
|
30937
|
+
if (scale3(domain[i]) - value) {
|
|
30938
|
+
return false;
|
|
30939
|
+
}
|
|
30940
|
+
}
|
|
30941
|
+
return true;
|
|
30942
|
+
}
|
|
30943
|
+
function coerceType(channels, { domain, ...options }, coerceValues) {
|
|
30944
|
+
for (const c4 of channels) {
|
|
30945
|
+
if (c4.value !== void 0) {
|
|
30946
|
+
if (domain === void 0)
|
|
30947
|
+
domain = c4.value?.domain;
|
|
30948
|
+
c4.value = coerceValues(c4.value);
|
|
30949
|
+
}
|
|
30950
|
+
}
|
|
30951
|
+
return {
|
|
30952
|
+
domain: domain === void 0 ? domain : coerceValues(domain),
|
|
30953
|
+
...options
|
|
30954
|
+
};
|
|
30955
|
+
}
|
|
30956
|
+
function coerceSymbols(values2) {
|
|
30957
|
+
return map2(values2, maybeSymbol);
|
|
30958
|
+
}
|
|
30959
|
+
function scale2(options = {}) {
|
|
30960
|
+
let scale3;
|
|
30961
|
+
for (const key in options) {
|
|
30962
|
+
if (!registry.has(key))
|
|
30963
|
+
continue;
|
|
30964
|
+
if (!isScaleOptions(options[key]))
|
|
30965
|
+
continue;
|
|
30966
|
+
if (scale3 !== void 0)
|
|
30967
|
+
throw new Error("ambiguous scale definition; multiple scales found");
|
|
30968
|
+
scale3 = exposeScale(normalizeScale(key, options[key]));
|
|
30969
|
+
}
|
|
30970
|
+
if (scale3 === void 0)
|
|
30971
|
+
throw new Error("invalid scale definition; no scale found");
|
|
30972
|
+
return scale3;
|
|
30973
|
+
}
|
|
30974
|
+
function exposeScales(scales2) {
|
|
30975
|
+
return (key) => {
|
|
30976
|
+
if (!registry.has(key = `${key}`))
|
|
30977
|
+
throw new Error(`unknown scale: ${key}`);
|
|
30978
|
+
return scales2[key];
|
|
30979
|
+
};
|
|
30980
|
+
}
|
|
30981
|
+
function exposeScale({ scale: scale3, type: type2, domain, range: range3, interpolate, interval: interval2, transform: transform3, percent, pivot }) {
|
|
30982
|
+
if (type2 === "identity")
|
|
30983
|
+
return { type: "identity", apply: (d) => d, invert: (d) => d };
|
|
30984
|
+
const unknown = scale3.unknown ? scale3.unknown() : void 0;
|
|
30985
|
+
return {
|
|
30986
|
+
type: type2,
|
|
30987
|
+
domain: slice3(domain),
|
|
30988
|
+
// defensive copy
|
|
30989
|
+
...range3 !== void 0 && { range: slice3(range3) },
|
|
30990
|
+
// defensive copy
|
|
30991
|
+
...transform3 !== void 0 && { transform: transform3 },
|
|
30992
|
+
...percent && { percent },
|
|
30993
|
+
// only exposed if truthy
|
|
30994
|
+
...unknown !== void 0 && { unknown },
|
|
30995
|
+
...interval2 !== void 0 && { interval: interval2 },
|
|
30996
|
+
// quantitative
|
|
30997
|
+
...interpolate !== void 0 && { interpolate },
|
|
30998
|
+
...scale3.clamp && { clamp: scale3.clamp() },
|
|
30999
|
+
// diverging (always asymmetric; we never want to apply the symmetric transform twice)
|
|
31000
|
+
...pivot !== void 0 && { pivot, symmetric: false },
|
|
31001
|
+
// log, diverging-log
|
|
31002
|
+
...scale3.base && { base: scale3.base() },
|
|
31003
|
+
// pow, diverging-pow
|
|
31004
|
+
...scale3.exponent && { exponent: scale3.exponent() },
|
|
31005
|
+
// symlog, diverging-symlog
|
|
31006
|
+
...scale3.constant && { constant: scale3.constant() },
|
|
31007
|
+
// band, point
|
|
31008
|
+
...scale3.align && { align: scale3.align(), round: scale3.round() },
|
|
31009
|
+
...scale3.padding && (scale3.paddingInner ? { paddingInner: scale3.paddingInner(), paddingOuter: scale3.paddingOuter() } : { padding: scale3.padding() }),
|
|
31010
|
+
...scale3.bandwidth && { bandwidth: scale3.bandwidth(), step: scale3.step() },
|
|
31011
|
+
// utilities
|
|
31012
|
+
apply: (t) => scale3(t),
|
|
31013
|
+
...scale3.invert && { invert: (t) => scale3.invert(t) }
|
|
31014
|
+
};
|
|
31015
|
+
}
|
|
31016
|
+
|
|
31017
|
+
// ../../node_modules/@observablehq/plot/src/memoize.js
|
|
31018
|
+
function memoize1(compute) {
|
|
31019
|
+
let cacheValue, cacheKeys;
|
|
31020
|
+
return (...keys) => {
|
|
31021
|
+
if (cacheKeys?.length !== keys.length || cacheKeys.some((k2, i) => k2 !== keys[i])) {
|
|
31022
|
+
cacheKeys = keys;
|
|
31023
|
+
cacheValue = compute(...keys);
|
|
31024
|
+
}
|
|
31025
|
+
return cacheValue;
|
|
31026
|
+
};
|
|
31027
|
+
}
|
|
31028
|
+
|
|
31029
|
+
// ../../node_modules/@observablehq/plot/src/format.js
|
|
31030
|
+
var numberFormat = memoize1((locale3) => {
|
|
31031
|
+
return new Intl.NumberFormat(locale3);
|
|
31032
|
+
});
|
|
31033
|
+
var monthFormat = memoize1((locale3, month) => {
|
|
31034
|
+
return new Intl.DateTimeFormat(locale3, { timeZone: "UTC", ...month && { month } });
|
|
31035
|
+
});
|
|
31036
|
+
var weekdayFormat = memoize1((locale3, weekday) => {
|
|
31037
|
+
return new Intl.DateTimeFormat(locale3, { timeZone: "UTC", ...weekday && { weekday } });
|
|
31038
|
+
});
|
|
31039
|
+
function formatNumber(locale3 = "en-US") {
|
|
31040
|
+
const format3 = numberFormat(locale3);
|
|
31041
|
+
return (i) => i != null && !isNaN(i) ? format3.format(i) : void 0;
|
|
31042
|
+
}
|
|
31043
|
+
function formatMonth(locale3 = "en-US", format3 = "short") {
|
|
31044
|
+
const fmt = monthFormat(locale3, format3);
|
|
31045
|
+
return (i) => i != null && !isNaN(i = +new Date(Date.UTC(2e3, +i))) ? fmt.format(i) : void 0;
|
|
31046
|
+
}
|
|
31047
|
+
function formatWeekday(locale3 = "en-US", format3 = "short") {
|
|
31048
|
+
const fmt = weekdayFormat(locale3, format3);
|
|
31049
|
+
return (i) => i != null && !isNaN(i = +new Date(Date.UTC(2001, 0, +i))) ? fmt.format(i) : void 0;
|
|
31050
|
+
}
|
|
31051
|
+
function formatIsoDate(date2) {
|
|
31052
|
+
return format2(date2, "Invalid Date");
|
|
31053
|
+
}
|
|
31054
|
+
function formatAuto(locale3 = "en-US") {
|
|
31055
|
+
const number7 = formatNumber(locale3);
|
|
31056
|
+
return (v2) => (v2 instanceof Date ? formatIsoDate : typeof v2 === "number" ? number7 : string)(v2);
|
|
31057
|
+
}
|
|
31058
|
+
var formatDefault = formatAuto();
|
|
31059
|
+
|
|
31060
|
+
// ../../node_modules/@observablehq/plot/src/style.js
|
|
31061
|
+
var offset = (typeof window !== "undefined" ? window.devicePixelRatio > 1 : typeof it === "undefined") ? 0 : 0.5;
|
|
31062
|
+
var nextClipId = 0;
|
|
31063
|
+
function getClipId() {
|
|
31064
|
+
return `plot-clip-${++nextClipId}`;
|
|
31065
|
+
}
|
|
31066
|
+
function styles(mark, {
|
|
31067
|
+
title,
|
|
31068
|
+
href,
|
|
31069
|
+
ariaLabel: variaLabel,
|
|
31070
|
+
ariaDescription,
|
|
31071
|
+
ariaHidden,
|
|
31072
|
+
target,
|
|
31073
|
+
fill,
|
|
31074
|
+
fillOpacity,
|
|
31075
|
+
stroke,
|
|
31076
|
+
strokeWidth,
|
|
31077
|
+
strokeOpacity,
|
|
31078
|
+
strokeLinejoin,
|
|
31079
|
+
strokeLinecap,
|
|
31080
|
+
strokeMiterlimit,
|
|
31081
|
+
strokeDasharray,
|
|
31082
|
+
strokeDashoffset,
|
|
31083
|
+
opacity: opacity2,
|
|
31084
|
+
mixBlendMode,
|
|
31085
|
+
imageFilter,
|
|
31086
|
+
paintOrder,
|
|
31087
|
+
pointerEvents,
|
|
31088
|
+
shapeRendering,
|
|
31089
|
+
channels
|
|
31090
|
+
}, {
|
|
31091
|
+
ariaLabel: cariaLabel,
|
|
31092
|
+
fill: defaultFill = "currentColor",
|
|
31093
|
+
fillOpacity: defaultFillOpacity,
|
|
31094
|
+
stroke: defaultStroke = "none",
|
|
31095
|
+
strokeOpacity: defaultStrokeOpacity,
|
|
31096
|
+
strokeWidth: defaultStrokeWidth,
|
|
31097
|
+
strokeLinecap: defaultStrokeLinecap,
|
|
31098
|
+
strokeLinejoin: defaultStrokeLinejoin,
|
|
31099
|
+
strokeMiterlimit: defaultStrokeMiterlimit,
|
|
31100
|
+
paintOrder: defaultPaintOrder
|
|
31101
|
+
}) {
|
|
31102
|
+
if (defaultFill === null) {
|
|
31103
|
+
fill = null;
|
|
31104
|
+
fillOpacity = null;
|
|
31105
|
+
}
|
|
31106
|
+
if (defaultStroke === null) {
|
|
31107
|
+
stroke = null;
|
|
31108
|
+
strokeOpacity = null;
|
|
31109
|
+
}
|
|
31110
|
+
if (isNoneish(defaultFill)) {
|
|
31111
|
+
if (!isNoneish(defaultStroke) && (!isNoneish(fill) || channels?.fill))
|
|
31112
|
+
defaultStroke = "none";
|
|
31113
|
+
} else {
|
|
31114
|
+
if (isNoneish(defaultStroke) && (!isNoneish(stroke) || channels?.stroke))
|
|
31115
|
+
defaultFill = "none";
|
|
31116
|
+
}
|
|
31117
|
+
const [vfill, cfill] = maybeColorChannel(fill, defaultFill);
|
|
31118
|
+
const [vfillOpacity, cfillOpacity] = maybeNumberChannel(fillOpacity, defaultFillOpacity);
|
|
31119
|
+
const [vstroke, cstroke] = maybeColorChannel(stroke, defaultStroke);
|
|
31120
|
+
const [vstrokeOpacity, cstrokeOpacity] = maybeNumberChannel(strokeOpacity, defaultStrokeOpacity);
|
|
31121
|
+
const [vopacity, copacity] = maybeNumberChannel(opacity2);
|
|
31122
|
+
if (!isNone(cstroke)) {
|
|
31123
|
+
if (strokeWidth === void 0)
|
|
31124
|
+
strokeWidth = defaultStrokeWidth;
|
|
31125
|
+
if (strokeLinecap === void 0)
|
|
31126
|
+
strokeLinecap = defaultStrokeLinecap;
|
|
31127
|
+
if (strokeLinejoin === void 0)
|
|
31128
|
+
strokeLinejoin = defaultStrokeLinejoin;
|
|
31129
|
+
if (strokeMiterlimit === void 0 && !isRound(strokeLinejoin))
|
|
31130
|
+
strokeMiterlimit = defaultStrokeMiterlimit;
|
|
31131
|
+
if (!isNone(cfill) && paintOrder === void 0)
|
|
31132
|
+
paintOrder = defaultPaintOrder;
|
|
31133
|
+
}
|
|
31134
|
+
const [vstrokeWidth, cstrokeWidth] = maybeNumberChannel(strokeWidth);
|
|
31135
|
+
if (defaultFill !== null) {
|
|
31136
|
+
mark.fill = impliedString(cfill, "currentColor");
|
|
31137
|
+
mark.fillOpacity = impliedNumber(cfillOpacity, 1);
|
|
31138
|
+
}
|
|
31139
|
+
if (defaultStroke !== null) {
|
|
31140
|
+
mark.stroke = impliedString(cstroke, "none");
|
|
31141
|
+
mark.strokeWidth = impliedNumber(cstrokeWidth, 1);
|
|
31142
|
+
mark.strokeOpacity = impliedNumber(cstrokeOpacity, 1);
|
|
31143
|
+
mark.strokeLinejoin = impliedString(strokeLinejoin, "miter");
|
|
31144
|
+
mark.strokeLinecap = impliedString(strokeLinecap, "butt");
|
|
31145
|
+
mark.strokeMiterlimit = impliedNumber(strokeMiterlimit, 4);
|
|
31146
|
+
mark.strokeDasharray = impliedString(strokeDasharray, "none");
|
|
31147
|
+
mark.strokeDashoffset = impliedString(strokeDashoffset, "0");
|
|
31148
|
+
}
|
|
31149
|
+
mark.target = string(target);
|
|
31150
|
+
mark.ariaLabel = string(cariaLabel);
|
|
31151
|
+
mark.ariaDescription = string(ariaDescription);
|
|
31152
|
+
mark.ariaHidden = string(ariaHidden);
|
|
31153
|
+
mark.opacity = impliedNumber(copacity, 1);
|
|
31154
|
+
mark.mixBlendMode = impliedString(mixBlendMode, "normal");
|
|
31155
|
+
mark.imageFilter = impliedString(imageFilter, "none");
|
|
31156
|
+
mark.paintOrder = impliedString(paintOrder, "normal");
|
|
31157
|
+
mark.pointerEvents = impliedString(pointerEvents, "auto");
|
|
31158
|
+
mark.shapeRendering = impliedString(shapeRendering, "auto");
|
|
31159
|
+
return {
|
|
31160
|
+
title: { value: title, optional: true, filter: null },
|
|
31161
|
+
href: { value: href, optional: true, filter: null },
|
|
31162
|
+
ariaLabel: { value: variaLabel, optional: true, filter: null },
|
|
31163
|
+
fill: { value: vfill, scale: "auto", optional: true },
|
|
31164
|
+
fillOpacity: { value: vfillOpacity, scale: "auto", optional: true },
|
|
31165
|
+
stroke: { value: vstroke, scale: "auto", optional: true },
|
|
31166
|
+
strokeOpacity: { value: vstrokeOpacity, scale: "auto", optional: true },
|
|
31167
|
+
strokeWidth: { value: vstrokeWidth, optional: true },
|
|
31168
|
+
opacity: { value: vopacity, scale: "auto", optional: true }
|
|
31169
|
+
};
|
|
31170
|
+
}
|
|
31171
|
+
function applyTitle(selection2, L) {
|
|
31172
|
+
if (L)
|
|
31173
|
+
selection2.filter((i) => nonempty(L[i])).append("title").call(applyText, L);
|
|
31174
|
+
}
|
|
31175
|
+
function applyTitleGroup(selection2, L) {
|
|
31176
|
+
if (L)
|
|
31177
|
+
selection2.filter(([i]) => nonempty(L[i])).append("title").call(applyTextGroup, L);
|
|
31178
|
+
}
|
|
31179
|
+
function applyText(selection2, T) {
|
|
31180
|
+
if (T)
|
|
31181
|
+
selection2.text((i) => formatDefault(T[i]));
|
|
31182
|
+
}
|
|
31183
|
+
function applyTextGroup(selection2, T) {
|
|
31184
|
+
if (T)
|
|
31185
|
+
selection2.text(([i]) => formatDefault(T[i]));
|
|
31186
|
+
}
|
|
31187
|
+
function applyChannelStyles(selection2, { target, tip: tip2 }, {
|
|
31188
|
+
ariaLabel: AL,
|
|
31189
|
+
title: T,
|
|
31190
|
+
fill: F,
|
|
31191
|
+
fillOpacity: FO,
|
|
31192
|
+
stroke: S,
|
|
31193
|
+
strokeOpacity: SO,
|
|
31194
|
+
strokeWidth: SW,
|
|
31195
|
+
opacity: O,
|
|
31196
|
+
href: H
|
|
31197
|
+
}) {
|
|
31198
|
+
if (AL)
|
|
31199
|
+
applyAttr(selection2, "aria-label", (i) => AL[i]);
|
|
31200
|
+
if (F)
|
|
31201
|
+
applyAttr(selection2, "fill", (i) => F[i]);
|
|
31202
|
+
if (FO)
|
|
31203
|
+
applyAttr(selection2, "fill-opacity", (i) => FO[i]);
|
|
31204
|
+
if (S)
|
|
31205
|
+
applyAttr(selection2, "stroke", (i) => S[i]);
|
|
31206
|
+
if (SO)
|
|
31207
|
+
applyAttr(selection2, "stroke-opacity", (i) => SO[i]);
|
|
31208
|
+
if (SW)
|
|
31209
|
+
applyAttr(selection2, "stroke-width", (i) => SW[i]);
|
|
31210
|
+
if (O)
|
|
31211
|
+
applyAttr(selection2, "opacity", (i) => O[i]);
|
|
31212
|
+
if (H)
|
|
31213
|
+
applyHref(selection2, (i) => H[i], target);
|
|
31214
|
+
if (!tip2)
|
|
31215
|
+
applyTitle(selection2, T);
|
|
31216
|
+
}
|
|
31217
|
+
function applyGroupedChannelStyles(selection2, { target, tip: tip2 }, {
|
|
31218
|
+
ariaLabel: AL,
|
|
31219
|
+
title: T,
|
|
31220
|
+
fill: F,
|
|
31221
|
+
fillOpacity: FO,
|
|
31222
|
+
stroke: S,
|
|
31223
|
+
strokeOpacity: SO,
|
|
31224
|
+
strokeWidth: SW,
|
|
31225
|
+
opacity: O,
|
|
31226
|
+
href: H
|
|
31227
|
+
}) {
|
|
31228
|
+
if (AL)
|
|
31229
|
+
applyAttr(selection2, "aria-label", ([i]) => AL[i]);
|
|
31230
|
+
if (F)
|
|
31231
|
+
applyAttr(selection2, "fill", ([i]) => F[i]);
|
|
31232
|
+
if (FO)
|
|
31233
|
+
applyAttr(selection2, "fill-opacity", ([i]) => FO[i]);
|
|
31234
|
+
if (S)
|
|
31235
|
+
applyAttr(selection2, "stroke", ([i]) => S[i]);
|
|
31236
|
+
if (SO)
|
|
31237
|
+
applyAttr(selection2, "stroke-opacity", ([i]) => SO[i]);
|
|
31238
|
+
if (SW)
|
|
31239
|
+
applyAttr(selection2, "stroke-width", ([i]) => SW[i]);
|
|
31240
|
+
if (O)
|
|
31241
|
+
applyAttr(selection2, "opacity", ([i]) => O[i]);
|
|
31242
|
+
if (H)
|
|
31243
|
+
applyHref(selection2, ([i]) => H[i], target);
|
|
31244
|
+
if (!tip2)
|
|
31245
|
+
applyTitleGroup(selection2, T);
|
|
31246
|
+
}
|
|
31247
|
+
function groupAesthetics({
|
|
31248
|
+
ariaLabel: AL,
|
|
31249
|
+
title: T,
|
|
31250
|
+
fill: F,
|
|
31251
|
+
fillOpacity: FO,
|
|
31252
|
+
stroke: S,
|
|
31253
|
+
strokeOpacity: SO,
|
|
31254
|
+
strokeWidth: SW,
|
|
31255
|
+
opacity: O,
|
|
31256
|
+
href: H
|
|
31257
|
+
}, { tip: tip2 }) {
|
|
31258
|
+
return [AL, tip2 ? void 0 : T, F, FO, S, SO, SW, O, H].filter((c4) => c4 !== void 0);
|
|
31259
|
+
}
|
|
31260
|
+
function groupZ2(I, Z, z) {
|
|
31261
|
+
const G = group(I, (i) => Z[i]);
|
|
31262
|
+
if (z === void 0 && G.size > 1 + I.length >> 1) {
|
|
31263
|
+
warn(
|
|
31264
|
+
`Warning: the implicit z channel has high cardinality. This may occur when the fill or stroke channel is associated with quantitative data rather than ordinal or categorical data. You can suppress this warning by setting the z option explicitly; if this data represents a single series, set z to null.`
|
|
31265
|
+
);
|
|
31266
|
+
}
|
|
31267
|
+
return G.values();
|
|
31268
|
+
}
|
|
31269
|
+
function* groupIndex(I, position3, mark, channels) {
|
|
31270
|
+
const { z } = mark;
|
|
31271
|
+
const { z: Z } = channels;
|
|
31272
|
+
const A5 = groupAesthetics(channels, mark);
|
|
31273
|
+
const C3 = [...position3, ...A5];
|
|
31274
|
+
for (const G of Z ? groupZ2(I, Z, z) : [I]) {
|
|
31275
|
+
let Ag;
|
|
31276
|
+
let Gg;
|
|
31277
|
+
out:
|
|
31278
|
+
for (const i of G) {
|
|
31279
|
+
for (const c4 of C3) {
|
|
31280
|
+
if (!defined(c4[i])) {
|
|
31281
|
+
if (Gg)
|
|
31282
|
+
Gg.push(-1);
|
|
31283
|
+
continue out;
|
|
31284
|
+
}
|
|
31285
|
+
}
|
|
31286
|
+
if (Ag === void 0) {
|
|
31287
|
+
if (Gg)
|
|
31288
|
+
yield Gg;
|
|
31289
|
+
Ag = A5.map((c4) => keyof2(c4[i])), Gg = [i];
|
|
31290
|
+
continue;
|
|
31291
|
+
}
|
|
31292
|
+
Gg.push(i);
|
|
31293
|
+
for (let j = 0; j < A5.length; ++j) {
|
|
31294
|
+
const k2 = keyof2(A5[j][i]);
|
|
31295
|
+
if (k2 !== Ag[j]) {
|
|
31296
|
+
yield Gg;
|
|
31297
|
+
Ag = A5.map((c4) => keyof2(c4[i])), Gg = [i];
|
|
31298
|
+
continue out;
|
|
31299
|
+
}
|
|
31300
|
+
}
|
|
31301
|
+
}
|
|
31302
|
+
if (Gg)
|
|
31303
|
+
yield Gg;
|
|
31304
|
+
}
|
|
31333
31305
|
}
|
|
31334
|
-
function
|
|
31335
|
-
|
|
31336
|
-
|
|
31337
|
-
|
|
31338
|
-
case
|
|
31339
|
-
|
|
31340
|
-
|
|
31341
|
-
|
|
31306
|
+
function applyClip(selection2, mark, dimensions, context) {
|
|
31307
|
+
let clipUrl;
|
|
31308
|
+
const { clip = context.clip } = mark;
|
|
31309
|
+
switch (clip) {
|
|
31310
|
+
case "frame": {
|
|
31311
|
+
const { width, height, marginLeft, marginRight, marginTop, marginBottom } = dimensions;
|
|
31312
|
+
const id2 = getClipId();
|
|
31313
|
+
clipUrl = `url(#${id2})`;
|
|
31314
|
+
selection2 = create3("svg:g", context).call(
|
|
31315
|
+
(g) => g.append("svg:clipPath").attr("id", id2).append("rect").attr("x", marginLeft).attr("y", marginTop).attr("width", width - marginRight - marginLeft).attr("height", height - marginTop - marginBottom)
|
|
31316
|
+
).each(function() {
|
|
31317
|
+
this.appendChild(selection2.node());
|
|
31318
|
+
selection2.node = () => this;
|
|
31319
|
+
});
|
|
31320
|
+
break;
|
|
31321
|
+
}
|
|
31322
|
+
case "sphere": {
|
|
31323
|
+
const { projection: projection3 } = context;
|
|
31324
|
+
if (!projection3)
|
|
31325
|
+
throw new Error(`the "sphere" clip option requires a projection`);
|
|
31326
|
+
const id2 = getClipId();
|
|
31327
|
+
clipUrl = `url(#${id2})`;
|
|
31328
|
+
selection2.append("clipPath").attr("id", id2).append("path").attr("d", path_default(projection3)({ type: "Sphere" }));
|
|
31329
|
+
break;
|
|
31330
|
+
}
|
|
31342
31331
|
}
|
|
31332
|
+
applyAttr(selection2, "aria-label", mark.ariaLabel);
|
|
31333
|
+
applyAttr(selection2, "aria-description", mark.ariaDescription);
|
|
31334
|
+
applyAttr(selection2, "aria-hidden", mark.ariaHidden);
|
|
31335
|
+
applyAttr(selection2, "clip-path", clipUrl);
|
|
31343
31336
|
}
|
|
31344
|
-
function
|
|
31345
|
-
|
|
31346
|
-
|
|
31347
|
-
|
|
31348
|
-
|
|
31337
|
+
function applyIndirectStyles(selection2, mark, dimensions, context) {
|
|
31338
|
+
applyClip(selection2, mark, dimensions, context);
|
|
31339
|
+
applyAttr(selection2, "fill", mark.fill);
|
|
31340
|
+
applyAttr(selection2, "fill-opacity", mark.fillOpacity);
|
|
31341
|
+
applyAttr(selection2, "stroke", mark.stroke);
|
|
31342
|
+
applyAttr(selection2, "stroke-width", mark.strokeWidth);
|
|
31343
|
+
applyAttr(selection2, "stroke-opacity", mark.strokeOpacity);
|
|
31344
|
+
applyAttr(selection2, "stroke-linejoin", mark.strokeLinejoin);
|
|
31345
|
+
applyAttr(selection2, "stroke-linecap", mark.strokeLinecap);
|
|
31346
|
+
applyAttr(selection2, "stroke-miterlimit", mark.strokeMiterlimit);
|
|
31347
|
+
applyAttr(selection2, "stroke-dasharray", mark.strokeDasharray);
|
|
31348
|
+
applyAttr(selection2, "stroke-dashoffset", mark.strokeDashoffset);
|
|
31349
|
+
applyAttr(selection2, "shape-rendering", mark.shapeRendering);
|
|
31350
|
+
applyAttr(selection2, "filter", mark.imageFilter);
|
|
31351
|
+
applyAttr(selection2, "paint-order", mark.paintOrder);
|
|
31352
|
+
const { pointerEvents = context.pointerSticky === false ? "none" : void 0 } = mark;
|
|
31353
|
+
applyAttr(selection2, "pointer-events", pointerEvents);
|
|
31349
31354
|
}
|
|
31350
|
-
function
|
|
31351
|
-
|
|
31355
|
+
function applyDirectStyles(selection2, mark) {
|
|
31356
|
+
applyStyle(selection2, "mix-blend-mode", mark.mixBlendMode);
|
|
31357
|
+
applyAttr(selection2, "opacity", mark.opacity);
|
|
31352
31358
|
}
|
|
31353
|
-
function
|
|
31354
|
-
|
|
31355
|
-
|
|
31356
|
-
|
|
31357
|
-
|
|
31358
|
-
|
|
31359
|
-
|
|
31360
|
-
|
|
31359
|
+
function applyHref(selection2, href, target) {
|
|
31360
|
+
selection2.each(function(i) {
|
|
31361
|
+
const h = href(i);
|
|
31362
|
+
if (h != null) {
|
|
31363
|
+
const a2 = this.ownerDocument.createElementNS(namespaces_default.svg, "a");
|
|
31364
|
+
a2.setAttribute("fill", "inherit");
|
|
31365
|
+
a2.setAttributeNS(namespaces_default.xlink, "href", h);
|
|
31366
|
+
if (target != null)
|
|
31367
|
+
a2.setAttribute("target", target);
|
|
31368
|
+
this.parentNode.insertBefore(a2, this).appendChild(this);
|
|
31361
31369
|
}
|
|
31362
|
-
}
|
|
31363
|
-
return true;
|
|
31370
|
+
});
|
|
31364
31371
|
}
|
|
31365
|
-
function
|
|
31366
|
-
|
|
31367
|
-
|
|
31368
|
-
if (domain === void 0)
|
|
31369
|
-
domain = c4.value?.domain;
|
|
31370
|
-
c4.value = coerceValues(c4.value);
|
|
31371
|
-
}
|
|
31372
|
-
}
|
|
31373
|
-
return {
|
|
31374
|
-
domain: domain === void 0 ? domain : coerceValues(domain),
|
|
31375
|
-
...options
|
|
31376
|
-
};
|
|
31372
|
+
function applyAttr(selection2, name, value) {
|
|
31373
|
+
if (value != null)
|
|
31374
|
+
selection2.attr(name, value);
|
|
31377
31375
|
}
|
|
31378
|
-
function
|
|
31379
|
-
|
|
31376
|
+
function applyStyle(selection2, name, value) {
|
|
31377
|
+
if (value != null)
|
|
31378
|
+
selection2.style(name, value);
|
|
31380
31379
|
}
|
|
31381
|
-
function
|
|
31382
|
-
|
|
31383
|
-
|
|
31384
|
-
|
|
31385
|
-
|
|
31386
|
-
|
|
31387
|
-
|
|
31388
|
-
|
|
31389
|
-
|
|
31390
|
-
scale3 = exposeScale(normalizeScale(key, options[key]));
|
|
31391
|
-
}
|
|
31392
|
-
if (scale3 === void 0)
|
|
31393
|
-
throw new Error("invalid scale definition; no scale found");
|
|
31394
|
-
return scale3;
|
|
31380
|
+
function applyTransform(selection2, mark, { x: x3, y: y3 }, tx = offset, ty = offset) {
|
|
31381
|
+
tx += mark.dx;
|
|
31382
|
+
ty += mark.dy;
|
|
31383
|
+
if (x3?.bandwidth)
|
|
31384
|
+
tx += x3.bandwidth() / 2;
|
|
31385
|
+
if (y3?.bandwidth)
|
|
31386
|
+
ty += y3.bandwidth() / 2;
|
|
31387
|
+
if (tx || ty)
|
|
31388
|
+
selection2.attr("transform", `translate(${tx},${ty})`);
|
|
31395
31389
|
}
|
|
31396
|
-
function
|
|
31397
|
-
|
|
31398
|
-
|
|
31399
|
-
throw new Error(`unknown scale: ${key}`);
|
|
31400
|
-
return scales2[key];
|
|
31401
|
-
};
|
|
31390
|
+
function impliedString(value, impliedValue) {
|
|
31391
|
+
if ((value = string(value)) !== impliedValue)
|
|
31392
|
+
return value;
|
|
31402
31393
|
}
|
|
31403
|
-
function
|
|
31404
|
-
if (
|
|
31405
|
-
return
|
|
31406
|
-
|
|
31407
|
-
|
|
31408
|
-
|
|
31409
|
-
|
|
31410
|
-
|
|
31411
|
-
|
|
31412
|
-
|
|
31413
|
-
|
|
31414
|
-
|
|
31415
|
-
|
|
31416
|
-
|
|
31417
|
-
|
|
31418
|
-
|
|
31419
|
-
|
|
31420
|
-
|
|
31421
|
-
|
|
31422
|
-
|
|
31423
|
-
|
|
31424
|
-
|
|
31425
|
-
|
|
31426
|
-
|
|
31427
|
-
|
|
31428
|
-
|
|
31429
|
-
|
|
31430
|
-
...scale3.align && { align: scale3.align(), round: scale3.round() },
|
|
31431
|
-
...scale3.padding && (scale3.paddingInner ? { paddingInner: scale3.paddingInner(), paddingOuter: scale3.paddingOuter() } : { padding: scale3.padding() }),
|
|
31432
|
-
...scale3.bandwidth && { bandwidth: scale3.bandwidth(), step: scale3.step() },
|
|
31433
|
-
// utilities
|
|
31434
|
-
apply: (t) => scale3(t),
|
|
31435
|
-
...scale3.invert && { invert: (t) => scale3.invert(t) }
|
|
31436
|
-
};
|
|
31394
|
+
function impliedNumber(value, impliedValue) {
|
|
31395
|
+
if ((value = number5(value)) !== impliedValue)
|
|
31396
|
+
return value;
|
|
31397
|
+
}
|
|
31398
|
+
var validClassName = /^-?([_a-z]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])([_a-z0-9-]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*$/i;
|
|
31399
|
+
function maybeClassName(name) {
|
|
31400
|
+
if (name === void 0)
|
|
31401
|
+
return "plot-d6a7b5";
|
|
31402
|
+
name = `${name}`;
|
|
31403
|
+
if (!validClassName.test(name))
|
|
31404
|
+
throw new Error(`invalid class name: ${name}`);
|
|
31405
|
+
return name;
|
|
31406
|
+
}
|
|
31407
|
+
function applyInlineStyles(selection2, style) {
|
|
31408
|
+
if (typeof style === "string") {
|
|
31409
|
+
selection2.property("style", style);
|
|
31410
|
+
} else if (style != null) {
|
|
31411
|
+
for (const element of selection2) {
|
|
31412
|
+
Object.assign(element.style, style);
|
|
31413
|
+
}
|
|
31414
|
+
}
|
|
31415
|
+
}
|
|
31416
|
+
function applyFrameAnchor({ frameAnchor }, { width, height, marginTop, marginRight, marginBottom, marginLeft }) {
|
|
31417
|
+
return [
|
|
31418
|
+
/left$/.test(frameAnchor) ? marginLeft : /right$/.test(frameAnchor) ? width - marginRight : (marginLeft + width - marginRight) / 2,
|
|
31419
|
+
/^top/.test(frameAnchor) ? marginTop : /^bottom/.test(frameAnchor) ? height - marginBottom : (marginTop + height - marginBottom) / 2
|
|
31420
|
+
];
|
|
31437
31421
|
}
|
|
31438
31422
|
|
|
31439
31423
|
// ../../node_modules/@observablehq/plot/src/dimensions.js
|
|
@@ -33179,19 +33163,28 @@ function axisTickKy(k2, anchor, data, {
|
|
|
33179
33163
|
y: y3 = k2 === "y" ? void 0 : null,
|
|
33180
33164
|
...options
|
|
33181
33165
|
}) {
|
|
33182
|
-
return axisMark(
|
|
33183
|
-
|
|
33184
|
-
|
|
33185
|
-
|
|
33186
|
-
|
|
33187
|
-
|
|
33188
|
-
|
|
33189
|
-
|
|
33190
|
-
|
|
33191
|
-
|
|
33192
|
-
|
|
33193
|
-
|
|
33194
|
-
|
|
33166
|
+
return axisMark(
|
|
33167
|
+
vectorY,
|
|
33168
|
+
k2,
|
|
33169
|
+
data,
|
|
33170
|
+
{
|
|
33171
|
+
ariaLabel: `${k2}-axis tick`,
|
|
33172
|
+
ariaHidden: true
|
|
33173
|
+
},
|
|
33174
|
+
{
|
|
33175
|
+
strokeWidth,
|
|
33176
|
+
strokeLinecap,
|
|
33177
|
+
strokeLinejoin,
|
|
33178
|
+
facetAnchor,
|
|
33179
|
+
frameAnchor,
|
|
33180
|
+
y: y3,
|
|
33181
|
+
...options,
|
|
33182
|
+
dx: anchor === "left" ? +dx - offset + +insetLeft : +dx + offset - insetRight,
|
|
33183
|
+
anchor: "start",
|
|
33184
|
+
length: tickSize,
|
|
33185
|
+
shape: anchor === "left" ? shapeTickLeft : shapeTickRight
|
|
33186
|
+
}
|
|
33187
|
+
);
|
|
33195
33188
|
}
|
|
33196
33189
|
function axisTickKx(k2, anchor, data, {
|
|
33197
33190
|
strokeWidth = 1,
|
|
@@ -33207,19 +33200,28 @@ function axisTickKx(k2, anchor, data, {
|
|
|
33207
33200
|
x: x3 = k2 === "x" ? void 0 : null,
|
|
33208
33201
|
...options
|
|
33209
33202
|
}) {
|
|
33210
|
-
return axisMark(
|
|
33211
|
-
|
|
33212
|
-
|
|
33213
|
-
|
|
33214
|
-
|
|
33215
|
-
|
|
33216
|
-
|
|
33217
|
-
|
|
33218
|
-
|
|
33219
|
-
|
|
33220
|
-
|
|
33221
|
-
|
|
33222
|
-
|
|
33203
|
+
return axisMark(
|
|
33204
|
+
vectorX,
|
|
33205
|
+
k2,
|
|
33206
|
+
data,
|
|
33207
|
+
{
|
|
33208
|
+
ariaLabel: `${k2}-axis tick`,
|
|
33209
|
+
ariaHidden: true
|
|
33210
|
+
},
|
|
33211
|
+
{
|
|
33212
|
+
strokeWidth,
|
|
33213
|
+
strokeLinejoin,
|
|
33214
|
+
strokeLinecap,
|
|
33215
|
+
facetAnchor,
|
|
33216
|
+
frameAnchor,
|
|
33217
|
+
x: x3,
|
|
33218
|
+
...options,
|
|
33219
|
+
dy: anchor === "bottom" ? +dy - offset - insetBottom : +dy + offset + +insetTop,
|
|
33220
|
+
anchor: "start",
|
|
33221
|
+
length: tickSize,
|
|
33222
|
+
shape: anchor === "bottom" ? shapeTickBottom : shapeTickTop
|
|
33223
|
+
}
|
|
33224
|
+
);
|
|
33223
33225
|
}
|
|
33224
33226
|
function axisTextKy(k2, anchor, data, {
|
|
33225
33227
|
facetAnchor = anchor + (k2 === "y" ? "-empty" : ""),
|
|
@@ -33241,9 +33243,8 @@ function axisTextKy(k2, anchor, data, {
|
|
|
33241
33243
|
return axisMark(
|
|
33242
33244
|
textY,
|
|
33243
33245
|
k2,
|
|
33244
|
-
anchor,
|
|
33245
|
-
`${k2}-axis tick label`,
|
|
33246
33246
|
data,
|
|
33247
|
+
{ ariaLabel: `${k2}-axis tick label` },
|
|
33247
33248
|
{
|
|
33248
33249
|
facetAnchor,
|
|
33249
33250
|
frameAnchor,
|
|
@@ -33284,9 +33285,8 @@ function axisTextKx(k2, anchor, data, {
|
|
|
33284
33285
|
return axisMark(
|
|
33285
33286
|
textX,
|
|
33286
33287
|
k2,
|
|
33287
|
-
anchor,
|
|
33288
|
-
`${k2}-axis tick label`,
|
|
33289
33288
|
data,
|
|
33289
|
+
{ ariaLabel: `${k2}-axis tick label` },
|
|
33290
33290
|
{
|
|
33291
33291
|
facetAnchor,
|
|
33292
33292
|
frameAnchor,
|
|
@@ -33330,7 +33330,7 @@ function gridKy(k2, anchor, data, {
|
|
|
33330
33330
|
x2: x22 = anchor === "right" ? x3 : null,
|
|
33331
33331
|
...options
|
|
33332
33332
|
}) {
|
|
33333
|
-
return axisMark(ruleY, k2,
|
|
33333
|
+
return axisMark(ruleY, k2, data, { ariaLabel: `${k2}-grid`, ariaHidden: true }, { y: y3, x1: x12, x2: x22, ...gridDefaults(options) });
|
|
33334
33334
|
}
|
|
33335
33335
|
function gridKx(k2, anchor, data, {
|
|
33336
33336
|
x: x3 = k2 === "x" ? void 0 : null,
|
|
@@ -33339,7 +33339,7 @@ function gridKx(k2, anchor, data, {
|
|
|
33339
33339
|
y2: y22 = anchor === "bottom" ? y3 : null,
|
|
33340
33340
|
...options
|
|
33341
33341
|
}) {
|
|
33342
|
-
return axisMark(ruleX, k2,
|
|
33342
|
+
return axisMark(ruleX, k2, data, { ariaLabel: `${k2}-grid`, ariaHidden: true }, { x: x3, y1: y12, y2: y22, ...gridDefaults(options) });
|
|
33343
33343
|
}
|
|
33344
33344
|
function gridDefaults({
|
|
33345
33345
|
color: color3 = "currentColor",
|
|
@@ -33384,7 +33384,7 @@ function labelOptions({
|
|
|
33384
33384
|
initializer: initializer2
|
|
33385
33385
|
};
|
|
33386
33386
|
}
|
|
33387
|
-
function axisMark(mark, k2,
|
|
33387
|
+
function axisMark(mark, k2, data, properties, options, initialize) {
|
|
33388
33388
|
let channels;
|
|
33389
33389
|
function axisInitializer(data2, facets, _channels, scales2, dimensions, context) {
|
|
33390
33390
|
const initializeFacets = data2 == null && (k2 === "fx" || k2 === "fy");
|
|
@@ -33456,7 +33456,8 @@ function axisMark(mark, k2, anchor, ariaLabel, data, options, initialize) {
|
|
|
33456
33456
|
} else {
|
|
33457
33457
|
channels = {};
|
|
33458
33458
|
}
|
|
33459
|
-
|
|
33459
|
+
if (properties !== void 0)
|
|
33460
|
+
Object.assign(m, properties);
|
|
33460
33461
|
if (m.clip === void 0)
|
|
33461
33462
|
m.clip = false;
|
|
33462
33463
|
return m;
|
|
@@ -34356,7 +34357,6 @@ function plot(options = {}) {
|
|
|
34356
34357
|
}
|
|
34357
34358
|
figure.scale = exposeScales(scales2.scales);
|
|
34358
34359
|
figure.legend = exposeLegends(scaleDescriptors, context, options);
|
|
34359
|
-
figure.projection = context.projection;
|
|
34360
34360
|
const w = consumeWarnings();
|
|
34361
34361
|
if (w > 0) {
|
|
34362
34362
|
select_default2(svg).append("text").attr("x", width).attr("y", 20).attr("dy", "-1em").attr("text-anchor", "end").attr("font-family", "initial").text("\u26A0\uFE0F").append("title").text(`${w.toLocaleString("en-US")} warning${w === 1 ? "" : "s"}. Please check the console.`);
|
|
@@ -34886,6 +34886,8 @@ function binn(bx, by, gx, gy, {
|
|
|
34886
34886
|
for (const [f, I] of maybeGroup(facet, G)) {
|
|
34887
34887
|
for (const [k3, g] of maybeGroup(I, K2)) {
|
|
34888
34888
|
for (const [b, extent4] of bin3(g)) {
|
|
34889
|
+
if (G)
|
|
34890
|
+
extent4.z = f;
|
|
34889
34891
|
if (filter3 && !filter3.reduce(b, extent4))
|
|
34890
34892
|
continue;
|
|
34891
34893
|
groupFacet.push(i++);
|
|
@@ -34905,7 +34907,7 @@ function binn(bx, by, gx, gy, {
|
|
|
34905
34907
|
for (const o of outputs)
|
|
34906
34908
|
o.reduce(b, extent4);
|
|
34907
34909
|
if (sort3)
|
|
34908
|
-
sort3.reduce(b);
|
|
34910
|
+
sort3.reduce(b, extent4);
|
|
34909
34911
|
}
|
|
34910
34912
|
}
|
|
34911
34913
|
}
|
|
@@ -35072,6 +35074,8 @@ function maybeBinReduceFallback(reduce) {
|
|
|
35072
35074
|
return reduceY1;
|
|
35073
35075
|
case "y2":
|
|
35074
35076
|
return reduceY22;
|
|
35077
|
+
case "z":
|
|
35078
|
+
return reduceZ;
|
|
35075
35079
|
}
|
|
35076
35080
|
throw new Error(`invalid bin reduce: ${reduce}`);
|
|
35077
35081
|
}
|