diff --git a/README.md b/README.md index d4960a78a6..7fae0a34aa 100644 --- a/README.md +++ b/README.md @@ -1749,11 +1749,19 @@ In addition to the [standard mark options](#marks), the following optional chann If either of the **x** or **y** channels are not specified, the corresponding position is controlled by the **frameAnchor** option. -The following options are also supported: +The following constant options are also supported: +* **shape** - the shape of the vector; defaults to *arrow* +* **r** - a radius in pixels; defaults to 3.5 * **anchor** - one of *start*, *middle*, or *end*; defaults to *middle* * **frameAnchor** - the [frame anchor](#frameanchor); defaults to *middle* +The **shape** option controls the visual appearance (path geometry) of the vector and supports the following values: + +* *arrow* (default) - an arrow with head size proportional to its length +* *spike* - an isosceles triangle with open base +* any object with a **draw** method; it receives a *context*, *length*, and *radius* + If the **anchor** is *start*, the arrow will start at the given *xy* position and point in the direction given by the rotation angle. If the **anchor** is *end*, the arrow will maintain the same orientation, but be positioned such that it ends in the given *xy* position. If the **anchor** is *middle*, the arrow will be likewise be positioned such that its midpoint intersects the given *xy* position. If the **x** channel is not specified, vectors will be horizontally centered in the plot (or facet). Likewise if the **y** channel is not specified, vectors will be vertically centered in the plot (or facet). Typically either *x*, *y*, or both are specified. @@ -1792,6 +1800,14 @@ Equivalent to [Plot.vector](#plotvectordata-options) except that if the **y** op +#### Plot.spike(*data*, *options*) + + + +Equivalent to [Plot.vector](#plotvectordata-options) except that the **shape** defaults to *spike*, the **stroke** defaults to *currentColor*, the **strokeWidth** defaults to 1, the **fill** defaults to **stroke**, the **fillOpacity** defaults to 0.3, and the **anchor** defaults to *start*. + + + ## Decorations Decorations are static marks that do not represent data. Currently this includes only [Plot.frame](#frame), although internally Plot’s axes are implemented as decorations and may in the future be exposed here for more flexible configuration. @@ -2064,6 +2080,32 @@ Bins on *y*. Also groups on *x* and first channel of *z*, *fill*, or *stroke*, i +### Centroid + +#### Plot.centroid(*options*) + + + +The centroid initializer derives **x** and **y** channels representing the planar (projected) centroids for the the given GeoJSON geometry. If the **geometry** option is not specified, the mark’s data is assumed to be GeoJSON objects. + +```js +Plot.dot(regions.features, Plot.centroid()).plot({projection: "reflect-y"}) +``` + + + +#### Plot.geoCentroid(*options*) + + + +The geoCentroid transform derives **x** and **y** channels representing the spherical centroids for the the given GeoJSON geometry. If the **geometry** option is not specified, the mark’s data is assumed to be GeoJSON objects. + +```js +Plot.dot(counties.features, Plot.geoCentroid()).plot({projection: "albers-usa"}) +``` + + + ### Group [a histogram of penguins by species](https://observablehq.com/@observablehq/plot-group) diff --git a/src/index.js b/src/index.js index aebeac3b0e..1f25d2b7d9 100644 --- a/src/index.js +++ b/src/index.js @@ -19,10 +19,11 @@ export {RuleX, RuleY, ruleX, ruleY} from "./marks/rule.js"; export {Text, text, textX, textY} from "./marks/text.js"; export {TickX, TickY, tickX, tickY} from "./marks/tick.js"; export {tree, cluster} from "./marks/tree.js"; -export {Vector, vector, vectorX, vectorY} from "./marks/vector.js"; +export {Vector, vector, vectorX, vectorY, spike} from "./marks/vector.js"; export {valueof, column} from "./options.js"; export {filter, reverse, sort, shuffle, basic as transform, initializer} from "./transforms/basic.js"; export {bin, binX, binY} from "./transforms/bin.js"; +export {centroid, geoCentroid} from "./transforms/centroid.js"; export {dodgeX, dodgeY} from "./transforms/dodge.js"; export {group, groupX, groupY, groupZ} from "./transforms/group.js"; export {hexbin} from "./transforms/hexbin.js"; diff --git a/src/marks/dot.js b/src/marks/dot.js index d6198ad2c1..4109260fc7 100644 --- a/src/marks/dot.js +++ b/src/marks/dot.js @@ -11,6 +11,7 @@ import { applyTransform } from "../style.js"; import {maybeSymbolChannel} from "../symbols.js"; +import {template} from "../template.js"; import {sort} from "../transforms/basic.js"; import {maybeIntervalMidX, maybeIntervalMidY} from "../transforms/interval.js"; @@ -66,9 +67,10 @@ export class Dot extends Mark { render(index, scales, channels, dimensions, context) { const {x, y} = scales; const {x: X, y: Y, r: R, rotate: A, symbol: S} = channels; + const {r, rotate, symbol} = this; const [cx, cy] = applyFrameAnchor(this, dimensions); const circle = this.symbol === symbolCircle; - const {r} = this; + const size = R ? undefined : r * r * Math.PI; if (negative(r)) index = []; return create("svg:g", context) .call(applyIndirectStyles, this, scales, dimensions, context) @@ -89,29 +91,39 @@ export class Dot extends Mark { .attr("r", R ? (i) => R[i] : r); } : (selection) => { - const translate = - X && Y - ? (i) => `translate(${X[i]},${Y[i]})` - : X - ? (i) => `translate(${X[i]},${cy})` - : Y - ? (i) => `translate(${cx},${Y[i]})` - : () => `translate(${cx},${cy})`; selection .attr( "transform", - A - ? (i) => `${translate(i)} rotate(${A[i]})` - : this.rotate - ? (i) => `${translate(i)} rotate(${this.rotate})` - : translate + template`translate(${X ? (i) => X[i] : cx},${Y ? (i) => Y[i] : cy})${ + A ? (i) => ` rotate(${A[i]})` : rotate ? ` rotate(${rotate})` : `` + }` ) - .attr("d", (i) => { - const p = path(), - radius = R ? R[i] : r; - (S ? S[i] : this.symbol).draw(p, radius * radius * Math.PI); - return p; - }); + .attr( + "d", + R && S + ? (i) => { + const p = path(); + S[i].draw(p, R[i] * R[i] * Math.PI); + return p; + } + : R + ? (i) => { + const p = path(); + symbol.draw(p, R[i] * R[i] * Math.PI); + return p; + } + : S + ? (i) => { + const p = path(); + S[i].draw(p, size); + return p; + } + : (() => { + const p = path(); + symbol.draw(p, size); + return p; + })() + ); } ) .call(applyChannelStyles, this, channels) diff --git a/src/marks/text.js b/src/marks/text.js index 0f9a7d8997..c1414080b3 100644 --- a/src/marks/text.js +++ b/src/marks/text.js @@ -26,6 +26,7 @@ import { impliedString, applyFrameAnchor } from "../style.js"; +import {template} from "../template.js"; import {maybeIntervalMidX, maybeIntervalMidY} from "../transforms/interval.js"; const defaults = { @@ -100,29 +101,9 @@ export class Text extends Mark { .call(applyMultilineText, this, T) .attr( "transform", - R - ? X && Y - ? (i) => `translate(${X[i]},${Y[i]}) rotate(${R[i]})` - : X - ? (i) => `translate(${X[i]},${cy}) rotate(${R[i]})` - : Y - ? (i) => `translate(${cx},${Y[i]}) rotate(${R[i]})` - : (i) => `translate(${cx},${cy}) rotate(${R[i]})` - : rotate - ? X && Y - ? (i) => `translate(${X[i]},${Y[i]}) rotate(${rotate})` - : X - ? (i) => `translate(${X[i]},${cy}) rotate(${rotate})` - : Y - ? (i) => `translate(${cx},${Y[i]}) rotate(${rotate})` - : `translate(${cx},${cy}) rotate(${rotate})` - : X && Y - ? (i) => `translate(${X[i]},${Y[i]})` - : X - ? (i) => `translate(${X[i]},${cy})` - : Y - ? (i) => `translate(${cx},${Y[i]})` - : `translate(${cx},${cy})` + template`translate(${X ? (i) => X[i] : cx},${Y ? (i) => Y[i] : cy})${ + R ? (i) => ` rotate(${R[i]})` : rotate ? ` rotate(${rotate})` : `` + }` ) .call(applyAttr, "font-size", FS && ((i) => FS[i])) .call(applyChannelStyles, this, channels) diff --git a/src/marks/vector.js b/src/marks/vector.js index 296ce43869..3541c02f66 100644 --- a/src/marks/vector.js +++ b/src/marks/vector.js @@ -1,5 +1,5 @@ +import {path} from "d3"; import {create} from "../context.js"; -import {radians} from "../math.js"; import {maybeFrameAnchor, maybeNumberChannel, maybeTuple, keyword, identity} from "../options.js"; import {Mark} from "../plot.js"; import { @@ -9,18 +9,63 @@ import { applyIndirectStyles, applyTransform } from "../style.js"; +import {template} from "../template.js"; const defaults = { ariaLabel: "vector", - fill: null, + fill: "none", stroke: "currentColor", strokeWidth: 1.5, + strokeLinejoin: "round", strokeLinecap: "round" }; +const defaultRadius = 3.5; + +// The size of the arrowhead is proportional to its length, but we still allow +// the relative size of the head to be controlled via the mark’s width option; +// doubling the default radius will produce an arrowhead that is twice as big. +// That said, we’ll probably want a arrow with a fixed head size, too. +const wingRatio = defaultRadius * 5; + +const shapeArrow = { + draw(context, l, r) { + const wing = (l * r) / wingRatio; + context.moveTo(0, 0); + context.lineTo(0, -l); + context.moveTo(-wing, wing - l); + context.lineTo(0, -l); + context.lineTo(wing, wing - l); + } +}; + +const shapeSpike = { + draw(context, l, r) { + context.moveTo(-r, 0); + context.lineTo(0, -l); + context.lineTo(r, 0); + } +}; + +const shapes = new Map([ + ["arrow", shapeArrow], + ["spike", shapeSpike] +]); + +function isShapeObject(value) { + return value && typeof value.draw === "function"; +} + +function Shape(shape) { + if (isShapeObject(shape)) return shape; + const value = shapes.get(`${shape}`.toLowerCase()); + if (value) return value; + throw new Error(`invalid shape: ${shape}`); +} + export class Vector extends Mark { constructor(data, options = {}) { - const {x, y, length, rotate, anchor = "middle", frameAnchor} = options; + const {x, y, r = defaultRadius, length, rotate, shape = shapeArrow, anchor = "middle", frameAnchor} = options; const [vl, cl] = maybeNumberChannel(length, 12); const [vr, cr] = maybeNumberChannel(rotate, 0); super( @@ -34,23 +79,19 @@ export class Vector extends Mark { options, defaults ); + this.r = +r; this.length = cl; this.rotate = cr; + this.shape = Shape(shape); this.anchor = keyword(anchor, "anchor", ["start", "middle", "end"]); this.frameAnchor = maybeFrameAnchor(frameAnchor); } render(index, scales, channels, dimensions, context) { const {x, y} = scales; - const {x: X, y: Y, length: L, rotate: R} = channels; - const {length, rotate, anchor} = this; + const {x: X, y: Y, length: L, rotate: A} = channels; + const {length, rotate, anchor, shape, r} = this; const [cx, cy] = applyFrameAnchor(this, dimensions); - const fl = L ? (i) => L[i] : () => length; - const fr = R ? (i) => R[i] : () => rotate; - const fx = X ? (i) => X[i] : () => cx; - const fy = Y ? (i) => Y[i] : () => cy; - const k = anchor === "start" ? 0 : anchor === "end" ? 1 : 0.5; return create("svg:g", context) - .attr("fill", "none") .call(applyIndirectStyles, this, scales, dimensions, context) .call(applyTransform, this, {x: X && x, y: Y && y}) .call((g) => @@ -60,15 +101,36 @@ export class Vector extends Mark { .enter() .append("path") .call(applyDirectStyles, this) - .attr("d", (i) => { - const l = fl(i), - a = fr(i) * radians; - const x = Math.sin(a) * l, - y = -Math.cos(a) * l; - const d = (x + y) / 5, - e = (x - y) / 5; - return `M${fx(i) - x * k},${fy(i) - y * k}l${x},${y}m${-e},${-d}l${e},${d}l${-d},${e}`; - }) + .attr( + "transform", + template`translate(${X ? (i) => X[i] : cx},${Y ? (i) => Y[i] : cy})${ + A ? (i) => ` rotate(${A[i]})` : rotate ? ` rotate(${rotate})` : `` + }${ + anchor === "start" + ? `` + : anchor === "end" + ? L + ? (i) => ` translate(0,${L[i]})` + : ` translate(0,${length})` + : L + ? (i) => ` translate(0,${L[i] / 2})` + : ` translate(0,${length / 2})` + }` + ) + .attr( + "d", + L + ? (i) => { + const p = path(); + shape.draw(p, L[i], r); + return p; + } + : (() => { + const p = path(); + shape.draw(p, length, r); + return p; + })() + ) .call(applyChannelStyles, this, channels) ) .node(); @@ -77,19 +139,33 @@ export class Vector extends Mark { /** @jsdoc vector */ export function vector(data, options = {}) { - let {x, y, ...remainingOptions} = options; + let {x, y, ...rest} = options; if (options.frameAnchor === undefined) [x, y] = maybeTuple(x, y); - return new Vector(data, {...remainingOptions, x, y}); + return new Vector(data, {...rest, x, y}); } /** @jsdoc vectorX */ export function vectorX(data, options = {}) { - const {x = identity, ...remainingOptions} = options; - return new Vector(data, {...remainingOptions, x}); + const {x = identity, ...rest} = options; + return new Vector(data, {...rest, x}); } /** @jsdoc vectorY */ export function vectorY(data, options = {}) { - const {y = identity, ...remainingOptions} = options; - return new Vector(data, {...remainingOptions, y}); + const {y = identity, ...rest} = options; + return new Vector(data, {...rest, y}); +} + +/** @jsdoc spike */ +export function spike(data, options = {}) { + const { + shape = shapeSpike, + stroke = defaults.stroke, + strokeWidth = 1, + fill = stroke, + fillOpacity = 0.3, + anchor = "start", + ...rest + } = options; + return vector(data, {...rest, shape, stroke, strokeWidth, fill, fillOpacity, anchor}); } diff --git a/src/template.js b/src/template.js new file mode 100644 index 0000000000..a12aa434e9 --- /dev/null +++ b/src/template.js @@ -0,0 +1,25 @@ +export function template(strings, ...parts) { + let n = parts.length; + + // If any of the interpolated parameters are strings rather than functions, + // bake them into the template to optimize performance during render. + for (let j = 0, copy = true; j < n; ++j) { + if (typeof parts[j] !== "function") { + if (copy) { + strings = strings.slice(); // copy before mutate + copy = false; + } + strings.splice(j, 2, strings[j] + parts[j] + strings[j + 1]); + parts.splice(j, 1); + --j, --n; + } + } + + return (i) => { + let s = strings[0]; + for (let j = 0; j < n; ++j) { + s += parts[j](i) + strings[j + 1]; + } + return s; + }; +} diff --git a/src/transforms/centroid.js b/src/transforms/centroid.js new file mode 100644 index 0000000000..69575135b1 --- /dev/null +++ b/src/transforms/centroid.js @@ -0,0 +1,27 @@ +import {geoCentroid as GeoCentroid, geoPath} from "d3"; +import {identity, valueof} from "../options.js"; +import {initializer} from "./basic.js"; + +/** @jsdoc centroid */ +export function centroid({geometry = identity, ...options} = {}) { + // Suppress defaults for x and y since they will be computed by the initializer. + return initializer({...options, x: null, y: null}, (data, facets, channels, scales, dimensions, {projection}) => { + const G = valueof(data, geometry); + const n = G.length; + const X = new Float64Array(n); + const Y = new Float64Array(n); + const path = geoPath(projection); + for (let i = 0; i < n; ++i) [X[i], Y[i]] = path.centroid(G[i]); + return {data, facets, channels: {x: {value: X}, y: {value: Y}}}; + }); +} + +/** @jsdoc geoCentroid */ +export function geoCentroid({geometry = identity, ...options} = {}) { + let C; + return { + ...options, + x: {transform: (data) => Float64Array.from((C = valueof(valueof(data, geometry), GeoCentroid)), ([x]) => x)}, + y: {transform: () => Float64Array.from(C, ([, y]) => y)} + }; +} diff --git a/test/data/us-county-population.csv b/test/data/us-county-population.csv new file mode 100644 index 0000000000..892d6000c3 --- /dev/null +++ b/test/data/us-county-population.csv @@ -0,0 +1,2911 @@ +state,county,population +13,213,39358 +13,215,200303 +13,217,103901 +13,219,35071 +25,019,10694 +25,021,691218 +25,023,506657 +25,025,767719 +25,027,813589 +26,001,10461 +26,003,9396 +26,005,113666 +26,007,28929 +26,009,23215 +26,011,15327 +26,013,8612 +26,015,59316 +26,017,106107 +26,019,17462 +26,021,155134 +26,023,43603 +26,025,134691 +26,027,51795 +26,029,26172 +26,031,25579 +26,033,38330 +26,035,30608 +26,037,77245 +26,039,13840 +26,041,36570 +26,043,25889 +26,045,108544 +26,047,33091 +26,049,413090 +26,051,25367 +26,053,15650 +26,055,90715 +26,057,41676 +26,059,46024 +26,061,36565 +26,063,32021 +26,065,284559 +26,067,64126 +26,069,25373 +26,071,11393 +26,073,70574 +26,075,159483 +26,077,258605 +26,079,17259 +26,081,629352 +26,085,11415 +26,087,88310 +26,089,21764 +26,091,98673 +26,093,185841 +26,095,6451 +26,097,10998 +26,099,859703 +26,101,24465 +26,103,67418 +26,105,28755 +26,107,43259 +26,109,23568 +26,111,83559 +26,113,15032 +26,115,149945 +26,117,62922 +26,119,9317 +26,121,172148 +26,123,47957 +26,125,1235215 +26,127,26152 +26,129,21103 +26,131,6165 +26,133,23172 +26,135,8374 +26,137,24198 +26,139,276583 +26,141,12955 +26,143,23900 +26,145,195201 +26,147,160069 +26,149,60923 +26,151,41761 +26,153,8186 +26,155,68800 +26,157,54014 +26,159,75216 +26,161,358082 +26,163,1767593 +26,165,32829 +27,001,15722 +27,003,341249 +27,005,33375 +27,007,45644 +27,009,39457 +27,011,5098 +27,013,65524 +27,015,25327 +27,017,35482 +27,019,97143 +27,021,28633 +27,023,12126 +27,025,54041 +27,027,61402 +27,029,8764 +27,031,5215 +27,033,11557 +27,035,63321 +27,037,411402 +27,039,20361 +27,041,36862 +27,043,14119 +27,045,20877 +27,047,30751 +27,049,46450 +27,051,5943 +27,053,1209265 +27,055,18791 +27,057,20640 +27,059,38461 +27,061,45356 +27,063,10163 +27,065,15918 +27,067,42510 +27,071,12930 +27,073,6916 +27,075,10721 +27,079,27650 +27,081,5793 +27,083,25670 +27,085,35926 +27,087,5480 +27,089,9406 +27,091,20193 +27,093,23094 +27,095,25788 +27,097,32850 +27,099,39248 +27,101,8463 +27,103,33226 +27,105,21729 +27,107,6638 +27,109,150104 +27,111,57694 +27,113,14156 +27,115,29067 +27,117,9285 +27,119,31550 +27,121,10975 +27,123,531528 +27,127,15578 +27,129,14995 +27,131,65116 +27,133,9554 +27,135,15609 +27,137,200353 +27,139,139490 +27,141,91188 +27,143,14957 +27,145,153661 +27,147,36541 +27,149,9762 +27,151,9483 +27,153,24335 +27,157,21327 +27,159,13755 +27,161,19034 +27,163,248745 +27,165,10996 +27,167,6479 +27,169,51145 +27,171,129922 +27,173,10038 +28,001,31747 +28,003,37309 +28,005,12692 +28,007,19085 +28,009,8378 +28,011,33615 +28,013,14724 +28,015,10301 +28,017,17357 +28,019,8320 +28,021,9209 +28,023,16203 +28,025,20147 +28,027,24804 +28,029,28780 +28,031,19503 +28,033,170890 +28,035,76274 +28,037,7818 +28,039,23313 +28,041,13941 +28,043,21518 +28,045,46028 +28,047,198570 +28,049,244596 +28,051,18547 +28,053,8822 +28,057,23511 +28,059,140850 +28,061,16538 +28,063,7528 +28,065,11771 +28,067,68313 +28,069,10128 +28,071,52193 +28,073,59623 +28,075,79233 +28,077,12603 +28,079,23011 +28,081,85281 +28,083,30500 +28,085,34691 +28,087,59785 +28,089,101791 +28,091,25810 +28,093,36196 +28,095,36029 +28,097,10353 +28,099,29474 +28,101,21652 +28,103,11098 +28,105,49424 +28,107,34319 +28,109,55167 +28,111,12174 +28,113,39939 +28,115,30862 +28,117,25339 +28,119,7634 +28,121,147930 +28,123,28268 +28,127,27279 +28,129,16137 +28,131,17995 +28,133,27424 +28,135,14776 +28,137,28338 +28,139,22061 +28,141,19503 +28,143,10407 +28,145,27989 +28,147,14812 +28,149,47834 +28,151,48824 +31,051,5809 +31,053,36679 +31,055,543253 +31,059,5676 +31,067,21778 +31,079,61105 +31,081,9118 +31,089,10360 +31,093,6365 +31,095,7354 +31,097,5167 +31,099,6548 +31,101,8103 +31,107,8551 +31,109,301707 +31,111,35777 +31,119,35125 +31,121,7793 +31,127,7101 +31,131,15890 +31,137,9236 +31,139,7179 +31,141,32703 +31,143,5242 +31,145,10884 +31,147,8149 +31,151,14356 +31,153,172460 +31,155,20946 +31,157,36599 +31,159,17113 +31,161,5259 +31,167,6022 +31,169,5163 +31,173,6989 +31,177,20338 +31,179,9414 +31,185,13842 +32,001,24148 +32,003,2070153 +32,005,47426 +32,007,52029 +32,013,17091 +32,015,5907 +32,017,5155 +32,019,51897 +32,023,43198 +32,027,6690 +32,031,439914 +32,033,9893 +32,510,54412 +33,001,60392 +33,003,47416 +33,005,76320 +33,007,32219 +33,009,89164 +33,011,404948 +33,013,147715 +33,015,300365 +33,017,125913 +33,019,43051 +34,001,274026 +34,003,930310 +34,005,450236 +34,007,511145 +34,009,95404 +34,011,155744 +34,013,792586 +34,015,291286 +34,017,668526 +34,019,125708 +34,021,371101 +34,023,831852 +34,025,627532 +34,027,498215 +34,029,586166 +34,031,507204 +34,033,64504 +34,035,331686 +34,037,144694 +34,039,550436 +34,041,107095 +28,153,20517 +28,155,9922 +28,157,9233 +28,159,18519 +28,161,12380 +28,163,27719 +29,001,25547 +29,003,17347 +29,005,5380 +29,007,25868 +29,009,35716 +29,011,12075 +29,013,16513 +29,015,18825 +29,017,12282 +29,019,172773 +29,021,89415 +29,023,42887 +29,025,9057 +29,027,44693 +29,029,44152 +29,031,78089 +29,033,9009 +29,035,6249 +29,037,101324 +29,039,13932 +29,041,7615 +29,043,82053 +29,045,6860 +29,047,233135 +29,049,20494 +29,051,76603 +29,053,17613 +29,055,24545 +29,057,7590 +29,059,16508 +29,061,8257 +29,063,12706 +29,065,15578 +29,067,13467 +29,069,31271 +29,071,102063 +29,073,14875 +29,075,6745 +29,077,285449 +29,079,10231 +29,081,8649 +29,083,21930 +29,085,9267 +29,089,10148 +29,091,40265 +29,093,10220 +29,095,683643 +29,097,117376 +29,099,222453 +29,101,54229 +29,105,35505 +29,107,32789 +29,109,38204 +29,111,10146 +29,113,54286 +29,115,12319 +29,117,15057 +29,119,22720 +29,121,15399 +29,123,12403 +29,125,8987 +29,127,28858 +29,131,25011 +29,133,14112 +29,135,15840 +29,137,8642 +29,139,11820 +29,141,20182 +29,143,18229 +29,145,58741 +29,147,23026 +29,149,10922 +29,151,13704 +29,153,9450 +29,155,17599 +29,157,19152 +29,159,42193 +29,161,44833 +29,163,18475 +29,165,94970 +29,167,31113 +29,169,53302 +29,173,10225 +29,175,25081 +29,177,22921 +29,179,6530 +29,181,13936 +29,183,379856 +29,185,9444 +29,186,17937 +29,187,66230 +29,189,1000560 +29,195,23214 +29,201,38994 +29,203,8256 +29,205,6148 +29,207,29788 +29,209,31197 +29,211,6416 +29,213,53853 +29,215,25690 +29,217,20836 +29,219,33290 +29,221,25002 +29,223,13341 +29,225,37075 +29,229,18378 +29,510,316030 +30,001,9317 +30,003,13214 +30,005,6609 +30,007,5692 +30,009,10340 +30,013,82049 +30,015,5837 +30,017,11980 +30,021,9431 +30,023,9176 +30,027,11429 +30,029,94696 +30,031,97958 +30,035,13695 +30,041,16529 +30,043,11601 +30,047,29311 +30,049,65989 +30,053,19268 +30,057,7810 +30,063,113101 +30,067,15843 +30,073,6166 +30,077,6928 +30,081,41130 +30,083,11392 +30,085,11230 +30,087,9348 +30,089,11375 +30,093,34560 +30,095,9342 +30,099,6067 +30,101,5114 +30,105,7576 +30,111,155344 +31,001,31536 +31,003,6421 +31,011,5353 +31,013,11279 +31,019,48402 +31,021,6594 +31,023,8205 +31,025,25463 +31,027,8657 +31,031,5781 +31,033,10090 +31,035,6313 +31,037,10499 +31,039,9055 +31,041,10784 +31,043,20697 +31,045,9082 +31,047,23924 +22,065,11803 +22,067,26739 +22,069,39258 +22,071,382922 +22,073,156398 +22,075,23584 +22,077,22366 +22,079,132373 +22,081,8757 +22,083,20692 +22,085,24144 +22,087,44091 +22,089,52708 +22,091,10714 +22,093,21581 +22,095,43888 +22,097,83699 +22,099,53385 +22,101,53053 +22,103,246269 +22,105,127115 +22,109,113099 +22,111,22460 +22,113,59524 +22,115,52101 +22,117,46367 +22,119,40335 +22,121,25017 +22,123,11370 +22,125,15384 +22,127,14695 +23,001,107376 +23,003,69405 +23,005,288204 +23,007,30270 +23,009,54483 +23,011,120953 +23,013,39717 +23,015,34165 +23,017,57299 +23,019,152978 +23,021,17044 +23,023,35134 +23,025,51363 +23,027,39071 +23,029,31925 +23,031,200536 +24,001,73060 +24,003,559737 +24,005,825666 +24,009,90527 +24,011,32653 +24,013,167535 +24,015,102175 +24,017,154357 +24,019,32451 +24,021,243465 +24,023,29677 +24,025,249776 +24,027,308447 +24,029,19819 +24,031,1026371 +24,033,897693 +24,035,48712 +24,037,110675 +24,039,25899 +24,041,37668 +24,043,149571 +24,045,101527 +24,047,51441 +24,510,621000 +25,001,214703 +25,003,128563 +25,005,554868 +25,007,17137 +25,009,769362 +25,011,70916 +25,013,468072 +25,015,161035 +25,017,1567610 +36,115,62465 +36,117,91874 +36,119,969229 +36,121,41239 +36,123,25106 +37,001,156372 +37,003,37211 +37,005,10868 +37,007,25883 +37,009,26992 +37,011,17633 +37,013,47513 +37,015,20324 +37,017,34454 +37,019,119167 +37,021,250112 +37,023,89082 +37,025,192296 +37,027,81623 +37,029,10228 +37,031,68537 +37,033,23094 +37,035,155461 +37,037,68778 +37,039,27226 +37,041,14556 +37,043,10730 +37,045,97113 +37,047,57015 +37,049,104190 +37,051,325841 +37,053,24864 +37,055,35187 +37,057,164058 +37,059,41568 +37,061,59121 +37,063,294618 +37,065,54669 +37,067,364691 +37,069,62989 +37,071,211753 +37,073,11615 +37,075,8651 +37,077,58341 +37,079,21241 +37,081,511815 +37,083,52849 +37,085,126620 +37,087,59577 +37,089,110905 +37,091,24285 +37,093,51853 +37,095,5629 +37,097,167493 +37,099,41227 +37,101,182155 +37,103,10074 +37,105,59540 +37,107,58343 +37,109,79783 +37,111,45013 +37,113,33991 +37,115,21130 +37,117,23510 +37,119,1011774 +37,121,15263 +37,123,27475 +37,125,93070 +37,127,94385 +37,129,216430 +37,131,20628 +37,133,185755 +37,135,139807 +37,137,12892 +37,139,39909 +37,141,56358 +37,143,13470 +37,145,39196 +37,147,175150 +37,149,20324 +37,151,142588 +37,153,45710 +37,155,134576 +37,157,91898 +37,159,138694 +37,161,66701 +37,163,63713 +37,165,35711 +37,167,60610 +37,169,46453 +37,171,72767 +37,173,14234 +37,175,33062 +37,179,217614 +37,181,44508 +37,183,998576 +37,185,20324 +37,187,12503 +37,189,52745 +37,191,124447 +37,193,68888 +37,195,81617 +37,197,37819 +37,199,17599 +38,003,11033 +38,005,6802 +38,009,6650 +38,015,90560 +38,017,166852 +38,021,5160 +38,035,69793 +38,049,5912 +38,053,10718 +38,055,9576 +38,057,8671 +38,059,29633 +38,061,9675 +38,067,7136 +38,071,11578 +38,073,5457 +38,077,16329 +38,079,14607 +38,089,29837 +38,093,21108 +38,097,8075 +38,099,10995 +38,101,68954 +38,105,31643 +39,001,28111 +39,003,104664 +39,005,53343 +39,007,99175 +39,009,65103 +39,011,45871 +39,013,69228 +39,015,44059 +39,017,373638 +39,019,28108 +39,021,39175 +39,023,136175 +39,025,201092 +39,027,41854 +39,029,105230 +39,031,36665 +39,033,42485 +39,035,1258710 +39,037,52185 +39,039,38488 +39,041,188996 +39,043,75808 +39,045,150163 +39,047,28719 +39,049,1232118 +39,051,42466 +39,053,30376 +39,055,94020 +39,057,164325 +39,059,39478 +39,061,805965 +39,063,75672 +39,065,31652 +39,067,15521 +39,069,27890 +39,071,43109 +39,073,28690 +39,075,43702 +39,077,58704 +39,079,32717 +39,081,67607 +39,083,60878 +39,085,229266 +39,087,61503 +39,089,169762 +39,091,45388 +39,093,304091 +39,095,434800 +39,097,43537 +39,099,233015 +39,101,65620 +39,103,175543 +39,105,23345 +39,107,40886 +39,109,103864 +39,111,14442 +39,113,532761 +39,115,14857 +39,117,35032 +39,119,85991 +39,121,14429 +39,123,40981 +39,125,19057 +39,127,35947 +39,129,56804 +39,131,28298 +39,133,161796 +39,135,41561 +39,137,34116 +39,139,121888 +39,141,77193 +39,143,59870 +39,145,77366 +39,147,55711 +39,149,48949 +39,151,374762 +39,153,541372 +39,155,204908 +39,157,92579 +39,159,53955 +39,161,28501 +39,163,13128 +39,165,222184 +39,167,61154 +39,169,115747 +39,171,37270 +39,173,129418 +39,175,22359 +40,001,22161 +40,003,5784 +40,005,13847 +40,007,5479 +40,009,23290 +40,011,9777 +40,013,44529 +40,015,29510 +40,017,129571 +40,019,48530 +40,021,48267 +40,023,15051 +40,027,271818 +40,029,5755 +40,031,124583 +40,033,6062 +40,035,14683 +40,037,70931 +40,039,29248 +40,041,41433 +40,047,62481 +40,049,27570 +40,051,53955 +40,055,6081 +40,061,12835 +40,063,13727 +40,065,25864 +40,067,6280 +40,069,11027 +40,071,45398 +40,073,15392 +40,075,9239 +40,077,10643 +40,079,49885 +40,081,34640 +40,083,45171 +40,085,9768 +40,087,37222 +40,089,33071 +40,091,20161 +40,093,7721 +40,095,16079 +40,097,40923 +40,099,13792 +40,101,69939 +40,103,11470 +40,105,10510 +40,107,12212 +40,109,764698 +40,111,39322 +40,113,47923 +40,115,32022 +40,117,16444 +40,119,79953 +40,121,44643 +40,123,38213 +40,125,71551 +40,127,11149 +40,131,89970 +40,133,25403 +40,135,41344 +40,137,44631 +40,139,21499 +40,141,7611 +40,143,629823 +40,145,76190 +40,147,51892 +40,149,11626 +40,151,9125 +40,153,21111 +41,001,16030 +41,003,87455 +41,005,394967 +41,007,37660 +41,009,49645 +41,011,62944 +41,013,21334 +41,015,22364 +41,017,170813 +41,019,107375 +41,023,7227 +41,025,7214 +41,027,22842 +41,029,210916 +41,031,22305 +41,033,84063 +41,035,65946 +41,037,7799 +41,039,360273 +41,041,46685 +41,043,119862 +41,045,30474 +41,047,326527 +41,049,11207 +41,051,778193 +41,053,78470 +41,057,25552 +41,059,76582 +41,061,25758 +41,063,6836 +41,065,25657 +41,067,564088 +41,071,102217 +42,001,101759 +42,003,1230360 +42,005,67512 +42,007,169205 +42,009,48852 +42,011,414097 +42,013,125917 +42,015,61808 +42,017,626220 +42,019,185974 +42,021,137762 +42,025,64330 +47,035,57895 +47,037,667885 +47,039,11703 +47,041,19159 +47,043,50926 +47,045,37970 +47,047,39071 +47,049,17936 +47,051,41348 +47,053,49511 +47,055,29034 +47,057,22813 +47,059,68502 +47,061,13494 +47,063,63203 +47,065,351305 +47,067,6609 +47,069,25975 +47,071,25839 +47,073,56567 +47,075,18129 +47,077,27952 +47,079,32291 +47,081,24251 +47,083,8234 +47,085,18216 +47,087,11526 +47,089,52851 +47,091,17923 +47,093,448164 +47,095,7643 +47,097,27261 +47,099,42406 +47,101,11907 +47,103,33582 +47,105,50637 +47,107,52606 +47,109,26057 +47,111,22924 +47,113,98128 +47,115,28363 +47,117,31335 +47,119,85767 +47,121,11804 +47,123,45482 +47,125,189709 +47,127,6314 +47,129,21688 +47,131,30900 +47,133,22090 +47,135,7891 +47,137,5096 +47,139,16697 +47,141,74652 +47,143,32461 +47,145,52983 +47,147,67905 +47,149,290289 +47,151,22029 +47,153,14710 +47,155,94537 +47,157,936990 +47,159,19176 +47,161,13257 +47,163,156644 +47,165,172786 +47,167,61558 +47,169,7970 +47,171,17945 +47,173,19081 +47,175,5641 +47,177,40099 +47,179,126044 +47,181,16842 +47,183,34024 +47,185,26373 +47,187,205645 +47,189,125616 +48,001,57772 +48,003,17215 +48,005,87657 +48,007,24729 +48,009,8750 +42,027,159178 +42,029,512028 +42,031,38939 +42,033,81170 +42,035,39536 +42,037,66772 +42,039,87027 +42,041,243838 +42,043,271962 +42,045,562316 +42,047,31111 +42,049,279133 +42,051,134229 +42,053,7493 +42,055,152707 +42,057,14653 +42,059,37669 +42,061,45844 +42,063,87491 +42,065,44575 +42,067,24811 +42,069,213006 +42,071,533110 +42,073,88528 +42,075,136950 +42,077,358792 +42,079,318917 +42,081,116313 +42,083,42609 +42,085,114598 +42,087,46585 +42,089,167126 +42,091,815876 +42,093,18404 +42,095,300520 +42,097,93590 +42,099,45647 +42,101,1559938 +42,103,56210 +42,105,17239 +42,107,145503 +42,109,40246 +42,111,76201 +42,113,6302 +42,115,41832 +42,117,42031 +42,119,45178 +42,121,53460 +42,123,40649 +42,125,208269 +42,127,51307 +42,129,359377 +42,131,27975 +42,133,440604 +44,001,49228 +44,003,164886 +44,005,82714 +44,007,631344 +44,009,126319 +45,001,24951 +45,003,165146 +45,005,9589 +45,007,192709 +45,009,15057 +45,011,21917 +45,013,175316 +45,015,199081 +45,017,14886 +45,019,380673 +45,021,56274 +45,023,32435 +45,025,46083 +45,027,34056 +45,029,37884 +45,031,67689 +45,033,31273 +45,035,148517 +45,037,26388 +45,039,23025 +45,041,138575 +45,043,60804 +45,045,482191 +45,047,69881 +45,049,20296 +45,051,300418 +45,053,27186 +45,055,63090 +45,057,83704 +45,059,66442 +45,061,18189 +45,063,277702 +45,065,9806 +45,067,31975 +45,069,27702 +45,071,37750 +45,073,75375 +45,075,89731 +45,077,120722 +45,079,401743 +45,081,20113 +45,083,294229 +45,085,107682 +45,087,27928 +45,089,32816 +45,091,245606 +46,005,18155 +46,009,7001 +46,011,33435 +46,013,38430 +46,015,5312 +46,019,10268 +46,023,9277 +46,027,14029 +46,029,27886 +46,033,8447 +46,035,19824 +46,037,5588 +46,041,5652 +46,047,6874 +46,051,7195 +46,057,5995 +46,065,17518 +46,067,7264 +46,077,5070 +46,079,12331 +46,081,24859 +46,083,51396 +46,087,5616 +46,093,26840 +46,099,182014 +46,101,6445 +46,103,107298 +46,109,10294 +46,115,6539 +46,121,10019 +46,123,5475 +46,125,8289 +46,127,14842 +46,129,5538 +46,135,22649 +47,001,75545 +47,003,46331 +47,005,16173 +47,007,14073 +47,009,126192 +47,011,102860 +47,013,40008 +47,015,13855 +47,017,28417 +47,019,56707 +47,021,39575 +47,023,17355 +47,025,31701 +47,027,7769 +47,029,35256 +47,031,53808 +47,033,14558 +35,001,674777 +35,005,65610 +35,006,27373 +35,007,12716 +35,009,50544 +35,013,213825 +35,015,56369 +35,017,28879 +35,025,68930 +35,027,19726 +35,028,17895 +35,029,24627 +35,031,74346 +35,035,65333 +35,037,8555 +35,039,39924 +35,041,19618 +35,043,138117 +35,045,122537 +35,047,28350 +35,049,147320 +35,051,11442 +35,053,17324 +35,055,32961 +35,057,15599 +35,061,75993 +36,001,307891 +36,003,47700 +36,005,1436785 +36,007,197381 +36,009,78506 +36,011,78783 +36,013,131748 +36,015,87742 +36,017,49286 +36,019,81505 +36,021,61860 +36,023,48713 +36,025,46480 +36,027,295905 +36,029,922129 +36,031,38598 +36,033,51007 +36,035,54297 +36,037,59053 +36,039,48069 +36,043,63558 +36,045,117966 +36,047,2606852 +36,049,27107 +36,051,64622 +36,053,72089 +36,055,749236 +36,057,49667 +36,059,1356801 +36,061,1634989 +36,063,213374 +36,065,232858 +36,067,468050 +36,069,109450 +36,071,376242 +36,073,41938 +36,075,120513 +36,077,60979 +36,079,99408 +36,081,2310011 +36,083,159959 +36,085,473324 +36,087,322642 +36,089,111529 +36,091,224929 +36,093,154845 +36,095,31667 +36,097,18336 +36,099,35036 +36,101,98151 +36,103,1498130 +36,105,75818 +36,107,49649 +36,109,104268 +36,111,180505 +36,113,64911 +48,227,36423 +48,231,89068 +48,233,21782 +48,237,8866 +48,239,14678 +48,241,35640 +48,245,252993 +48,247,5218 +48,249,41486 +48,251,157544 +48,253,19944 +48,255,14984 +48,257,111830 +48,259,39010 +48,265,50505 +48,273,31877 +48,277,49626 +48,279,13561 +48,281,20357 +48,283,7319 +48,285,19654 +48,287,16754 +48,289,16923 +48,291,78598 +48,293,23469 +48,297,11976 +48,299,19624 +48,303,294682 +48,305,5723 +48,307,8242 +48,309,243394 +48,313,13843 +48,315,10191 +48,317,5451 +48,321,36719 +48,323,56830 +48,325,47920 +48,329,155817 +48,331,24372 +48,335,8995 +48,337,19384 +48,339,518849 +48,341,22186 +48,343,12653 +48,347,65556 +48,349,48177 +48,351,14138 +48,353,15017 +48,355,355667 +48,357,10577 +48,361,83751 +48,363,27922 +48,365,23771 +48,367,123601 +48,369,9921 +48,371,15826 +48,373,46583 +48,375,121883 +48,377,7144 +48,379,11087 +48,381,128603 +48,387,12455 +48,389,14438 +48,391,7315 +48,395,16537 +48,397,88010 +48,399,10411 +48,401,53197 +48,403,10367 +48,405,8556 +48,407,27172 +48,409,66706 +48,411,5881 +48,415,17314 +48,419,25705 +48,423,219745 +48,425,8673 +48,427,63008 +48,429,9787 +48,437,7639 +48,439,1947529 +48,441,135234 +48,445,12724 +48,449,32592 +48,451,116264 +48,453,1148176 +48,455,14360 +48,457,21371 +48,459,40295 +48,463,27055 +48,465,48862 +48,467,53070 +48,469,90989 +48,471,69926 +48,473,47049 +48,475,11396 +48,477,34544 +48,479,266006 +48,481,41377 +48,483,5642 +48,485,132148 +48,487,13061 +48,489,21944 +48,491,490619 +48,493,46444 +48,495,7723 +48,497,62089 +48,499,43198 +48,501,8316 +48,503,18275 +48,505,14335 +48,507,12107 +49,001,6437 +49,003,51528 +49,005,118824 +49,007,20733 +49,011,329292 +49,013,20078 +49,015,10570 +49,017,5020 +49,019,9428 +49,021,47751 +49,023,10507 +49,025,7216 +49,027,12604 +49,029,10645 +49,035,1092518 +49,037,15540 +49,039,28551 +49,041,20913 +49,043,39009 +49,045,61986 +49,047,36308 +49,049,564177 +49,051,27895 +49,053,151959 +49,057,241328 +50,001,36926 +50,003,36503 +50,005,30859 +50,007,160510 +50,009,6173 +50,011,48625 +50,013,6945 +50,015,25136 +50,017,28897 +50,019,27076 +50,021,60133 +50,023,58963 +50,025,43609 +50,027,55894 +51,001,33060 +51,003,104287 +51,005,15919 +51,007,12793 +51,009,31999 +51,011,15314 +51,013,226092 +51,015,74330 +51,019,76933 +51,021,6612 +51,023,33192 +51,025,16573 +51,027,23158 +51,029,17030 +51,031,55061 +51,033,29640 +51,035,29733 +51,036,7086 +51,037,12232 +51,041,331839 +51,043,14307 +51,045,5195 +51,047,48952 +51,049,9769 +51,051,15304 +51,053,28155 +51,057,11130 +51,059,1132887 +51,061,68025 +51,063,15587 +51,065,26046 +51,067,56230 +51,069,82321 +51,071,16871 +51,073,37021 +51,075,21979 +51,077,15180 +51,079,19085 +51,081,11698 +51,083,35305 +51,085,102199 +51,087,321921 +51,089,52209 +51,093,36027 +51,095,71900 +51,097,7140 +51,099,25260 +51,101,16156 +51,103,11055 +51,105,24911 +51,107,362435 +51,109,34350 +51,111,12450 +51,113,13122 +51,115,8848 +51,117,31209 +51,119,10728 +51,121,97227 +51,125,14831 +51,127,20051 +51,131,12118 +51,133,12272 +51,135,15641 +51,137,34873 +51,139,23759 +51,141,18180 +51,143,62392 +51,145,28286 +51,147,23077 +51,149,37664 +51,153,443630 +51,155,34417 +51,157,7416 +51,159,8868 +51,161,93655 +51,163,22450 +51,165,78427 +51,167,27973 +51,169,22378 +51,171,42857 +51,173,31513 +51,175,18291 +51,177,129181 +51,179,139548 +51,181,6731 +51,183,11733 +51,185,43367 +51,187,38807 +51,191,54562 +51,193,17528 +51,195,40074 +51,197,29171 +51,199,66919 +51,510,151473 +51,520,17340 +51,530,6610 +51,540,45538 +51,550,233194 +51,570,17554 +51,580,5650 +51,590,42360 +55,087,181799 +55,089,87625 +55,091,7349 +55,093,40881 +55,095,43483 +55,097,70551 +55,099,13707 +55,101,194873 +55,103,17642 +55,105,160986 +55,107,14272 +55,109,86726 +55,111,63317 +55,113,16438 +55,115,41384 +55,117,115269 +55,119,20521 +55,121,29521 +55,123,30442 +55,125,21373 +55,127,103021 +55,129,15685 +55,131,133422 +55,133,395377 +55,135,51974 +55,137,24238 +55,139,169487 +55,141,73621 +56,001,37836 +56,003,11931 +56,005,48473 +56,007,15696 +56,009,14223 +56,011,7284 +56,013,40683 +56,015,13546 +56,019,8572 +56,021,96459 +56,023,18543 +56,025,80871 +56,029,29083 +56,031,8740 +56,033,29924 +56,035,10032 +56,037,44812 +56,039,22623 +56,041,20893 +56,043,8351 +56,045,7175 +72,001,18760 +72,003,40083 +72,005,56893 +72,007,27323 +72,009,24438 +72,011,28250 +72,013,91096 +72,015,18778 +72,017,24699 +72,019,29548 +72,021,192974 +72,023,50096 +72,025,136372 +72,027,33481 +72,029,47174 +72,031,165040 +72,033,26137 +72,035,46071 +72,037,12538 +72,039,17644 +72,041,41782 +72,043,40090 +72,045,20153 +72,047,35484 +72,051,38013 +72,053,33912 +72,054,12287 +72,055,17788 +72,057,43210 +72,059,20025 +72,061,92444 +51,595,5565 +51,600,23620 +51,610,13597 +51,620,8413 +51,630,27853 +51,640,6858 +51,650,136789 +51,660,51979 +51,670,22332 +51,678,7036 +51,680,78755 +51,683,41149 +51,685,15827 +51,690,13551 +51,700,181606 +51,710,245724 +51,730,31997 +51,735,12068 +51,740,96071 +51,750,17186 +51,760,216773 +51,770,99329 +51,775,25290 +51,790,24234 +51,800,87061 +51,810,449733 +51,820,21366 +51,830,14988 +51,840,27349 +53,001,19100 +53,003,22113 +53,005,187519 +53,007,74761 +53,009,72969 +53,011,450893 +53,015,102854 +53,017,40101 +53,019,7639 +53,021,87810 +53,025,92530 +53,027,71233 +53,029,80113 +53,031,30333 +53,033,2079550 +53,035,257488 +53,037,42785 +53,039,20930 +53,041,75724 +53,043,10326 +53,045,61060 +53,047,41299 +53,049,20743 +53,051,13001 +53,053,832896 +53,055,16056 +53,057,120475 +53,059,11316 +53,061,758649 +53,063,485859 +53,065,43744 +53,067,266311 +53,071,59809 +53,073,209729 +53,075,47494 +53,077,247681 +54,001,16892 +54,003,110173 +54,005,23645 +54,007,14463 +54,009,23473 +54,011,96623 +54,013,7482 +54,015,9033 +54,017,8363 +54,019,45192 +54,021,8497 +54,023,11770 +54,025,35580 +54,027,23455 +54,029,30024 +54,031,13942 +54,033,68775 +54,035,29199 +54,037,55531 +54,039,189636 +54,041,16422 +54,043,21482 +54,045,35166 +54,047,20273 +54,049,56716 +54,051,32296 +54,053,27060 +54,055,61476 +54,057,27606 +54,059,25549 +54,061,102827 +54,063,13496 +54,065,17514 +54,067,25743 +54,069,43257 +54,071,7291 +54,073,7612 +54,075,8620 +54,077,33793 +54,079,56743 +54,081,78051 +54,083,29287 +54,085,10044 +54,087,14513 +54,089,13325 +54,091,16949 +54,093,6922 +54,095,9000 +54,097,24632 +54,099,41237 +54,101,8820 +54,103,15997 +54,105,5826 +54,107,86262 +54,109,22537 +55,001,20294 +55,003,15936 +55,005,45548 +55,007,14987 +55,009,256621 +55,011,13256 +55,013,15259 +55,015,49653 +55,017,63355 +55,019,34486 +55,021,56650 +55,023,16415 +55,025,516818 +55,027,88404 +55,029,27669 +55,031,43705 +55,033,44348 +55,035,101907 +55,039,101968 +55,041,9108 +55,043,51723 +55,045,37050 +55,047,18881 +55,049,23751 +55,051,5850 +55,053,20566 +55,055,84538 +55,057,26399 +55,059,167896 +55,061,20459 +55,063,117538 +55,065,16793 +55,067,19414 +55,069,28171 +55,071,80178 +55,073,135367 +55,075,41090 +55,077,15082 +55,079,955306 +55,081,45365 +55,083,37475 +55,085,35604 +48,013,47710 +48,015,29107 +48,017,7131 +48,019,21015 +48,021,78286 +48,025,32706 +48,027,330859 +48,029,1858699 +48,031,10918 +48,035,17953 +48,037,93483 +48,039,338419 +48,041,209896 +48,043,9188 +48,047,7217 +48,049,37935 +48,051,17417 +48,053,44584 +48,055,39848 +48,057,21805 +48,059,13596 +48,061,418785 +48,063,12631 +48,065,6027 +48,067,30346 +48,069,7875 +48,071,38072 +48,073,51257 +48,075,7059 +48,077,10367 +48,083,8476 +48,085,886633 +48,089,20792 +48,091,124234 +48,093,13506 +48,097,38878 +48,099,75710 +48,107,5987 +48,111,7052 +48,113,2513054 +48,115,13317 +48,117,19039 +48,119,5226 +48,121,754650 +48,123,20660 +48,127,10842 +48,131,11510 +48,133,18252 +48,135,153177 +48,139,160225 +48,141,833592 +48,143,40641 +48,145,17265 +48,147,33757 +48,149,24909 +48,153,6088 +48,157,683756 +48,159,10571 +48,161,19585 +48,163,18542 +48,165,19485 +48,167,314485 +48,169,6614 +48,171,25732 +48,175,7463 +48,177,20370 +48,179,23028 +48,181,124231 +48,183,123283 +48,185,27140 +48,187,147313 +48,189,35007 +48,193,8232 +48,195,5552 +48,199,55624 +48,201,4434257 +48,203,66431 +48,205,5966 +48,207,5812 +48,209,185686 +48,213,79213 +48,215,828334 +48,217,34901 +48,219,23377 +48,221,54217 +48,223,35844 +48,225,22802 +72,063,46990 +72,065,41327 +72,067,16678 +72,069,55621 +72,071,43919 +72,073,15605 +72,075,48658 +72,077,39942 +72,079,24323 +72,081,28052 +72,083,9093 +72,085,38466 +72,087,27857 +72,089,19237 +72,091,41468 +72,093,6274 +72,095,11506 +72,097,81594 +72,099,38289 +72,101,32087 +72,103,26722 +72,105,29467 +72,107,22258 +72,109,18135 +72,111,22231 +72,113,152594 +72,115,24904 +72,117,14700 +72,119,52479 +72,121,24013 +72,123,29722 +72,125,33546 +72,127,363744 +72,129,39283 +72,131,39755 +72,133,22732 +72,135,74467 +72,137,83645 +72,139,70737 +72,141,30869 +72,143,39018 +72,145,55866 +72,147,9046 +72,149,24186 +72,151,35670 +72,153,38519 +06,079,278680 +06,081,754748 +06,083,439395 +06,085,1885056 +06,087,270931 +06,089,179228 +06,093,43668 +06,095,429596 +06,097,497776 +06,099,530561 +06,101,95406 +06,103,63015 +06,105,13180 +06,107,455769 +06,109,53864 +06,111,843110 +06,113,209671 +06,115,73897 +08,001,479977 +08,003,16353 +08,005,617668 +08,007,12355 +08,011,5816 +08,013,313961 +08,014,62449 +08,015,18507 +08,019,9238 +08,021,8213 +08,025,5537 +08,029,30221 +08,031,663303 +08,035,314238 +08,037,52894 +08,039,24225 +08,041,665171 +08,043,46835 +08,045,57495 +08,047,5708 +08,049,14490 +08,051,15889 +08,055,6521 +08,059,558810 +08,063,8174 +08,065,7401 +08,067,53994 +08,069,325228 +08,071,14322 +08,073,5515 +08,075,21862 +08,077,148166 +08,081,13034 +08,083,26006 +08,085,40866 +08,087,28288 +08,089,18440 +08,093,16440 +08,097,17543 +08,099,12121 +08,101,162158 +08,103,6658 +08,105,11623 +08,107,23980 +08,109,6255 +08,113,7767 +08,117,29269 +08,119,23472 +08,123,278065 +08,125,10150 +09,001,941618 +09,003,895699 +09,005,185141 +09,007,164438 +09,009,860874 +09,011,272033 +09,013,151689 +09,015,117078 +10,001,171474 +10,003,551997 +10,005,211224 +11,001,659009 +12,001,256581 +12,003,27312 +12,005,178361 +12,007,26919 +12,009,560683 +12,011,1863780 +12,013,14550 +12,015,169642 +12,017,140453 +12,019,200346 +12,021,348236 +12,023,68198 +12,027,35134 +12,029,16084 +12,031,900890 +12,033,309574 +12,035,102917 +12,037,11705 +12,039,46153 +12,041,17033 +12,043,13420 +12,045,15851 +12,047,14362 +12,049,27302 +12,051,38376 +12,053,176797 +12,055,98862 +12,057,1323059 +12,059,19569 +12,061,145342 +12,063,48721 +12,065,14082 +12,067,8742 +12,069,317586 +12,071,680970 +12,073,284788 +12,075,39707 +12,077,8285 +12,079,18560 +12,081,353411 +12,083,340341 +12,085,153592 +12,086,2664418 +12,087,77150 +12,089,77187 +12,091,195798 +12,093,39420 +12,095,1256055 +12,097,311962 +12,099,1398757 +12,101,488310 +12,103,939548 +12,105,637691 +12,107,72304 +12,109,218362 +12,111,293136 +12,113,163903 +12,115,398011 +12,117,442905 +12,119,113589 +12,121,43653 +12,123,22582 +12,125,15159 +12,127,510806 +12,129,31314 +12,131,61528 +12,133,24627 +13,001,18410 +13,003,8268 +13,005,11251 +13,009,45808 +13,011,18336 +13,013,73340 +13,015,101942 +13,017,17405 +13,019,18986 +13,021,154194 +13,023,12835 +13,025,18403 +13,027,15645 +13,029,34104 +13,031,73141 +13,033,22838 +13,035,23479 +13,037,6443 +13,039,52092 +01,001,55049 +01,003,199510 +01,005,26614 +01,007,22572 +01,009,57704 +01,011,10552 +01,013,20280 +01,015,115883 +01,017,34018 +01,019,25897 +01,021,43817 +01,023,13287 +01,025,24847 +01,027,13483 +01,029,14991 +01,031,50991 +01,033,54377 +01,035,12697 +01,037,10864 +01,039,37729 +01,041,13896 +01,043,81316 +01,045,49607 +01,047,41426 +01,049,70937 +01,051,80957 +01,053,37875 +01,055,103363 +01,057,16783 +01,059,31573 +01,061,26765 +01,063,8587 +01,065,15159 +01,067,17187 +01,069,103891 +01,071,52608 +01,073,659096 +01,075,14066 +01,077,92641 +01,079,33433 +01,081,153947 +01,083,90257 +01,085,10565 +01,087,19684 +01,089,349973 +01,091,20066 +01,093,30239 +01,095,94534 +01,097,414291 +01,099,21975 +01,101,227392 +01,103,119555 +01,105,9856 +01,107,20042 +01,109,33277 +01,111,22615 +01,113,58636 +01,115,86576 +01,117,205951 +01,119,13285 +01,121,81057 +01,123,40958 +01,125,202471 +01,127,65593 +01,129,16909 +01,131,11119 +01,133,24013 +02,016,5714 +02,020,299321 +02,050,17885 +02,090,100150 +02,110,32524 +02,122,57637 +02,130,13715 +02,150,13918 +02,170,98679 +02,180,9879 +02,185,9681 +02,188,7723 +02,198,6374 +02,220,8921 +02,240,6970 +02,261,9522 +02,290,5600 +04,001,72346 +04,003,128177 +04,005,138064 +04,007,53179 +04,009,37529 +04,011,9224 +04,012,20304 +04,013,4088549 +04,015,203629 +04,017,108209 +04,019,1003338 +04,021,397604 +04,023,46547 +04,025,218586 +04,027,203292 +05,001,18569 +05,003,20989 +05,005,40992 +05,007,245231 +05,009,37301 +05,011,11096 +05,013,5210 +05,015,27690 +05,017,11189 +05,019,22684 +05,021,15202 +05,023,25587 +05,025,8421 +05,027,24168 +05,029,21060 +05,031,102884 +05,033,61927 +05,035,49511 +05,037,17329 +05,039,7738 +05,041,12234 +05,043,18688 +05,045,120417 +05,047,17799 +05,049,12186 +05,051,97119 +05,053,18046 +05,055,43745 +05,057,22208 +05,059,33440 +05,061,13487 +05,063,37030 +05,065,13461 +05,067,17495 +05,069,72385 +05,071,26025 +05,073,7127 +05,075,16915 +05,077,9781 +05,079,13935 +05,081,12616 +05,083,21935 +05,085,71279 +05,087,15761 +05,089,16404 +05,091,43666 +05,093,44199 +05,095,7542 +05,097,9100 +05,099,8668 +05,101,7988 +05,103,24728 +05,105,10246 +05,107,19929 +05,109,11017 +05,111,24131 +05,113,20290 +05,115,63107 +05,117,8334 +05,119,391806 +05,121,17584 +05,123,27023 +05,125,115577 +05,127,10661 +05,129,7938 +05,131,127351 +05,133,17193 +05,135,17027 +05,137,12503 +05,139,40334 +05,141,16892 +05,143,219930 +05,145,78823 +05,147,6873 +05,149,21716 +06,001,1605217 +06,005,36963 +06,007,223877 +06,009,44787 +06,011,21361 +06,013,1107925 +06,015,27628 +06,017,183000 +06,019,963160 +06,021,27976 +06,023,135182 +06,025,178807 +06,027,18326 +06,029,871337 +06,031,150261 +06,033,64076 +06,035,31945 +06,037,10057155 +06,039,153366 +06,041,259358 +06,043,17645 +06,045,87409 +06,047,265001 +06,049,9033 +06,051,14051 +06,053,430201 +06,055,140823 +06,057,98639 +06,059,3132211 +06,061,370571 +06,063,18754 +06,065,2323892 +06,067,1479300 +06,069,58051 +06,071,2106754 +06,073,3253356 +06,075,850282 +06,077,714860 +13,221,14743 +13,223,149830 +13,225,26907 +13,227,29992 +13,229,19030 +13,231,17843 +13,233,41263 +13,235,11460 +13,237,21259 +13,241,16312 +13,243,7224 +13,245,201418 +13,247,87569 +13,249,5089 +13,251,14114 +13,253,8696 +13,255,64006 +13,257,25584 +13,259,5791 +13,261,31070 +13,263,6373 +13,267,25260 +13,269,8354 +13,271,16405 +13,273,9132 +13,275,44977 +13,277,40691 +13,279,27160 +13,281,10976 +13,283,6711 +13,285,69314 +13,287,8151 +13,289,8363 +13,291,22033 +13,293,26394 +13,295,68143 +13,297,87436 +13,299,35671 +13,301,5504 +13,303,20680 +13,305,30006 +13,309,7932 +13,311,28140 +13,313,103653 +13,315,8884 +13,317,9924 +13,319,9312 +13,321,20988 +15,001,193680 +15,003,986999 +15,007,70447 +15,009,162456 +16,001,425798 +16,005,83815 +16,007,5928 +16,009,9068 +16,011,45261 +16,013,21427 +16,015,6891 +16,017,41389 +16,019,108989 +16,021,11141 +16,027,202782 +16,029,6813 +16,031,23441 +16,035,8528 +16,039,26103 +16,041,13013 +16,043,12896 +16,045,16853 +16,047,15157 +16,049,16251 +16,051,27096 +16,053,22694 +16,055,147716 +16,057,38593 +16,059,7743 +16,063,5292 +16,065,38114 +16,067,20331 +16,069,39995 +16,073,11356 +16,075,22773 +16,077,7696 +16,079,12551 +16,081,10437 +16,083,80955 +16,085,9897 +16,087,10035 +17,001,66949 +17,003,7051 +17,005,17137 +17,007,53656 +17,009,6836 +17,011,33822 +17,015,14793 +17,017,13068 +17,019,206420 +17,021,33888 +17,023,16089 +17,025,13466 +17,027,37858 +17,029,52802 +17,031,5227575 +17,033,19441 +17,035,10890 +17,037,104458 +17,039,16322 +17,041,19770 +17,043,930514 +17,045,17828 +17,047,6612 +17,049,34356 +17,051,22025 +17,053,13758 +17,055,39503 +17,057,36047 +17,059,5325 +17,061,13390 +17,063,50338 +17,065,8251 +17,067,18633 +17,071,6966 +17,073,49681 +17,075,28814 +17,077,59188 +17,079,9592 +17,081,38523 +17,083,22441 +17,085,22186 +17,087,12866 +17,089,526615 +17,091,111493 +17,093,121452 +17,095,51752 +17,097,702890 +17,099,111935 +17,101,16582 +17,103,34718 +17,105,37278 +17,107,29820 +17,109,31727 +17,111,307083 +17,113,173254 +17,115,108404 +17,117,46482 +17,119,266759 +17,121,38503 +17,123,12060 +17,125,13931 +17,127,14883 +17,129,12576 +17,131,15971 +17,133,33703 +17,135,29301 +17,137,34801 +17,139,14915 +17,141,52034 +17,143,186818 +17,145,21595 +17,147,16469 +17,149,16054 +17,153,5792 +17,155,5746 +17,157,32934 +17,159,16072 +17,161,146536 +17,163,265569 +17,165,24659 +17,167,198639 +17,169,7205 +17,171,5169 +17,173,22011 +17,175,5840 +17,177,46283 +17,179,135400 +17,181,17458 +17,183,79613 +17,185,11587 +17,187,17611 +17,189,14369 +17,191,16517 +17,193,14410 +17,195,57155 +17,197,685378 +17,199,67336 +17,201,288896 +17,203,39123 +18,001,34813 +18,003,365565 +18,005,80203 +18,007,8709 +18,009,12364 +18,011,61884 +18,013,14965 +18,015,20007 +18,017,38324 +18,019,113993 +18,021,26568 +18,023,32692 +18,025,10582 +18,027,32583 +18,029,49552 +18,031,26340 +18,033,42489 +18,035,116463 +18,037,42345 +18,039,201640 +18,041,23608 +18,043,76290 +18,045,16741 +18,047,22887 +18,049,20412 +18,051,33684 +18,053,68269 +18,055,32633 +18,057,303042 +18,059,71955 +18,061,39370 +18,063,155817 +18,065,48953 +18,067,82728 +18,069,36696 +18,071,43637 +18,073,33461 +18,075,21196 +18,077,32482 +18,079,28023 +18,081,147567 +18,083,37956 +18,085,78461 +18,087,38395 +18,089,489698 +18,091,110993 +18,093,45696 +18,095,129862 +18,097,932142 +18,099,46833 +18,101,10218 +18,103,36093 +18,105,143292 +18,107,38108 +18,109,69504 +18,111,14022 +18,113,47587 +18,115,6003 +18,117,19579 +18,119,21038 +18,121,17033 +18,123,19301 +18,125,12554 +18,127,167016 +18,129,25527 +18,131,12910 +18,133,37626 +18,135,25403 +18,137,28633 +18,139,16873 +18,141,267696 +18,143,23734 +18,145,44404 +18,147,20777 +18,149,23069 +18,151,34279 +18,153,21026 +18,155,10484 +18,157,183397 +18,159,15447 +18,161,7251 +18,163,181692 +18,165,15752 +18,167,108099 +18,169,32177 +18,171,8309 +18,173,61427 +18,175,27792 +18,177,67423 +18,179,27836 +18,181,24265 +18,183,33354 +19,001,7330 +19,005,14001 +19,007,12602 +19,009,5793 +19,011,25720 +19,013,132821 +19,015,26411 +19,017,24663 +19,019,21031 +19,021,20445 +19,023,14933 +19,025,9876 +19,027,20555 +19,029,13433 +19,031,18389 +19,033,43303 +19,035,11752 +19,037,12164 +19,039,9273 +19,041,16478 +19,043,17735 +19,045,47972 +19,047,17147 +19,049,78074 +19,051,8768 +19,053,8210 +19,055,17445 +19,057,40114 +19,059,17046 +19,061,96359 +19,063,9820 +19,065,20391 +19,067,16004 +19,069,10393 +19,071,7019 +19,073,9083 +19,075,12373 +19,077,10691 +19,079,15227 +19,081,11006 +19,083,17324 +19,085,14335 +19,087,19941 +19,089,9430 +19,091,9607 +19,093,7041 +19,095,16326 +19,097,19529 +19,099,36715 +19,101,17662 +19,103,142006 +19,105,20481 +19,107,10234 +19,109,15226 +19,111,35172 +19,113,218076 +19,115,11251 +19,117,8700 +19,119,11730 +19,121,15661 +19,123,22324 +19,125,33197 +21,137,24424 +21,139,9353 +21,141,26757 +21,143,8325 +21,145,65292 +21,147,17850 +21,149,9492 +21,151,87324 +21,153,12887 +21,155,19497 +21,157,31213 +21,159,12478 +21,161,17229 +21,163,28751 +21,165,6345 +21,167,21411 +21,169,9983 +21,171,10692 +21,173,27391 +21,175,13379 +21,177,31216 +21,179,44875 +21,181,7062 +21,183,24152 +21,185,63876 +21,187,10673 +21,191,14509 +21,193,27818 +21,195,62791 +21,197,12387 +21,199,63772 +21,203,16893 +21,205,24302 +21,207,17684 +21,209,51348 +21,211,44967 +21,213,17856 +21,215,17798 +21,217,25315 +21,219,12465 +21,221,14267 +21,223,8751 +21,225,15065 +21,227,121066 +21,229,12017 +21,231,20557 +21,233,13331 +21,235,35842 +21,237,7221 +21,239,25591 +22,001,62372 +22,003,25619 +22,005,117009 +22,007,22973 +22,009,41252 +22,011,36435 +22,013,13924 +22,015,124720 +22,017,253125 +22,019,197233 +22,021,9997 +22,023,6739 +22,025,10145 +22,027,16452 +22,029,20288 +22,031,27047 +22,033,445337 +22,035,7419 +22,037,19756 +22,039,33765 +22,041,20464 +22,043,22372 +22,045,73799 +22,047,33159 +22,049,15999 +22,051,435204 +22,053,31399 +22,055,234963 +22,057,97688 +22,059,14927 +22,061,47480 +22,063,135925 +19,127,40735 +19,129,14841 +19,131,10757 +19,133,9013 +19,135,7964 +19,137,10380 +19,139,42949 +19,141,14055 +19,143,6154 +19,145,15552 +19,147,9155 +19,149,24972 +19,151,7061 +19,153,459159 +19,155,93198 +19,157,18622 +19,159,5054 +19,161,10034 +19,163,171116 +19,165,11944 +19,167,34621 +19,169,94834 +19,171,17423 +19,173,6209 +19,175,12539 +19,177,7380 +19,179,35242 +19,181,48170 +19,183,22115 +19,185,6403 +19,187,37050 +19,189,10580 +19,191,20789 +19,193,102426 +19,195,7562 +19,197,12891 +20,001,12951 +20,003,7858 +20,005,16557 +20,009,27214 +20,011,14751 +20,013,9810 +20,015,66264 +20,021,20737 +20,027,8346 +20,029,9302 +20,031,8433 +20,035,35977 +20,037,39281 +20,041,19384 +20,043,7793 +20,045,116352 +20,051,29032 +20,053,6375 +20,055,36983 +20,057,34492 +20,059,25663 +20,061,36818 +20,067,7748 +20,069,6037 +20,073,6304 +20,077,5798 +20,079,34814 +20,085,13365 +20,087,18880 +20,091,572428 +20,095,7697 +20,099,20833 +20,103,78785 +20,107,9524 +20,111,33401 +20,113,29164 +20,115,12213 +20,117,9963 +20,121,32787 +20,123,6299 +20,125,33765 +20,127,5694 +20,131,10177 +20,133,16358 +20,137,5558 +20,139,16001 +20,143,6004 +20,145,6840 +20,147,5484 +20,149,22920 +20,151,9729 +20,155,63803 +20,159,9949 +20,161,75026 +20,163,5160 +20,167,6988 +20,169,55547 +20,173,508221 +20,175,23185 +20,177,178567 +20,181,6038 +20,189,5738 +20,191,23509 +20,193,7909 +20,197,6960 +20,201,5613 +20,205,8956 +20,209,161777 +21,001,19156 +21,003,20421 +21,005,21867 +21,007,8216 +21,009,43287 +21,011,12113 +21,013,27676 +21,015,125656 +21,017,20004 +21,019,48716 +21,021,29650 +21,023,8404 +21,025,13476 +21,027,20000 +21,029,77727 +21,031,12828 +21,033,12758 +21,035,38302 +21,037,91456 +21,041,10776 +21,043,27292 +21,045,15928 +21,047,73936 +21,049,35706 +21,051,21160 +21,053,10172 +21,055,9211 +21,057,6780 +21,059,98724 +21,061,12086 +21,063,7661 +21,065,14406 +21,067,311529 +21,069,14543 +21,071,38144 +21,073,49982 +21,075,6323 +21,077,8543 +21,079,17051 +21,081,24705 +21,083,37379 +21,085,26092 +21,087,11123 +21,089,36255 +21,091,8716 +21,093,107573 +21,095,28031 +21,097,18629 +21,099,18510 +21,101,46362 +21,103,15528 +21,107,46359 +21,109,13357 +21,111,759724 +21,113,51015 +21,115,23280 +21,117,163393 +21,119,15884 +21,121,31740 +21,123,14127 +21,125,59950 +21,127,15870 +21,129,6896 +21,131,10869 +21,133,23382 +21,135,13646 +13,043,10962 +13,045,113756 +13,047,65645 +13,049,12968 +13,051,282613 +13,053,11882 +13,055,25046 +13,057,230629 +13,059,122037 +13,063,270269 +13,065,6814 +13,067,728388 +13,069,43042 +13,071,46002 +13,073,139904 +13,075,17103 +13,077,135625 +13,079,12483 +13,081,23061 +13,083,16356 +13,085,22939 +13,087,27237 +13,089,723902 +13,091,20995 +13,093,14089 +13,095,92326 +13,097,138283 +13,099,10480 +13,103,55852 +13,105,19394 +13,107,22723 +13,109,10733 +13,111,24017 +13,113,109495 +13,115,96199 +13,117,203841 +13,119,22188 +13,121,996757 +13,123,28956 +13,127,82623 +13,129,56079 +13,131,25145 +13,133,16535 +13,135,874242 +13,137,43724 +13,139,190482 +13,141,8747 +13,143,28667 +13,145,32992 +13,147,25518 +13,149,11571 +13,151,214171 +13,153,149137 +13,155,9365 +13,157,62131 +13,159,13571 +13,161,14953 +13,163,16201 +13,165,9055 +13,167,9694 +13,169,28701 +13,171,18195 +13,173,10382 +13,175,47802 +13,177,29134 +13,179,63949 +13,181,7712 +13,183,17243 +13,185,113898 +13,187,31094 +13,189,21558 +13,191,13941 +13,193,13846 +13,195,28362 +13,197,8646 +13,199,21195 +13,201,5911 +13,205,22778 +13,207,27044 +13,209,9005 +13,211,17943 \ No newline at end of file diff --git a/test/output/caltrainDirection.svg b/test/output/caltrainDirection.svg index ad5130abf2..e9f7a1fba7 100644 --- a/test/output/caltrainDirection.svg +++ b/test/output/caltrainDirection.svg @@ -48,93 +48,93 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/countryCentroids.svg b/test/output/countryCentroids.svg new file mode 100644 index 0000000000..54fc982920 --- /dev/null +++ b/test/output/countryCentroids.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 242834732124840398860598360032152180706404729148332214643044238578304260626710426484858076068604170591188558340222320084862328740250218630388192716072516686466478204562566120768288384324624430694854140178266226894454508748024108376422450275270788012400784634414368512548116764418104704408410496356050064524586004762417795364760051752112804616040348498642440428233276100300792008191756442056528620724372540090554036144156158380208826352031268608458096705246703203232392600887682010196504818434231262800646070807688499780728 + 242834732124840398860598360032152180706404729148332214643044238578304260626710426484858076068604170591188558340222320084862328740250218630388192716072516686466478204562566120768288384324624430694854140178266226894454508748024108376422450275270788012400784634414368512548116764418104704408410496356050064524586004762417795364760051752112804616040348498642440428233276100300792008191756442056528620724372540090554036144156158380208826352031268608458096705246703203232392600887682010196504818434231262800646070807688499780728 + + \ No newline at end of file diff --git a/test/output/shorthandVector.svg b/test/output/shorthandVector.svg index cdda4f9eab..292bb30652 100644 --- a/test/output/shorthandVector.svg +++ b/test/output/shorthandVector.svg @@ -77,46 +77,46 @@ Feb 25 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/shorthandVectorX.svg b/test/output/shorthandVectorX.svg index dc281fd9e1..e50d9d2a4f 100644 --- a/test/output/shorthandVectorX.svg +++ b/test/output/shorthandVectorX.svg @@ -30,46 +30,46 @@ 175 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/usCountySpikes.svg b/test/output/usCountySpikes.svg new file mode 100644 index 0000000000..4e0145d60d --- /dev/null +++ b/test/output/usCountySpikes.svg @@ -0,0 +1,2857 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/usPresidentialElectionMap2020.svg b/test/output/usPresidentialElectionMap2020.svg index 2c6a702ed2..042268d7cc 100644 --- a/test/output/usPresidentialElectionMap2020.svg +++ b/test/output/usPresidentialElectionMap2020.svg @@ -16,3117 +16,3117 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/vectorField.svg b/test/output/vectorField.svg index 917047e503..edb081ad33 100644 --- a/test/output/vectorField.svg +++ b/test/output/vectorField.svg @@ -77,1030 +77,1030 @@ 6 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/vectorFrame.svg b/test/output/vectorFrame.svg index 82fa82b96a..7b8dff39fb 100644 --- a/test/output/vectorFrame.svg +++ b/test/output/vectorFrame.svg @@ -14,17 +14,17 @@ } - - + + - - + + - - + + - - + + Ο \ No newline at end of file diff --git a/test/plots/country-centroids.js b/test/plots/country-centroids.js new file mode 100644 index 0000000000..3344f3d1c2 --- /dev/null +++ b/test/plots/country-centroids.js @@ -0,0 +1,20 @@ +import * as Plot from "@observablehq/plot"; +import * as d3 from "d3"; +import {feature} from "topojson-client"; + +export default async function () { + const world = await d3.json("data/countries-110m.json"); + const land = feature(world, world.objects.land); + const countries = feature(world, world.objects.countries).features; + return Plot.plot({ + projection: "mercator", + marks: [ + Plot.graticule(), + Plot.geo(land, {fill: "#ddd"}), + Plot.geo(countries, {stroke: "#fff"}), + Plot.text(countries, Plot.geoCentroid({fill: "red", text: "id"})), + Plot.text(countries, Plot.centroid({fill: "blue", text: "id"})), + Plot.frame() + ] + }); +} diff --git a/test/plots/index.js b/test/plots/index.js index f6e18e20d3..4436ba723f 100644 --- a/test/plots/index.js +++ b/test/plots/index.js @@ -41,6 +41,7 @@ export {default as carsMpg} from "./cars-mpg.js"; export {default as carsParcoords} from "./cars-parcoords.js"; export {default as clamp} from "./clamp.js"; export {default as collapsedHistogram} from "./collapsed-histogram.js"; +export {default as countryCentroids} from "./country-centroids.js"; export {default as covidIhmeProjectedDeaths} from "./covid-ihme-projected-deaths.js"; export {default as crimeanWarArrow} from "./crimean-war-arrow.js"; export {default as crimeanWarLine} from "./crimean-war-line.js"; @@ -251,6 +252,7 @@ export {default as usCongressAgeColorExplicit} from "./us-congress-age-color-exp export {default as usCongressAgeGender} from "./us-congress-age-gender.js"; export {default as usCongressAgeSymbolExplicit} from "./us-congress-age-symbol-explicit.js"; export {default as usCountyChoropleth} from "./us-county-choropleth.js"; +export {default as usCountySpikes} from "./us-county-spikes.js"; export {default as usPopulationStateAge} from "./us-population-state-age.js"; export {default as usPopulationStateAgeDots} from "./us-population-state-age-dots.js"; export {default as usPresidentFavorabilityDots} from "./us-president-favorability-dots.js"; diff --git a/test/plots/us-county-spikes.js b/test/plots/us-county-spikes.js new file mode 100644 index 0000000000..031b755b09 --- /dev/null +++ b/test/plots/us-county-spikes.js @@ -0,0 +1,31 @@ +import * as Plot from "@observablehq/plot"; +import * as d3 from "d3"; +import {feature, mesh} from "topojson-client"; + +export default async function () { + const [[nation, counties, statemesh], population] = await Promise.all([ + d3 + .json("data/us-counties-10m.json") + .then((us) => [ + feature(us, us.objects.nation), + feature(us, us.objects.counties), + mesh(us, us.objects.states, (a, b) => a !== b) + ]), + d3 + .csv("data/us-county-population.csv") + .then((data) => new Map(data.map(({state, county, population}) => [state + county, +population]))) + ]); + return Plot.plot({ + width: 960, + height: 600, + projection: "albers-usa", + length: { + range: [0, 200] + }, + marks: [ + Plot.geo(nation, {fill: "#e0e0e0"}), + Plot.geo(statemesh, {stroke: "white"}), + Plot.spike(counties.features, Plot.geoCentroid({stroke: "red", length: (d) => population.get(d.id)})) + ] + }); +} diff --git a/test/plots/us-presidential-election-map-2020.js b/test/plots/us-presidential-election-map-2020.js index 4ed989e6d0..329358b044 100644 --- a/test/plots/us-presidential-election-map-2020.js +++ b/test/plots/us-presidential-election-map-2020.js @@ -7,23 +7,25 @@ export default async function () { d3.json("data/us-counties-10m.json").then((us) => [feature(us, us.objects.counties), mesh(us, us.objects.states)]), d3.csv("data/us-presidential-election-2020.csv") ]); - const centroids = new Map(counties.features.map((d) => [d.id, d3.geoCentroid(d)])); + const geom = new Map(counties.features.map((d) => [d.id, d])); return Plot.plot({ width: 960, height: 600, projection: "albers-usa", marks: [ Plot.geo(statemesh), - Plot.vector(elections, { - filter: (d) => d.votes > 0, - anchor: "start", - x: (d) => centroids.get(d.fips)?.[0], - y: (d) => centroids.get(d.fips)?.[1], - sort: (d) => Math.abs(+d.results_trumpd - +d.results_bidenj), - stroke: (d) => (+d.results_trumpd > +d.results_bidenj ? "red" : "blue"), - length: (d) => Math.sqrt(Math.abs(+d.margin2020 * +d.votes)), - rotate: (d) => (+d.results_bidenj < +d.results_trumpd ? 60 : -60) - }) + Plot.vector( + elections, + Plot.geoCentroid({ + geometry: ({fips}) => geom.get(fips), + filter: (d) => d.votes > 0, + anchor: "start", + sort: (d) => Math.abs(+d.results_trumpd - +d.results_bidenj), + stroke: (d) => (+d.results_trumpd > +d.results_bidenj ? "red" : "blue"), + length: (d) => Math.sqrt(Math.abs(+d.margin2020 * +d.votes)), + rotate: (d) => (+d.results_bidenj < +d.results_trumpd ? 60 : -60) + }) + ) ] }); }