diff --git a/README.md b/README.md
index 9a67308a11..9ccee0cb04 100644
--- a/README.md
+++ b/README.md
@@ -292,7 +292,7 @@ Plot automatically generates axes for position scales. You can configure these a
* *scale*.**tickPadding** - the separation between the tick and its label (in pixels; default 3)
* *scale*.**tickFormat** - to format tick values, either a function or format specifier string; see [Formats](#formats)
* *scale*.**tickRotate** - whether to rotate tick labels (an angle in degrees clockwise; default 0)
-* *scale*.**grid** - if true, draw grid lines across the plot for each tick
+* *scale*.**grid** - if true, draw grid lines across the plot for each tick; specify a number or an array of tick values to generate different ticks; see [grid marks](#grid) for more options
* *scale*.**line** - if true, draw the axis line
* *scale*.**label** - a string to label the axis
* *scale*.**labelAnchor** - the label anchor: *top*, *right*, *bottom*, *left*, or *center*
@@ -1105,6 +1105,38 @@ Equivalent to [Plot.dot](#plotdotdata-options) except that the **symbol** option
Equivalent to [Plot.dot](#plotdotdata-options) except that the **symbol** option is set to *hexagon*.
+### Grid
+
+The grid mark draw a line for each tick of the *x* or *y* axis. Specify a number to generate new ticks from the scale, or an explicit array of tick values. The [standard mark options](#marks) can be specified as a constant, or a function of the tick value and tick index, with a *stroke* which defaults to currentColor, and a *strokeOpacity* which defaults to 0.1. If the ticks are specified as an array of tick values, they will be considered as a channel when building the default domain.
+
+#### Plot.gridX([*options*])
+
+```js
+Plot.gridX([3, 4, 5], {stroke: "red"})
+```
+
+Returns a new grid along the *x* axis with the given *options*. The *ticks* option can be specified as the first argument.
+
+In addition to the [standard mark options](#marks), the following optional channels are supported:
+
+* **insetTop** - insets the top edge
+* **insetBottom** - insets the bottom edge
+* **inset** - shorthand for insetTop and insetBottom
+
+#### Plot.gridY([*options*])
+
+```js
+Plot.gridY([3, 4, 5], {stroke: "red"})
+```
+
+Returns a new grid along the *y* axis with the given *options*. The *ticks* option can be specified as the first argument.
+
+In addition to the [standard mark options](#marks), the following optional channels are supported:
+
+* **insetLeft** - insets the left edge
+* **insetRight** - insets the right edge
+* **inset** - shorthand for insetLeft and insetRight
+
### Hexgrid
The hexgrid mark can be used to support marks using the [hexbin](#hexbin) layout.
diff --git a/src/axes.js b/src/axes.js
index 7cac35bec9..88ad1336bc 100644
--- a/src/axes.js
+++ b/src/axes.js
@@ -59,14 +59,14 @@ export function Axes(
// Mutates axis.ticks!
// TODO Populate tickFormat if undefined, too?
export function autoAxisTicks({x, y, fx, fy}, {x: xAxis, y: yAxis, fx: fxAxis, fy: fyAxis}) {
- if (fxAxis) autoAxisTicksK(fx, fxAxis, 80);
- if (fyAxis) autoAxisTicksK(fy, fyAxis, 35);
- if (xAxis) autoAxisTicksK(x, xAxis, 80);
- if (yAxis) autoAxisTicksK(y, yAxis, 35);
+ if (fxAxis) autoAxisTickFormatK(fx, fxAxis);
+ if (fyAxis) autoAxisTickFormatK(fy, fyAxis);
+ if (xAxis) autoAxisTicksK(x, xAxis, 80), autoAxisTickFormatK(x, xAxis);
+ if (yAxis) autoAxisTicksK(y, yAxis, 35), autoAxisTickFormatK(y, yAxis);
}
function autoAxisTicksK(scale, axis, k) {
- if (axis.ticks === undefined) {
+ if (axis.ticks === undefined && !isOrdinalScale(scale)) {
const interval = scale.interval;
if (interval !== undefined) {
const [min, max] = extent(scale.scale.domain());
@@ -76,9 +76,12 @@ function autoAxisTicksK(scale, axis, k) {
axis.ticks = (max - min) / k;
}
}
- // D3’s ordinal scales simply use toString by default, but if the ordinal
- // scale domain (or ticks) are numbers or dates (say because we’re applying a
- // time interval to the ordinal scale), we want Plot’s default formatter.
+}
+
+// D3’s ordinal scales simply use toString by default, but if the ordinal
+// scale domain (or ticks) are numbers or dates (say because we’re applying a
+// time interval to the ordinal scale), we want Plot’s default formatter.
+function autoAxisTickFormatK(scale, axis) {
if (axis.tickFormat === undefined && isOrdinalScale(scale)) {
axis.tickFormat = formatDefault;
}
diff --git a/src/axis.js b/src/axis.js
index a341a4292c..eae1154483 100644
--- a/src/axis.js
+++ b/src/axis.js
@@ -2,7 +2,7 @@ import {axisTop, axisBottom, axisRight, axisLeft, format, utcFormat} from "d3";
import {create} from "./context.js";
import {formatIsoDate} from "./format.js";
import {radians} from "./math.js";
-import {boolean, take, number, string, keyword, maybeKeyword, constant, isTemporal} from "./options.js";
+import {boolean, number, string, keyword, maybeKeyword, constant, isTemporal} from "./options.js";
import {applyAttr, impliedString} from "./style.js";
export class AxisX {
@@ -14,7 +14,6 @@ export class AxisX {
tickPadding = tickSize === 0 ? 9 : 3,
tickFormat,
fontVariant,
- grid,
label,
labelAnchor,
labelOffset,
@@ -30,7 +29,6 @@ export class AxisX {
this.tickPadding = number(tickPadding);
this.tickFormat = maybeTickFormat(tickFormat);
this.fontVariant = impliedString(fontVariant, "normal");
- this.grid = boolean(grid);
this.label = string(label);
this.labelAnchor = maybeKeyword(labelAnchor, "labelAnchor", ["center", "left", "right"]);
this.labelOffset = number(labelOffset);
@@ -41,7 +39,7 @@ export class AxisX {
}
render(
index,
- {[this.name]: x, fy},
+ {[this.name]: x},
{
width,
height,
@@ -57,7 +55,7 @@ export class AxisX {
},
context
) {
- const {axis, fontVariant, grid, label, labelAnchor, labelOffset, line, name, tickRotate} = this;
+ const {axis, fontVariant, label, labelAnchor, labelOffset, line, name, tickRotate} = this;
const offset = name === "x" ? 0 : axis === "top" ? marginTop - facetMarginTop : marginBottom - facetMarginBottom;
const offsetSign = axis === "top" ? -1 : 1;
const ty = offsetSign * offset + (axis === "top" ? marginTop : height - marginBottom);
@@ -70,9 +68,6 @@ export class AxisX {
.attr("font-family", null)
.attr("font-variant", fontVariant)
.call(!line ? (g) => g.select(".domain").remove() : () => {})
- .call(
- !grid ? () => {} : fy ? gridFacetX(index, fy, -ty) : gridX(offsetSign * (marginBottom + marginTop - height))
- )
.call(
!label
? () => {}
@@ -107,7 +102,6 @@ export class AxisY {
tickPadding = tickSize === 0 ? 9 : 3,
tickFormat,
fontVariant,
- grid,
label,
labelAnchor,
labelOffset,
@@ -123,7 +117,6 @@ export class AxisY {
this.tickPadding = number(tickPadding);
this.tickFormat = maybeTickFormat(tickFormat);
this.fontVariant = impliedString(fontVariant, "normal");
- this.grid = boolean(grid);
this.label = string(label);
this.labelAnchor = maybeKeyword(labelAnchor, "labelAnchor", ["center", "top", "bottom"]);
this.labelOffset = number(labelOffset);
@@ -134,11 +127,11 @@ export class AxisY {
}
render(
index,
- {[this.name]: y, fx},
+ {[this.name]: y},
{width, height, marginTop, marginRight, marginBottom, marginLeft, offsetTop = 0, facetMarginLeft, facetMarginRight},
context
) {
- const {axis, fontVariant, grid, label, labelAnchor, labelOffset, line, name, tickRotate} = this;
+ const {axis, fontVariant, label, labelAnchor, labelOffset, line, name, tickRotate} = this;
const offset = name === "y" ? 0 : axis === "left" ? marginLeft - facetMarginLeft : marginRight - facetMarginRight;
const offsetSign = axis === "left" ? -1 : 1;
const tx = offsetSign * offset + (axis === "right" ? width - marginRight : marginLeft);
@@ -151,7 +144,6 @@ export class AxisY {
.attr("font-family", null)
.attr("font-variant", fontVariant)
.call(!line ? (g) => g.select(".domain").remove() : () => {})
- .call(!grid ? () => {} : fx ? gridFacetY(index, fx, -tx) : gridY(offsetSign * (marginLeft + marginRight - width)))
.call(
!label
? () => {}
@@ -192,38 +184,6 @@ function applyAria(selection, {name, label, ariaLabel = `${name}-axis`, ariaDesc
applyAttr(selection, "aria-description", ariaDescription);
}
-function gridX(y2) {
- return (g) => g.selectAll(".tick line").clone(true).attr("stroke-opacity", 0.1).attr("y2", y2);
-}
-
-function gridY(x2) {
- return (g) => g.selectAll(".tick line").clone(true).attr("stroke-opacity", 0.1).attr("x2", x2);
-}
-
-function gridFacetX(index, fy, ty) {
- const dy = fy.bandwidth();
- const domain = fy.domain();
- return (g) =>
- g
- .selectAll(".tick")
- .append("path")
- .attr("stroke", "currentColor")
- .attr("stroke-opacity", 0.1)
- .attr("d", (index ? take(domain, index) : domain).map((v) => `M0,${fy(v) + ty}v${dy}`).join(""));
-}
-
-function gridFacetY(index, fx, tx) {
- const dx = fx.bandwidth();
- const domain = fx.domain();
- return (g) =>
- g
- .selectAll(".tick")
- .append("path")
- .attr("stroke", "currentColor")
- .attr("stroke-opacity", 0.1)
- .attr("d", (index ? take(domain, index) : domain).map((v) => `M${fx(v) + tx},0h${dx}`).join(""));
-}
-
function maybeTicks(ticks) {
return ticks === null ? [] : ticks;
}
diff --git a/src/context.js b/src/context.js
index 7603225f78..37633b1460 100644
--- a/src/context.js
+++ b/src/context.js
@@ -1,7 +1,7 @@
import {creator, select} from "d3";
-export function Context({document = window.document} = {}) {
- return {document};
+export function Context({document = window.document} = {}, axes) {
+ return {axes, document};
}
export function create(name, {document}) {
diff --git a/src/index.js b/src/index.js
index a6e5dc7a48..4ebfced215 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,4 +1,4 @@
-export {plot, Mark, marks} from "./plot.js";
+export {plot, Mark, marks, Grid} from "./plot.js";
export {Area, area, areaX, areaY} from "./marks/area.js";
export {Arrow, arrow} from "./marks/arrow.js";
export {BarX, BarY, barX, barY} from "./marks/bar.js";
@@ -8,6 +8,7 @@ export {delaunayLink, delaunayMesh, hull, voronoi, voronoiMesh} from "./marks/de
export {Density, density} from "./marks/density.js";
export {Dot, dot, dotX, dotY, circle, hexagon} from "./marks/dot.js";
export {Frame, frame} from "./marks/frame.js";
+export {grid, gridX, gridY} from "./marks/grid.js";
export {Hexgrid, hexgrid} from "./marks/hexgrid.js";
export {Image, image} from "./marks/image.js";
export {Line, line, lineX, lineY} from "./marks/line.js";
diff --git a/src/marks/grid.js b/src/marks/grid.js
new file mode 100644
index 0000000000..c40bef308b
--- /dev/null
+++ b/src/marks/grid.js
@@ -0,0 +1,21 @@
+import {isOptions} from "../options.js";
+import {Grid} from "../plot.js";
+
+function mergeOptions(ticks, options) {
+ return isOptions(ticks) ? ticks : {...options, ticks};
+}
+
+export function grid(ticks, options) {
+ options = mergeOptions(ticks, options);
+ return new Grid(options, "auto", "auto");
+}
+
+export function gridX(ticks, options) {
+ options = mergeOptions(ticks, options);
+ return new Grid(options, true, false);
+}
+
+export function gridY(ticks, options) {
+ options = mergeOptions(ticks, options);
+ return new Grid(options, false, true);
+}
diff --git a/src/plot.js b/src/plot.js
index a9a27a7b20..a3b1b6789c 100644
--- a/src/plot.js
+++ b/src/plot.js
@@ -12,6 +12,7 @@ import {
keyword,
map,
maybeNamed,
+ number,
range,
second,
where,
@@ -19,7 +20,16 @@ import {
} from "./options.js";
import {Scales, ScaleFunctions, autoScaleRange, exposeScales} from "./scales.js";
import {position, registry as scaleRegistry} from "./scales/index.js";
-import {applyInlineStyles, maybeClassName, maybeClip, styles} from "./style.js";
+import {
+ applyInlineStyles,
+ applyDirectStyles,
+ applyChannelStyles,
+ applyIndirectStyles,
+ applyTransform,
+ maybeClassName,
+ maybeClip,
+ styles
+} from "./style.js";
import {basic, initializer} from "./transforms/basic.js";
import {maybeInterval} from "./transforms/interval.js";
import {consumeWarnings} from "./warnings.js";
@@ -33,6 +43,12 @@ export function plot(options = {}) {
// Flatten any nested marks.
const marks = options.marks === undefined ? [] : options.marks.flat(Infinity).map(markify);
+ // Prepend grid marks if passed a grid option
+ const gridx = options.x?.grid === undefined ? options.grid : options.x?.grid;
+ if (gridx != null) marks.unshift(new Grid(gridx, "auto", false));
+ const gridy = options.y?.grid === undefined ? options.grid : options.y?.grid;
+ if (gridy != null) marks.unshift(new Grid(gridy, false, "auto"));
+
// A Map from Mark instance to its render state, including:
// index - the data index e.g. [0, 1, 2, 3, …]
// channels - an array of materialized channels e.g. [["x", {value}], …]
@@ -106,7 +122,7 @@ export function plot(options = {}) {
const scales = ScaleFunctions(scaleDescriptors);
const axes = Axes(scaleDescriptors, options);
const dimensions = Dimensions(scaleDescriptors, axes, options);
- const context = Context(options);
+ const context = Context(options, axes);
autoScaleRange(scaleDescriptors, dimensions);
autoAxisTicks(scaleDescriptors, axes);
@@ -195,52 +211,88 @@ export function plot(options = {}) {
const indexByFacet = facetMap(facetChannels);
facets.forEach(([key], i) => indexByFacet.set(key, i));
const selection = select(svg);
- if (fy && axes.y) {
- const axis1 = axes.y,
- axis2 = nolabel(axis1);
- const j =
- axis1.labelAnchor === "bottom"
- ? fyDomain.length - 1
- : axis1.labelAnchor === "center"
- ? fyDomain.length >> 1
- : 0;
- selection
- .selectAll()
- .data(fyDomain)
- .enter()
- .append((ky, i) =>
- (i === j ? axis1 : axis2).render(
- fx && where(fxDomain, (kx) => indexByFacet.has([kx, ky])),
- scales,
- {...dimensions, ...fyMargins, offsetTop: fy(ky)},
- context
- )
- );
+ if (fy) {
+ if (options.fy?.grid === true) {
+ const ty = fy.bandwidth() / 2;
+ selection
+ .selectAll()
+ .data(fyDomain.map((d) => fy(d) + ty))
+ .enter()
+ .append("line")
+ .attr("y1", (d) => d)
+ .attr("y2", (d) => d)
+ .attr("x1", dimensions.marginLeft)
+ .attr("x2", dimensions.width - dimensions.marginRight)
+ .attr("stroke", "currentColor")
+ .attr("stroke-opacity", 0.1);
+ }
+ if (axes.y) {
+ const axis1 = axes.y,
+ axis2 = nolabel(axis1);
+ const j =
+ axis1.labelAnchor === "bottom"
+ ? fyDomain.length - 1
+ : axis1.labelAnchor === "center"
+ ? fyDomain.length >> 1
+ : 0;
+ selection
+ .selectAll()
+ .data(fyDomain)
+ .enter()
+ .append((ky, i) =>
+ (i === j ? axis1 : axis2).render(
+ fx && where(fxDomain, (kx) => indexByFacet.has([kx, ky])),
+ scales,
+ {...dimensions, ...fyMargins, offsetTop: fy(ky)},
+ context
+ )
+ );
+ }
}
- if (fx && axes.x) {
- const axis1 = axes.x,
- axis2 = nolabel(axis1);
- const j =
- axis1.labelAnchor === "right" ? fxDomain.length - 1 : axis1.labelAnchor === "center" ? fxDomain.length >> 1 : 0;
- const {marginLeft, marginRight} = dimensions;
- selection
- .selectAll()
- .data(fxDomain)
- .enter()
- .append((kx, i) =>
- (i === j ? axis1 : axis2).render(
- fy && where(fyDomain, (ky) => indexByFacet.has([kx, ky])),
- scales,
- {
- ...dimensions,
- ...fxMargins,
- labelMarginLeft: marginLeft,
- labelMarginRight: marginRight,
- offsetLeft: fx(kx)
- },
- context
- )
- );
+ if (fx) {
+ if (options.fx?.grid === true) {
+ const cx = fx.bandwidth() / 2;
+ selection
+ .selectAll()
+ .data(fxDomain.map((d) => fx(d) + cx))
+ .enter()
+ .append("line")
+ .attr("x1", (d) => d)
+ .attr("x2", (d) => d)
+ .attr("y1", dimensions.marginTop)
+ .attr("y2", dimensions.height - dimensions.marginBottom)
+ .attr("stroke", "currentColor")
+ .attr("stroke-opacity", 0.1);
+ }
+ if (axes.x) {
+ const axis1 = axes.x,
+ axis2 = nolabel(axis1);
+ const j =
+ axis1.labelAnchor === "right"
+ ? fxDomain.length - 1
+ : axis1.labelAnchor === "center"
+ ? fxDomain.length >> 1
+ : 0;
+ const {marginLeft, marginRight} = dimensions;
+ selection
+ .selectAll()
+ .data(fxDomain)
+ .enter()
+ .append((kx, i) =>
+ (i === j ? axis1 : axis2).render(
+ fy && where(fyDomain, (ky) => indexByFacet.has([kx, ky])),
+ scales,
+ {
+ ...dimensions,
+ ...fxMargins,
+ labelMarginLeft: marginLeft,
+ labelMarginRight: marginRight,
+ offsetLeft: fx(kx)
+ },
+ context
+ )
+ );
+ }
}
selection
.selectAll()
@@ -504,3 +556,93 @@ class FacetMap2 extends FacetMap {
return this;
}
}
+
+// The Grid class is defined here so we can prepend it per the grid option
+// see grid.js for the helpers
+const defaults = {
+ ariaLabel: "grid",
+ fill: "none",
+ stroke: "currentColor",
+ strokeOpacity: 0.1
+};
+
+export class Grid extends Mark {
+ constructor(options = {}, x, y) {
+ const {ticks, inset = 0, insetTop = inset, insetRight = inset, insetBottom = inset, insetLeft = inset} = options;
+ let channels = undefined,
+ data = undefined;
+ if (Array.isArray(ticks)) {
+ channels = [];
+ data = ticks;
+ channels.push(x ? {name: "x", value: ticks, scale: "x"} : {name: "y", value: ticks, scale: "y"});
+ }
+ super(data, channels, options, defaults);
+ this.insetTop = number(insetTop);
+ this.insetRight = number(insetRight);
+ this.insetBottom = number(insetBottom);
+ this.insetLeft = number(insetLeft);
+ this.ticks = ticks;
+ this.x = x;
+ this.y = y;
+ }
+ render(index, scales, channels, dimensions, context) {
+ const {x, y} = scales;
+ const {marginTop, marginRight, marginBottom, marginLeft, width, height} = dimensions;
+ const {insetTop, insetRight, insetBottom, insetLeft, ticks} = this;
+ const {axes} = context;
+ const ax = this.x === "auto" ? !!x : this.x;
+ const ay = this.y === "auto" ? !!y : this.y;
+ if (ax && !x) throw new Error("missing scale: x");
+ if (ay && !y) throw new Error("missing scale: y");
+ const tx = !ax ? [] : tickValues(x, ticks !== undefined ? ticks : axes.x?.ticks);
+ const ty = !ay ? [] : tickValues(y, ticks !== undefined ? ticks : axes.y?.ticks);
+ const xb =
+ x && x.bandwidth
+ ? (
+ (k) => (d) =>
+ x(d) + k
+ )(x.bandwidth() / 2)
+ : x;
+ const yb =
+ y && y.bandwidth
+ ? (
+ (k) => (d) =>
+ y(d) + k
+ )(y.bandwidth() / 2)
+ : y;
+ return create("svg:g", context)
+ .call(applyIndirectStyles, this, scales, dimensions)
+ .call(applyTransform, this, {})
+ .call((g) =>
+ g
+ .selectAll()
+ .data(range(tx))
+ .enter()
+ .append("line")
+ .call(applyDirectStyles, this)
+ .attr("x1", (i) => xb(tx[i]))
+ .attr("x2", (i) => xb(tx[i]))
+ .attr("y1", marginTop + insetTop)
+ .attr("y2", height - marginBottom - insetBottom)
+ .call(applyChannelStyles, this, channels)
+ )
+ .call((g) =>
+ g
+ .selectAll()
+ .data(range(ty))
+ .enter()
+ .append("line")
+ .call(applyDirectStyles, this)
+ .attr("y1", (i) => yb(ty[i]))
+ .attr("y2", (i) => yb(ty[i]))
+ .attr("x1", marginLeft + insetLeft)
+ .attr("x2", width - marginRight - insetRight)
+ .call(applyChannelStyles, this, channels)
+ )
+ .node();
+ }
+}
+
+function tickValues(scale, ticks) {
+ return Array.isArray(ticks) ? ticks : scale.ticks ? scale.ticks(ticks) : scale.domain();
+}
diff --git a/test/output/aaplBollinger.svg b/test/output/aaplBollinger.svg
index d8aa457779..924fd3b765 100644
--- a/test/output/aaplBollinger.svg
+++ b/test/output/aaplBollinger.svg
@@ -15,60 +15,46 @@
-
- 60
+ 60
-
- 70
+ 70
-
- 80
+ 80
-
- 90
+ 90
-
- 100
+ 100
-
- 110
+ 110
-
- 120
+ 120
-
- 130
+ 130
-
- 140
+ 140
-
- 150
+ 150
-
- 160
+ 160
-
- 170
+ 170
-
- 180
+ 180
-
- 190
+ 190
↑ Close
@@ -88,6 +74,22 @@
2018
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/aaplCandlestick.svg b/test/output/aaplCandlestick.svg
index 45b8595048..4fab2c8bf7 100644
--- a/test/output/aaplCandlestick.svg
+++ b/test/output/aaplCandlestick.svg
@@ -15,64 +15,68 @@
-
- 155
+ 155
-
- 160
+ 160
-
- 165
+ 165
-
- 170
+ 170
-
- 175
+ 175
-
- 180
+ 180
-
- 185
+ 185
-
- 190
+ 190
↑ Apple stock price ($)
-
- December
+ December
-
- 2018
+ 2018
-
- February
+ February
-
- March
+ March
-
- April
+ April
-
- May
+ May
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/aaplChangeVolume.svg b/test/output/aaplChangeVolume.svg
index 41cb75666d..5717ac3c7a 100644
--- a/test/output/aaplChangeVolume.svg
+++ b/test/output/aaplChangeVolume.svg
@@ -15,96 +15,100 @@
-
- 7.1
+ 7.1
-
- 7.2
+ 7.2
-
- 7.3
+ 7.3
-
- 7.4
+ 7.4
-
- 7.5
+ 7.5
-
- 7.6
+ 7.6
-
- 7.7
+ 7.7
-
- 7.8
+ 7.8
-
- 7.9
+ 7.9
-
- 8.0
+ 8.0
-
- 8.1
+ 8.1
-
- 8.2
+ 8.2
-
- 8.3
+ 8.3
-
- 8.4
+ 8.4
↑ Volume (log₁₀)
-
- −6
+ −6
-
- −4
+ −4
-
- −2
+ −2
-
- +0
+ +0
-
- +2
+ +2
-
- +4
+ +4
-
- +6
+ +6
-
- +8
+ +8
Daily change (%) →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/aaplClose.svg b/test/output/aaplClose.svg
index 5ece8b7dab..6f82b72245 100644
--- a/test/output/aaplClose.svg
+++ b/test/output/aaplClose.svg
@@ -15,44 +15,34 @@
-
- 0
+ 0
-
- 20
+ 20
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
-
- 180
+ 180
↑ Close
@@ -72,6 +62,18 @@
2018
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/aaplCloseUntyped.svg b/test/output/aaplCloseUntyped.svg
index 0c73f6f967..7f100b68b4 100644
--- a/test/output/aaplCloseUntyped.svg
+++ b/test/output/aaplCloseUntyped.svg
@@ -15,44 +15,34 @@
-
- 0
+ 0
-
- 20
+ 20
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
-
- 180
+ 180
↑ Close
@@ -72,6 +62,18 @@
2018
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/aaplVolume.svg b/test/output/aaplVolume.svg
index ba5a420a5f..9adebb9a55 100644
--- a/test/output/aaplVolume.svg
+++ b/test/output/aaplVolume.svg
@@ -15,40 +15,31 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
↑ Frequency (%)
@@ -77,6 +68,17 @@
8.4
Trade volume (log₁₀) →
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/aaplVolumeRect.svg b/test/output/aaplVolumeRect.svg
index 5b814e7cbd..a3c2d13004 100644
--- a/test/output/aaplVolumeRect.svg
+++ b/test/output/aaplVolumeRect.svg
@@ -15,60 +15,46 @@
-
- 0
+ 0
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 20
+ 20
-
- 25
+ 25
-
- 30
+ 30
-
- 35
+ 35
-
- 40
+ 40
-
- 45
+ 45
-
- 50
+ 50
-
- 55
+ 55
-
- 60
+ 60
-
- 65
+ 65
↑ Daily trade volume (millions)
@@ -97,6 +83,22 @@
May 06
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/anscombeQuartet.svg b/test/output/anscombeQuartet.svg
index 18f7b940fa..ae79a0f8b2 100644
--- a/test/output/anscombeQuartet.svg
+++ b/test/output/anscombeQuartet.svg
@@ -16,23 +16,18 @@
4
-
6
-
8
-
10
-
12
-
↑ y
@@ -51,61 +46,61 @@
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
x →
+
+
+
+
+
+
+
+
+
+
+
+
@@ -122,6 +117,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -138,6 +145,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -154,6 +173,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/anscombeQuartetGrid.svg b/test/output/anscombeQuartetGrid.svg
new file mode 100644
index 0000000000..db42d6f5d8
--- /dev/null
+++ b/test/output/anscombeQuartetGrid.svg
@@ -0,0 +1,331 @@
+
\ No newline at end of file
diff --git a/test/output/athletesHeightWeight.svg b/test/output/athletesHeightWeight.svg
index ef3205a465..ecf2d33b0b 100644
--- a/test/output/athletesHeightWeight.svg
+++ b/test/output/athletesHeightWeight.svg
@@ -15,116 +15,120 @@
-
- 1.25
+ 1.25
-
- 1.30
+ 1.30
-
- 1.35
+ 1.35
-
- 1.40
+ 1.40
-
- 1.45
+ 1.45
-
- 1.50
+ 1.50
-
- 1.55
+ 1.55
-
- 1.60
+ 1.60
-
- 1.65
+ 1.65
-
- 1.70
+ 1.70
-
- 1.75
+ 1.75
-
- 1.80
+ 1.80
-
- 1.85
+ 1.85
-
- 1.90
+ 1.90
-
- 1.95
+ 1.95
-
- 2.00
+ 2.00
-
- 2.05
+ 2.05
-
- 2.10
+ 2.10
-
- 2.15
+ 2.15
-
- 2.20
+ 2.20
↑ height
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
weight →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/athletesHeightWeightBin.svg b/test/output/athletesHeightWeightBin.svg
index 1ad0f26da5..8f32da630d 100644
--- a/test/output/athletesHeightWeightBin.svg
+++ b/test/output/athletesHeightWeightBin.svg
@@ -15,80 +15,84 @@
-
- 1.2
+ 1.2
-
- 1.3
+ 1.3
-
- 1.4
+ 1.4
-
- 1.5
+ 1.5
-
- 1.6
+ 1.6
-
- 1.7
+ 1.7
-
- 1.8
+ 1.8
-
- 1.9
+ 1.9
-
- 2.0
+ 2.0
-
- 2.1
+ 2.1
-
- 2.2
+ 2.2
↑ height
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
weight →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/athletesHeightWeightBinStroke.svg b/test/output/athletesHeightWeightBinStroke.svg
index 38afde6c1f..6b3e378566 100644
--- a/test/output/athletesHeightWeightBinStroke.svg
+++ b/test/output/athletesHeightWeightBinStroke.svg
@@ -15,80 +15,84 @@
-
- 1.2
+ 1.2
-
- 1.3
+ 1.3
-
- 1.4
+ 1.4
-
- 1.5
+ 1.5
-
- 1.6
+ 1.6
-
- 1.7
+ 1.7
-
- 1.8
+ 1.8
-
- 1.9
+ 1.9
-
- 2.0
+ 2.0
-
- 2.1
+ 2.1
-
- 2.2
+ 2.2
↑ height
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
weight →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/athletesHeightWeightSex.svg b/test/output/athletesHeightWeightSex.svg
index 7f0482abab..785a24cdc5 100644
--- a/test/output/athletesHeightWeightSex.svg
+++ b/test/output/athletesHeightWeightSex.svg
@@ -15,80 +15,84 @@
-
- 1.2
+ 1.2
-
- 1.3
+ 1.3
-
- 1.4
+ 1.4
-
- 1.5
+ 1.5
-
- 1.6
+ 1.6
-
- 1.7
+ 1.7
-
- 1.8
+ 1.8
-
- 1.9
+ 1.9
-
- 2.0
+ 2.0
-
- 2.1
+ 2.1
-
- 2.2
+ 2.2
↑ height
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
weight →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/athletesHeightWeightSport.svg b/test/output/athletesHeightWeightSport.svg
index 68965510bb..04d4d98934 100644
--- a/test/output/athletesHeightWeightSport.svg
+++ b/test/output/athletesHeightWeightSport.svg
@@ -15,116 +15,120 @@
-
- 1.25
+ 1.25
-
- 1.30
+ 1.30
-
- 1.35
+ 1.35
-
- 1.40
+ 1.40
-
- 1.45
+ 1.45
-
- 1.50
+ 1.50
-
- 1.55
+ 1.55
-
- 1.60
+ 1.60
-
- 1.65
+ 1.65
-
- 1.70
+ 1.70
-
- 1.75
+ 1.75
-
- 1.80
+ 1.80
-
- 1.85
+ 1.85
-
- 1.90
+ 1.90
-
- 1.95
+ 1.95
-
- 2.00
+ 2.00
-
- 2.05
+ 2.05
-
- 2.10
+ 2.10
-
- 2.15
+ 2.15
-
- 2.20
+ 2.20
↑ height
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
weight →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/athletesNationality.svg b/test/output/athletesNationality.svg
index 3866bc5cfa..de5b394c68 100644
--- a/test/output/athletesNationality.svg
+++ b/test/output/athletesNationality.svg
@@ -77,30 +77,32 @@
-
- 0
+ 0
-
- 100
+ 100
-
- 200
+ 200
-
- 300
+ 300
-
- 400
+ 400
-
- 500
+ 500
Frequency →
+
+
+
+
+
+
+
+
diff --git a/test/output/athletesSample.svg b/test/output/athletesSample.svg
index 585d9b84c8..2c415a806c 100644
--- a/test/output/athletesSample.svg
+++ b/test/output/athletesSample.svg
@@ -102,34 +102,36 @@
40
-
60
-
80
-
100
-
120
-
140
-
160
-
weight →
+
+
+
+
+
+
+
+
+
Aaron Younger
@@ -182,6 +184,15 @@
+
+
+
+
+
+
+
+
+
Adrian Andres Puentes Perez
@@ -192,6 +203,15 @@
+
+
+
+
+
+
+
+
+
A Jesus Garcia
@@ -265,6 +285,15 @@
+
+
+
+
+
+
+
+
+
Adam Cwalina
@@ -275,6 +304,15 @@
+
+
+
+
+
+
+
+
+
Adas Juskevicius
@@ -291,9 +329,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Adam van Koeverden
@@ -313,6 +369,15 @@
+
+
+
+
+
+
+
+
+
Aaron Gate
@@ -335,6 +400,15 @@
+
+
+
+
+
+
+
+
+
Abdelkebir Ouaddar
@@ -348,6 +422,15 @@
+
+
+
+
+
+
+
+
+
A Lam Shin
@@ -361,6 +444,15 @@
+
+
+
+
+
+
+
+
+
Abbubaker Mobara
@@ -383,6 +475,15 @@
+
+
+
+
+
+
+
+
+
Adilson da Silva
@@ -393,6 +494,15 @@
+
+
+
+
+
+
+
+
+
Aiko Sugihara
@@ -412,6 +522,15 @@
+
+
+
+
+
+
+
+
+
Abdulrazzaq Murad
@@ -428,6 +547,15 @@
+
+
+
+
+
+
+
+
+
Adam Dixon
@@ -450,6 +578,15 @@
+
+
+
+
+
+
+
+
+
Abderrahmane Benamadi
@@ -466,6 +603,15 @@
+
+
+
+
+
+
+
+
+
Adam Marosi
@@ -476,6 +622,15 @@
+
+
+
+
+
+
+
+
+
Abdelkhalek Elbanna
@@ -501,6 +656,15 @@
+
+
+
+
+
+
+
+
+
Abbie Brown
@@ -517,6 +681,15 @@
+
+
+
+
+
+
+
+
+
Afrodite Zegers
@@ -533,6 +706,15 @@
+
+
+
+
+
+
+
+
+
Abdel Aziz Mehelba
@@ -552,6 +734,15 @@
+
+
+
+
+
+
+
+
+
Adam Pattantyus
@@ -562,6 +753,15 @@
+
+
+
+
+
+
+
+
+
Aaron Cook
@@ -572,6 +772,15 @@
+
+
+
+
+
+
+
+
+
Agnieszka Radwanska
@@ -585,6 +794,15 @@
+
+
+
+
+
+
+
+
+
Aaron Royle
@@ -595,6 +813,15 @@
+
+
+
+
+
+
+
+
+
Aaron Russell
@@ -611,6 +838,15 @@
+
+
+
+
+
+
+
+
+
Adrian Edward Zielinski
@@ -627,6 +863,15 @@
+
+
+
+
+
+
+
+
+
Abbos Rakhmonov
diff --git a/test/output/athletesSexWeight.svg b/test/output/athletesSexWeight.svg
index 03d7dfc5ad..dc047a648d 100644
--- a/test/output/athletesSexWeight.svg
+++ b/test/output/athletesSexWeight.svg
@@ -15,48 +15,37 @@
-
- 0
+ 0
-
- 100
+ 100
-
- 200
+ 200
-
- 300
+ 300
-
- 400
+ 400
-
- 500
+ 500
-
- 600
+ 600
-
- 700
+ 700
-
- 800
+ 800
-
- 900
+ 900
-
- 1,000
+ 1,000
↑ Frequency
@@ -82,6 +71,19 @@
160
weight →
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/athletesSportSex.svg b/test/output/athletesSportSex.svg
index 1c6f71358f..ca2b3bd566 100644
--- a/test/output/athletesSportSex.svg
+++ b/test/output/athletesSportSex.svg
@@ -101,50 +101,52 @@
-
- 0
+ 0
-
- 10
+ 10
-
- 20
+ 20
-
- 30
+ 30
-
- 40
+ 40
-
- 50
+ 50
-
- 60
+ 60
-
- 70
+ 70
-
- 80
+ 80
-
- 90
+ 90
-
- 100
+ 100
Women (%) →
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/athletesSportWeight.svg b/test/output/athletesSportWeight.svg
index 948e7cd057..6340136b1c 100644
--- a/test/output/athletesSportWeight.svg
+++ b/test/output/athletesSportWeight.svg
@@ -103,34 +103,36 @@
40
-
60
-
80
-
100
-
120
-
140
-
160
-
weight →
+
+
+
+
+
+
+
+
+
@@ -177,6 +179,15 @@
+
+
+
+
+
+
+
+
+
@@ -213,6 +224,15 @@
+
+
+
+
+
+
+
+
+
@@ -276,6 +296,15 @@
+
+
+
+
+
+
+
+
+
@@ -302,6 +331,15 @@
+
+
+
+
+
+
+
+
+
@@ -344,9 +382,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -378,6 +434,15 @@
+
+
+
+
+
+
+
+
+
@@ -410,6 +475,15 @@
+
+
+
+
+
+
+
+
+
@@ -436,6 +510,15 @@
+
+
+
+
+
+
+
+
+
@@ -470,6 +553,15 @@
+
+
+
+
+
+
+
+
+
@@ -500,6 +592,15 @@
+
+
+
+
+
+
+
+
+
@@ -529,6 +630,15 @@
+
+
+
+
+
+
+
+
+
@@ -558,6 +668,15 @@
+
+
+
+
+
+
+
+
+
@@ -594,6 +713,15 @@
+
+
+
+
+
+
+
+
+
@@ -623,6 +751,15 @@
+
+
+
+
+
+
+
+
+
@@ -673,6 +810,15 @@
+
+
+
+
+
+
+
+
+
@@ -696,6 +842,15 @@
+
+
+
+
+
+
+
+
+
@@ -732,6 +887,15 @@
+
+
+
+
+
+
+
+
+
@@ -766,6 +930,15 @@
+
+
+
+
+
+
+
+
+
@@ -796,6 +969,15 @@
+
+
+
+
+
+
+
+
+
@@ -839,6 +1021,15 @@
+
+
+
+
+
+
+
+
+
@@ -869,6 +1060,15 @@
+
+
+
+
+
+
+
+
+
@@ -900,6 +1100,15 @@
+
+
+
+
+
+
+
+
+
@@ -928,6 +1137,15 @@
+
+
+
+
+
+
+
+
+
@@ -951,6 +1169,15 @@
+
+
+
+
+
+
+
+
+
@@ -984,6 +1211,15 @@
+
+
+
+
+
+
+
+
+
@@ -1031,6 +1267,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/test/output/ballotStatusRace.svg b/test/output/ballotStatusRace.svg
index fae40f1d94..cb348eba21 100644
--- a/test/output/ballotStatusRace.svg
+++ b/test/output/ballotStatusRace.svg
@@ -42,22 +42,24 @@
0
-
20
-
40
-
60
-
Frequency (%) →
+
+
+
+
+
+
79.0%
@@ -74,6 +76,12 @@
+
+
+
+
+
+
78.3%
@@ -90,6 +98,12 @@
+
+
+
+
+
+
77.9%
@@ -106,6 +120,12 @@
+
+
+
+
+
+
74.1%
@@ -122,6 +142,12 @@
+
+
+
+
+
+
73.9%
@@ -138,6 +164,12 @@
+
+
+
+
+
+
25.5%
@@ -154,6 +186,12 @@
+
+
+
+
+
+
67.4%
@@ -170,6 +208,12 @@
+
+
+
+
+
+
41.7%
diff --git a/test/output/beckerBarley.svg b/test/output/beckerBarley.svg
index ebcd8ae1a7..660034a2f1 100644
--- a/test/output/beckerBarley.svg
+++ b/test/output/beckerBarley.svg
@@ -36,286 +36,240 @@
10
-
20
-
30
-
40
-
50
-
60
-
70
-
yield →
-
- Trebi
+ Trebi
-
- Wisconsin No. 38
+ Wisconsin No. 38
-
- No. 457
+ No. 457
-
- Glabron
+ Glabron
-
- Peatland
+ Peatland
-
- Velvet
+ Velvet
-
- No. 475
+ No. 475
-
- Manchuria
+ Manchuria
-
- No. 462
+ No. 462
-
- Svansota
+ Svansota
-
- Trebi
+ Trebi
-
- Wisconsin No. 38
+ Wisconsin No. 38
-
- No. 457
+ No. 457
-
- Glabron
+ Glabron
-
- Peatland
+ Peatland
-
- Velvet
+ Velvet
-
- No. 475
+ No. 475
-
- Manchuria
+ Manchuria
-
- No. 462
+ No. 462
-
- Svansota
+ Svansota
-
- Trebi
+ Trebi
-
- Wisconsin No. 38
+ Wisconsin No. 38
-
- No. 457
+ No. 457
-
- Glabron
+ Glabron
-
- Peatland
+ Peatland
-
- Velvet
+ Velvet
-
- No. 475
+ No. 475
-
- Manchuria
+ Manchuria
-
- No. 462
+ No. 462
-
- Svansota
+ Svansota
-
- Trebi
+ Trebi
-
- Wisconsin No. 38
+ Wisconsin No. 38
-
- No. 457
+ No. 457
-
- Glabron
+ Glabron
-
- Peatland
+ Peatland
-
- Velvet
+ Velvet
-
- No. 475
+ No. 475
-
- Manchuria
+ Manchuria
-
- No. 462
+ No. 462
-
- Svansota
+ Svansota
variety
-
- Trebi
+ Trebi
-
- Wisconsin No. 38
+ Wisconsin No. 38
-
- No. 457
+ No. 457
-
- Glabron
+ Glabron
-
- Peatland
+ Peatland
-
- Velvet
+ Velvet
-
- No. 475
+ No. 475
-
- Manchuria
+ Manchuria
-
- No. 462
+ No. 462
-
- Svansota
+ Svansota
-
- Trebi
+ Trebi
-
- Wisconsin No. 38
+ Wisconsin No. 38
-
- No. 457
+ No. 457
-
- Glabron
+ Glabron
-
- Peatland
+ Peatland
-
- Velvet
+ Velvet
-
- No. 475
+ No. 475
-
- Manchuria
+ Manchuria
-
- No. 462
+ No. 462
-
- Svansota
+ Svansota
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -341,6 +295,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -366,6 +341,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -391,6 +387,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -416,6 +433,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -441,6 +479,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/carsJitter.html b/test/output/carsJitter.html
index c6b97a893f..834242514d 100644
--- a/test/output/carsJitter.html
+++ b/test/output/carsJitter.html
@@ -45,24 +45,19 @@
-
- 8
+ 8
-
- 6
+ 6
-
- 5
+ 5
-
- 4
+ 4
-
- 3
+ 3
cylinders
@@ -94,6 +89,13 @@
5,500
weight (lb) →
+
+
+
+
+
+
+
diff --git a/test/output/carsMpg.svg b/test/output/carsMpg.svg
index 9e6a4a1f8b..56f456aec0 100644
--- a/test/output/carsMpg.svg
+++ b/test/output/carsMpg.svg
@@ -15,44 +15,34 @@
-
- 0
+ 0
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 20
+ 20
-
- 25
+ 25
-
- 30
+ 30
-
- 35
+ 35
-
- 40
+ 40
-
- 45
+ 45
↑ economy (mpg)
@@ -96,6 +86,18 @@
82
year
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/covidIhmeProjectedDeaths.svg b/test/output/covidIhmeProjectedDeaths.svg
index 23e958e3b6..780a3f5754 100644
--- a/test/output/covidIhmeProjectedDeaths.svg
+++ b/test/output/covidIhmeProjectedDeaths.svg
@@ -15,212 +15,216 @@
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
-
+
-
-
+
-
-
+
-
-
+
-
- 10
+ 10
-
- 20
+ 20
-
- 30
+ 30
-
- 40
+ 40
-
- 50
+ 50
-
-
+
-
-
+
-
-
+
-
-
+
-
- 100
+ 100
-
- 200
+ 200
-
- 300
+ 300
-
- 400
+ 400
-
- 500
+ 500
-
-
+
-
-
+
-
-
+
-
-
+
-
- 1,000
+ 1,000
-
- 2,000
+ 2,000
-
- 3,000
+ 3,000
-
- 4,000
+ 4,000
↑ Deaths per day to COVID-19 (projected)
-
- March
+ March
-
- Mar 08
+ Mar 08
-
- Mar 15
+ Mar 15
-
- Mar 22
+ Mar 22
-
- Mar 29
+ Mar 29
-
- Apr 05
+ Apr 05
-
- Apr 12
+ Apr 12
-
- Apr 19
+ Apr 19
-
- Apr 26
+ Apr 26
-
- May 03
+ May 03
-
- May 10
+ May 10
-
- May 17
+ May 17
-
- May 24
+ May 24
-
- May 31
+ May 31
-
- Jun 07
+ Jun 07
-
- Jun 14
+ Jun 14
-
- Jun 21
+ Jun 21
-
- Jun 28
+ Jun 28
-
- Jul 05
+ Jul 05
-
- Jul 12
+ Jul 12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
cone of uncertainty
diff --git a/test/output/d3Survey2015Comfort.svg b/test/output/d3Survey2015Comfort.svg
index 1e97097915..e92629df2d 100644
--- a/test/output/d3Survey2015Comfort.svg
+++ b/test/output/d3Survey2015Comfort.svg
@@ -32,50 +32,52 @@
-
- 0
+ 0
-
- 10
+ 10
-
- 20
+ 20
-
- 30
+ 30
-
- 40
+ 40
-
- 50
+ 50
-
- 60
+ 60
-
- 70
+ 70
-
- 80
+ 80
-
- 90
+ 90
-
- 100
+ 100
Frequency (%) →
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/d3Survey2015Why.svg b/test/output/d3Survey2015Why.svg
index 4df5938c81..b18a2740df 100644
--- a/test/output/d3Survey2015Why.svg
+++ b/test/output/d3Survey2015Why.svg
@@ -62,50 +62,52 @@
-
- 0
+ 0
-
- 10
+ 10
-
- 20
+ 20
-
- 30
+ 30
-
- 40
+ 40
-
- 50
+ 50
-
- 60
+ 60
-
- 70
+ 70
-
- 80
+ 80
-
- 90
+ 90
-
- 100
+ 100
Frequency (%) →
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/decathlon.html b/test/output/decathlon.html
index 82d42f7c10..e518279ced 100644
--- a/test/output/decathlon.html
+++ b/test/output/decathlon.html
@@ -67,64 +67,68 @@
-
- 10.3
+ 10.3
-
- 10.4
+ 10.4
-
- 10.5
+ 10.5
-
- 10.6
+ 10.6
-
- 10.7
+ 10.7
-
- 10.8
+ 10.8
-
- 10.9
+ 10.9
-
- 11.0
+ 11.0
-
- 11.1
+ 11.1
↑ 100 Meters
-
- 7.2
+ 7.2
-
- 7.4
+ 7.4
-
- 7.6
+ 7.6
-
- 7.8
+ 7.8
-
- 8.0
+ 8.0
Long Jump →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/diamondsCaratPriceDots.svg b/test/output/diamondsCaratPriceDots.svg
index 9c289ce6f9..d1735e5a77 100644
--- a/test/output/diamondsCaratPriceDots.svg
+++ b/test/output/diamondsCaratPriceDots.svg
@@ -15,120 +15,124 @@
-
- 1,000
+ 1,000
-
- 2,000
+ 2,000
-
- 3,000
+ 3,000
-
- 4,000
+ 4,000
-
- 5,000
+ 5,000
-
- 6,000
+ 6,000
-
- 7,000
+ 7,000
-
- 8,000
+ 8,000
-
- 9,000
+ 9,000
-
- 10,000
+ 10,000
-
- 11,000
+ 11,000
-
- 12,000
+ 12,000
-
- 13,000
+ 13,000
-
- 14,000
+ 14,000
-
- 15,000
+ 15,000
-
- 16,000
+ 16,000
-
- 17,000
+ 17,000
-
- 18,000
+ 18,000
↑ Price ($)
-
- 0.5
+ 0.5
-
- 1.0
+ 1.0
-
- 1.5
+ 1.5
-
- 2.0
+ 2.0
-
- 2.5
+ 2.5
-
- 3.0
+ 3.0
-
- 3.5
+ 3.5
-
- 4.0
+ 4.0
-
- 4.5
+ 4.5
-
- 5.0
+ 5.0
Carats →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/documentationLinks.svg b/test/output/documentationLinks.svg
index 558a76c4b7..1af248bd9c 100644
--- a/test/output/documentationLinks.svg
+++ b/test/output/documentationLinks.svg
@@ -92,42 +92,44 @@
-
- 0
+ 0
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 20
+ 20
-
- 25
+ 25
-
- 30
+ 30
-
- 35
+ 35
-
- 40
+ 40
likes →
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/driving.svg b/test/output/driving.svg
index bf0fb72b2c..c50853fb19 100644
--- a/test/output/driving.svg
+++ b/test/output/driving.svg
@@ -15,76 +15,80 @@
-
- 1.4
+ 1.4
-
- 1.6
+ 1.6
-
- 1.8
+ 1.8
-
- 2.0
+ 2.0
-
- 2.2
+ 2.2
-
- 2.4
+ 2.4
-
- 2.6
+ 2.6
-
- 2.8
+ 2.8
-
- 3.0
+ 3.0
-
- 3.2
+ 3.2
↑ Cost of gasoline ($ per gallon)
-
- 4,000
+ 4,000
-
- 5,000
+ 5,000
-
- 6,000
+ 6,000
-
- 7,000
+ 7,000
-
- 8,000
+ 8,000
-
- 9,000
+ 9,000
-
- 10,000
+ 10,000
Miles driven (per person-year) →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/empty.svg b/test/output/empty.svg
index bcc24254f7..57a315d6c2 100644
--- a/test/output/empty.svg
+++ b/test/output/empty.svg
@@ -15,96 +15,100 @@
-
- 0.0
+ 0.0
-
- 0.1
+ 0.1
-
- 0.2
+ 0.2
-
- 0.3
+ 0.3
-
- 0.4
+ 0.4
-
- 0.5
+ 0.5
-
- 0.6
+ 0.6
-
- 0.7
+ 0.7
-
- 0.8
+ 0.8
-
- 0.9
+ 0.9
-
- 1.0
+ 1.0
-
- 0.0
+ 0.0
-
- 0.1
+ 0.1
-
- 0.2
+ 0.2
-
- 0.3
+ 0.3
-
- 0.4
+ 0.4
-
- 0.5
+ 0.5
-
- 0.6
+ 0.6
-
- 0.7
+ 0.7
-
- 0.8
+ 0.8
-
- 0.9
+ 0.9
-
- 1.0
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/output/emptyX.svg b/test/output/emptyX.svg
index 26028ee166..f5071e72ad 100644
--- a/test/output/emptyX.svg
+++ b/test/output/emptyX.svg
@@ -13,5 +13,19 @@
white-space: pre;
}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/output/figcaption.html b/test/output/figcaption.html
index 65a6465ff8..a958e8d315 100644
--- a/test/output/figcaption.html
+++ b/test/output/figcaption.html
@@ -15,56 +15,43 @@
-
- 0
+ 0
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
- 6
+ 6
-
- 7
+ 7
-
- 8
+ 8
-
- 9
+ 9
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
↑ Frequency (%)
@@ -147,6 +134,21 @@
Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/figcaptionHtml.html b/test/output/figcaptionHtml.html
index 3b65399b21..e6bd9cdd60 100644
--- a/test/output/figcaptionHtml.html
+++ b/test/output/figcaptionHtml.html
@@ -15,56 +15,43 @@
-
- 0
+ 0
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
- 6
+ 6
-
- 7
+ 7
-
- 8
+ 8
-
- 9
+ 9
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
↑ Frequency (%)
@@ -147,6 +134,21 @@
Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/footballCoverage.svg b/test/output/footballCoverage.svg
index 05f2a4ee5f..23c54370cb 100644
--- a/test/output/footballCoverage.svg
+++ b/test/output/footballCoverage.svg
@@ -16,47 +16,36 @@
0%
-
5%
-
10%
-
15%
-
20%
-
25%
-
30%
-
35%
-
40%
-
45%
-
50%
-
@@ -83,6 +72,19 @@
coverage
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -120,6 +122,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -157,6 +172,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -194,6 +222,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -231,6 +272,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -268,6 +322,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -305,6 +372,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/gistempAnomaly.svg b/test/output/gistempAnomaly.svg
index 8817400f42..8550d90e05 100644
--- a/test/output/gistempAnomaly.svg
+++ b/test/output/gistempAnomaly.svg
@@ -15,44 +15,34 @@
-
- −0.6
+ −0.6
-
- −0.4
+ −0.4
-
- −0.2
+ −0.2
-
- +0.0
+ +0.0
-
- +0.2
+ +0.2
-
- +0.4
+ +0.4
-
- +0.6
+ +0.6
-
- +0.8
+ +0.8
-
- +1.0
+ +1.0
-
- +1.2
+ +1.2
↑ Temperature anomaly (°C)
@@ -78,6 +68,18 @@
2000
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/gistempAnomalyMoving.svg b/test/output/gistempAnomalyMoving.svg
index 5f8e4cf93b..ea8665802f 100644
--- a/test/output/gistempAnomalyMoving.svg
+++ b/test/output/gistempAnomalyMoving.svg
@@ -15,44 +15,34 @@
-
- −0.6
+ −0.6
-
- −0.4
+ −0.4
-
- −0.2
+ −0.2
-
- +0.0
+ +0.0
-
- +0.2
+ +0.2
-
- +0.4
+ +0.4
-
- +0.6
+ +0.6
-
- +0.8
+ +0.8
-
- +1.0
+ +1.0
-
- +1.2
+ +1.2
↑ Temperature anomaly (°C)
@@ -78,6 +68,18 @@
2000
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/gistempAnomalyTransform.svg b/test/output/gistempAnomalyTransform.svg
index 18de62526f..32064051fc 100644
--- a/test/output/gistempAnomalyTransform.svg
+++ b/test/output/gistempAnomalyTransform.svg
@@ -15,32 +15,25 @@
-
- −1.0
+ −1.0
-
- −0.5
+ −0.5
-
- +0.0
+ +0.0
-
- +0.5
+ +0.5
-
- +1.0
+ +1.0
-
- +1.5
+ +1.5
-
- +2.0
+ +2.0
↑ Temperature anomaly (°F)
@@ -66,6 +59,15 @@
2000
+
+
+
+
+
+
+
+
+
diff --git a/test/output/hexbinSymbol.html b/test/output/hexbinSymbol.html
index d9d86b30b7..554a4613d4 100644
--- a/test/output/hexbinSymbol.html
+++ b/test/output/hexbinSymbol.html
@@ -59,92 +59,96 @@
-
- 34
+ 34
-
- 36
+ 36
-
- 38
+ 38
-
- 40
+ 40
-
- 42
+ 42
-
- 44
+ 44
-
- 46
+ 46
-
- 48
+ 48
-
- 50
+ 50
-
- 52
+ 52
-
- 54
+ 54
-
- 56
+ 56
-
- 58
+ 58
↑ culmen_length_mm
-
- 14
+ 14
-
- 15
+ 15
-
- 16
+ 16
-
- 17
+ 17
-
- 18
+ 18
-
- 19
+ 19
-
- 20
+ 20
-
- 21
+ 21
culmen_depth_mm →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/ibmTrading.svg b/test/output/ibmTrading.svg
index 4c50d57c47..f3461a2616 100644
--- a/test/output/ibmTrading.svg
+++ b/test/output/ibmTrading.svg
@@ -15,48 +15,37 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
-
- 18
+ 18
-
- 20
+ 20
↑ Volume (USD, millions)
@@ -139,6 +128,19 @@
2018-05-11
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/industryUnemployment.svg b/test/output/industryUnemployment.svg
index c24958b619..b1b7b27544 100644
--- a/test/output/industryUnemployment.svg
+++ b/test/output/industryUnemployment.svg
@@ -15,36 +15,28 @@
-
- 0
+ 0
-
- 2,000
+ 2,000
-
- 4,000
+ 4,000
-
- 6,000
+ 6,000
-
- 8,000
+ 8,000
-
- 10,000
+ 10,000
-
- 12,000
+ 12,000
-
- 14,000
+ 14,000
↑ unemployed
@@ -82,6 +74,16 @@
2010
+
+
+
+
+
+
+
+
+
+
Wholesale and Retail Trade
diff --git a/test/output/industryUnemploymentShare.svg b/test/output/industryUnemploymentShare.svg
index fa6fc573b2..d5e36b942d 100644
--- a/test/output/industryUnemploymentShare.svg
+++ b/test/output/industryUnemploymentShare.svg
@@ -15,48 +15,37 @@
-
- 0%
+ 0%
-
- 10%
+ 10%
-
- 20%
+ 20%
-
- 30%
+ 30%
-
- 40%
+ 40%
-
- 50%
+ 50%
-
- 60%
+ 60%
-
- 70%
+ 70%
-
- 80%
+ 80%
-
- 90%
+ 90%
-
- 100%
+ 100%
↑ unemployed
@@ -94,6 +83,19 @@
2010
+
+
+
+
+
+
+
+
+
+
+
+
+
Wholesale and Retail Trade
diff --git a/test/output/learningPoverty.svg b/test/output/learningPoverty.svg
index c02da0c6f5..dd8eae502b 100644
--- a/test/output/learningPoverty.svg
+++ b/test/output/learningPoverty.svg
@@ -317,50 +317,52 @@
-
- 100%
+ 100%
-
- 80%
+ 80%
-
- 60%
+ 60%
-
- 40%
+ 40%
-
- 20%
+ 20%
-
- 0%
+ 0%
-
- 20%
+ 20%
-
- 40%
+ 40%
-
- 60%
+ 60%
-
- 80%
+ 80%
-
- 100%
+ 100%
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/letterFrequencyBar.svg b/test/output/letterFrequencyBar.svg
index f559a77824..ec961afa0d 100644
--- a/test/output/letterFrequencyBar.svg
+++ b/test/output/letterFrequencyBar.svg
@@ -95,34 +95,36 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
Frequency (%) →
+
+
+
+
+
+
+
+
+
diff --git a/test/output/letterFrequencyColumn.svg b/test/output/letterFrequencyColumn.svg
index d20e00ea84..ec6a25a13c 100644
--- a/test/output/letterFrequencyColumn.svg
+++ b/test/output/letterFrequencyColumn.svg
@@ -15,56 +15,43 @@
-
- 0
+ 0
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
- 6
+ 6
-
- 7
+ 7
-
- 8
+ 8
-
- 9
+ 9
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
↑ Frequency (%)
@@ -147,6 +134,21 @@
Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/letterFrequencyLollipop.svg b/test/output/letterFrequencyLollipop.svg
index d59d626856..0735771fc9 100644
--- a/test/output/letterFrequencyLollipop.svg
+++ b/test/output/letterFrequencyLollipop.svg
@@ -15,56 +15,43 @@
-
- 0.00
+ 0.00
-
- 0.01
+ 0.01
-
- 0.02
+ 0.02
-
- 0.03
+ 0.03
-
- 0.04
+ 0.04
-
- 0.05
+ 0.05
-
- 0.06
+ 0.06
-
- 0.07
+ 0.07
-
- 0.08
+ 0.08
-
- 0.09
+ 0.09
-
- 0.10
+ 0.10
-
- 0.11
+ 0.11
-
- 0.12
+ 0.12
↑ frequency
@@ -147,6 +134,21 @@
Z
letter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/linearRegressionPenguins.svg b/test/output/linearRegressionPenguins.svg
index 0c8cbb1795..0be15b448e 100644
--- a/test/output/linearRegressionPenguins.svg
+++ b/test/output/linearRegressionPenguins.svg
@@ -15,60 +15,64 @@
-
- 14
+ 14
-
- 15
+ 15
-
- 16
+ 16
-
- 17
+ 17
-
- 18
+ 18
-
- 19
+ 19
-
- 20
+ 20
-
- 21
+ 21
↑ culmen_depth_mm
-
- 35
+ 35
-
- 40
+ 40
-
- 45
+ 45
-
- 50
+ 50
-
- 55
+ 55
culmen_length_mm →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/metroInequality.svg b/test/output/metroInequality.svg
index 7d1e89afec..f1d33d80bb 100644
--- a/test/output/metroInequality.svg
+++ b/test/output/metroInequality.svg
@@ -15,128 +15,132 @@
-
- 3.4
+ 3.4
-
- 3.6
+ 3.6
-
- 3.8
+ 3.8
-
- 4.0
+ 4.0
-
- 4.2
+ 4.2
-
- 4.4
+ 4.4
-
- 4.6
+ 4.6
-
- 4.8
+ 4.8
-
- 5.0
+ 5.0
-
- 5.2
+ 5.2
-
- 5.4
+ 5.4
-
- 5.6
+ 5.6
↑ Inequality
-
- 200k
+ 200k
-
- 300k
+ 300k
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
- 1M
+ 1M
-
- 2M
+ 2M
-
- 3M
+ 3M
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
- 10M
+ 10M
Population →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/metroInequalityChange.svg b/test/output/metroInequalityChange.svg
index f71930ac49..87144aa3ea 100644
--- a/test/output/metroInequalityChange.svg
+++ b/test/output/metroInequalityChange.svg
@@ -15,128 +15,132 @@
-
- 3.5
+ 3.5
-
- 4.0
+ 4.0
-
- 4.5
+ 4.5
-
- 5.0
+ 5.0
-
- 5.5
+ 5.5
-
- 6.0
+ 6.0
-
- 6.5
+ 6.5
-
- 7.0
+ 7.0
-
- 7.5
+ 7.5
-
- 8.0
+ 8.0
-
- 8.5
+ 8.5
↑ Inequality
-
- 200k
+ 200k
-
- 300k
+ 300k
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
- 1M
+ 1M
-
- 2M
+ 2M
-
- 3M
+ 3M
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
- 10M
+ 10M
-
- 20M
+ 20M
Population →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/metroUnemploymentHighlight.svg b/test/output/metroUnemploymentHighlight.svg
index 8c2feb6eb5..1a3758384a 100644
--- a/test/output/metroUnemploymentHighlight.svg
+++ b/test/output/metroUnemploymentHighlight.svg
@@ -15,40 +15,31 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
↑ Unemployment (%)
@@ -74,6 +65,17 @@
2012
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/metroUnemploymentNormalize.svg b/test/output/metroUnemploymentNormalize.svg
index d72da8704b..d758e5e71f 100644
--- a/test/output/metroUnemploymentNormalize.svg
+++ b/test/output/metroUnemploymentNormalize.svg
@@ -15,32 +15,25 @@
-
- 0.8×
+ 0.8×
-
- 0.9×
+ 0.9×
-
- 1×
+ 1×
-
- 2×
+ 2×
-
- 3×
+ 3×
-
- 4×
+ 4×
-
- 5×
+ 5×
↑ Change in unemployment (%)
@@ -66,6 +59,15 @@
2012
+
+
+
+
+
+
+
+
+
diff --git a/test/output/metroUnemploymentSlope.svg b/test/output/metroUnemploymentSlope.svg
index a27b40ccef..f73393716f 100644
--- a/test/output/metroUnemploymentSlope.svg
+++ b/test/output/metroUnemploymentSlope.svg
@@ -15,40 +15,31 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
↑ unemployment
@@ -74,6 +65,17 @@
2012
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/mobyDickFaceted.svg b/test/output/mobyDickFaceted.svg
index c138bac747..378ec654d0 100644
--- a/test/output/mobyDickFaceted.svg
+++ b/test/output/mobyDickFaceted.svg
@@ -32,61 +32,47 @@
0
-
200
-
400
-
600
-
800
-
1,000
-
1,200
-
↑ Frequency
0
-
200
-
400
-
600
-
800
-
1,000
-
1,200
-
@@ -250,6 +236,15 @@
+
+
+
+
+
+
+
+
+
@@ -277,6 +272,15 @@
+
+
+
+
+
+
+
+
+
@@ -300,6 +304,15 @@
+
+
+
+
+
+
+
+
+
@@ -313,6 +326,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/test/output/mobyDickLetterFrequency.svg b/test/output/mobyDickLetterFrequency.svg
index 8bf63d99e2..9711302fb4 100644
--- a/test/output/mobyDickLetterFrequency.svg
+++ b/test/output/mobyDickLetterFrequency.svg
@@ -15,56 +15,43 @@
-
- 0
+ 0
-
- 100
+ 100
-
- 200
+ 200
-
- 300
+ 300
-
- 400
+ 400
-
- 500
+ 500
-
- 600
+ 600
-
- 700
+ 700
-
- 800
+ 800
-
- 900
+ 900
-
- 1,000
+ 1,000
-
- 1,100
+ 1,100
-
- 1,200
+ 1,200
↑ Frequency
@@ -147,6 +134,21 @@
Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/mobyDickLetterRelativeFrequency.svg b/test/output/mobyDickLetterRelativeFrequency.svg
index bddfb60f70..9be21c7b08 100644
--- a/test/output/mobyDickLetterRelativeFrequency.svg
+++ b/test/output/mobyDickLetterRelativeFrequency.svg
@@ -15,56 +15,43 @@
-
- 0
+ 0
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
- 6
+ 6
-
- 7
+ 7
-
- 8
+ 8
-
- 9
+ 9
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
↑ Frequency (%)
@@ -147,6 +134,21 @@
Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/morleyBoxplot.svg b/test/output/morleyBoxplot.svg
index 124d0c1b56..41be6f5115 100644
--- a/test/output/morleyBoxplot.svg
+++ b/test/output/morleyBoxplot.svg
@@ -32,42 +32,44 @@
-
- 650
+ 650
-
- 700
+ 700
-
- 750
+ 750
-
- 800
+ 800
-
- 850
+ 850
-
- 900
+ 900
-
- 950
+ 950
-
- 1,000
+ 1,000
-
- 1,050
+ 1,050
Speed →
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/moviesProfitByGenre.svg b/test/output/moviesProfitByGenre.svg
index 8adb649180..c15cc9209d 100644
--- a/test/output/moviesProfitByGenre.svg
+++ b/test/output/moviesProfitByGenre.svg
@@ -56,30 +56,32 @@
-
- 0
+ 0
-
- 200
+ 200
-
- 400
+ 400
-
- 600
+ 600
-
- 800
+ 800
-
- 1,000
+ 1,000
Profit ($M) →
+
+
+
+
+
+
+
+
diff --git a/test/output/musicRevenue.svg b/test/output/musicRevenue.svg
index 9642166b51..c2770cc33e 100644
--- a/test/output/musicRevenue.svg
+++ b/test/output/musicRevenue.svg
@@ -15,52 +15,40 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
-
- 18
+ 18
-
- 20
+ 20
-
- 22
+ 22
↑ Annual revenue (billions, adj.)
@@ -92,6 +80,20 @@
2015
+
+
+
+
+
+
+
+
+
+
+
+
+
+
8 - Track
diff --git a/test/output/ordinalBar.svg b/test/output/ordinalBar.svg
index 793b9d692f..a2a8dd24ca 100644
--- a/test/output/ordinalBar.svg
+++ b/test/output/ordinalBar.svg
@@ -15,32 +15,25 @@
-
- 0
+ 0
-
- A
+ A
-
- B
+ B
-
- C
+ C
-
- D
+ D
-
- E
+ E
-
- F
+ F
@@ -63,6 +56,15 @@
5
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinCulmen.svg b/test/output/penguinCulmen.svg
index ea4102a7dc..66ad014e65 100644
--- a/test/output/penguinCulmen.svg
+++ b/test/output/penguinCulmen.svg
@@ -38,100 +38,90 @@
35
-
40
-
45
-
50
-
55
-
↑ culmen_length_mm
35
-
40
-
45
-
50
-
55
-
35
-
40
-
45
-
50
-
55
-
15
-
20
-
15
-
20
-
15
-
20
-
culmen_depth_mm →
+
+
+
+
+
+
+
+
+
+
+
@@ -481,6 +471,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -830,6 +831,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -1179,6 +1191,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -1528,6 +1551,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -1877,6 +1911,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -2226,6 +2271,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -2575,6 +2631,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinCulmenArray.svg b/test/output/penguinCulmenArray.svg
index a5acddeee8..01795a86d5 100644
--- a/test/output/penguinCulmenArray.svg
+++ b/test/output/penguinCulmenArray.svg
@@ -38,100 +38,90 @@
35
-
40
-
45
-
50
-
55
-
35
-
40
-
45
-
50
-
55
-
35
-
40
-
45
-
50
-
55
-
15
-
20
-
15
-
20
-
15
-
20
-
+
+
+
+
+
+
+
+
+
+
+
@@ -553,6 +543,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -935,6 +936,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -1341,6 +1353,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -1762,6 +1785,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -2144,6 +2178,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -2553,6 +2598,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -2906,6 +2962,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinDodgeHexbin.svg b/test/output/penguinDodgeHexbin.svg
index 364e4a2e10..3093611c08 100644
--- a/test/output/penguinDodgeHexbin.svg
+++ b/test/output/penguinDodgeHexbin.svg
@@ -27,34 +27,36 @@
3,000
-
3,500
-
4,000
-
4,500
-
5,000
-
5,500
-
6,000
-
body_mass_g →
+
+
+
+
+
+
+
+
+
@@ -363,6 +365,15 @@
+
+
+
+
+
+
+
+
+
@@ -506,6 +517,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinFacetDodge.svg b/test/output/penguinFacetDodge.svg
index 098282e899..6802320232 100644
--- a/test/output/penguinFacetDodge.svg
+++ b/test/output/penguinFacetDodge.svg
@@ -27,34 +27,37 @@
3,000
-
3,500
-
4,000
-
4,500
-
5,000
-
5,500
-
6,000
-
body_mass_g →
+
+
+
+
+
+
+
+
+
+
@@ -210,6 +213,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -282,6 +295,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinFacetDodgeIdentity.svg b/test/output/penguinFacetDodgeIdentity.svg
index 0bcd3c95b7..5ce069800b 100644
--- a/test/output/penguinFacetDodgeIdentity.svg
+++ b/test/output/penguinFacetDodgeIdentity.svg
@@ -27,34 +27,37 @@
3,000
-
3,500
-
4,000
-
4,500
-
5,000
-
5,500
-
6,000
-
body_mass_g →
+
+
+
+
+
+
+
+
+
+
@@ -210,6 +213,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -282,6 +295,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinFacetDodgeIsland.html b/test/output/penguinFacetDodgeIsland.html
index 70e930e518..bd2356bdae 100644
--- a/test/output/penguinFacetDodgeIsland.html
+++ b/test/output/penguinFacetDodgeIsland.html
@@ -65,34 +65,36 @@
3,000
-
3,500
-
4,000
-
4,500
-
5,000
-
5,500
-
6,000
-
body_mass_g →
+
+
+
+
+
+
+
+
+
@@ -248,6 +250,15 @@
+
+
+
+
+
+
+
+
+
@@ -320,6 +331,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinFacetDodgeSymbol.html b/test/output/penguinFacetDodgeSymbol.html
index b8139d1dd5..618d1947fa 100644
--- a/test/output/penguinFacetDodgeSymbol.html
+++ b/test/output/penguinFacetDodgeSymbol.html
@@ -59,42 +59,45 @@
-
- 2,500
+ 2,500
-
- 3,000
+ 3,000
-
- 3,500
+ 3,500
-
- 4,000
+ 4,000
-
- 4,500
+ 4,500
-
- 5,000
+ 5,000
-
- 5,500
+ 5,500
-
- 6,000
+ 6,000
-
- 6,500
+ 6,500
↑ body_mass_g
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinMass.svg b/test/output/penguinMass.svg
index eb320d2aaf..5d574edc4f 100644
--- a/test/output/penguinMass.svg
+++ b/test/output/penguinMass.svg
@@ -15,44 +15,34 @@
-
- 0
+ 0
-
- 10
+ 10
-
- 20
+ 20
-
- 30
+ 30
-
- 40
+ 40
-
- 50
+ 50
-
- 60
+ 60
-
- 70
+ 70
-
- 80
+ 80
-
- 90
+ 90
↑ Frequency
@@ -84,6 +74,18 @@
6,500
Body mass (g) →
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinMassSpecies.svg b/test/output/penguinMassSpecies.svg
index 4f8e31d610..71062c988d 100644
--- a/test/output/penguinMassSpecies.svg
+++ b/test/output/penguinMassSpecies.svg
@@ -15,44 +15,34 @@
-
- 0
+ 0
-
- 10
+ 10
-
- 20
+ 20
-
- 30
+ 30
-
- 40
+ 40
-
- 50
+ 50
-
- 60
+ 60
-
- 70
+ 70
-
- 80
+ 80
-
- 90
+ 90
↑ Frequency
@@ -84,6 +74,18 @@
6,500
Body mass (g) →
+
+
+
+
+
+
+
+
+
+
+
+
Adelie FEMALE (6)
diff --git a/test/output/penguinSexMassCulmenSpecies.svg b/test/output/penguinSexMassCulmenSpecies.svg
index ca0ecacc23..82e371b6ef 100644
--- a/test/output/penguinSexMassCulmenSpecies.svg
+++ b/test/output/penguinSexMassCulmenSpecies.svg
@@ -16,55 +16,42 @@
34
-
36
-
38
-
40
-
42
-
44
-
46
-
48
-
50
-
52
-
54
-
56
-
58
-
↑ culmen_length_mm
@@ -80,95 +67,98 @@
-
- 3k
+ 3k
-
- 3.5k
+ 3.5k
-
- 4k
+ 4k
-
- 4.5k
+ 4.5k
-
- 5k
+ 5k
-
- 5.5k
+ 5.5k
-
- 6k
+ 6k
-
- 3k
+ 3k
-
- 3.5k
+ 3.5k
-
- 4k
+ 4k
-
- 4.5k
+ 4.5k
-
- 5k
+ 5k
-
- 5.5k
+ 5.5k
-
- 6k
+ 6k
-
- 3k
+ 3k
-
- 3.5k
+ 3.5k
-
- 4k
+ 4k
-
- 4.5k
+ 4.5k
-
- 5k
+ 5k
-
- 5.5k
+ 5.5k
-
- 6k
+ 6k
body_mass_g →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -219,6 +209,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -266,6 +280,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinSizeSymbols.html b/test/output/penguinSizeSymbols.html
index c3419de7b3..93908240a5 100644
--- a/test/output/penguinSizeSymbols.html
+++ b/test/output/penguinSizeSymbols.html
@@ -59,84 +59,88 @@
-
- 175
+ 175
-
- 180
+ 180
-
- 185
+ 185
-
- 190
+ 190
-
- 195
+ 195
-
- 200
+ 200
-
- 205
+ 205
-
- 210
+ 210
-
- 215
+ 215
-
- 220
+ 220
-
- 225
+ 225
-
- 230
+ 230
↑ Flipper length (mm)
-
- 3,000
+ 3,000
-
- 3,500
+ 3,500
-
- 4,000
+ 4,000
-
- 4,500
+ 4,500
-
- 5,000
+ 5,000
-
- 5,500
+ 5,500
-
- 6,000
+ 6,000
Body mass (g) →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinSpeciesIsland.svg b/test/output/penguinSpeciesIsland.svg
index ed03003172..dc27359d48 100644
--- a/test/output/penguinSpeciesIsland.svg
+++ b/test/output/penguinSpeciesIsland.svg
@@ -15,36 +15,28 @@
-
- 0
+ 0
-
- 20
+ 20
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
↑ Frequency
@@ -58,6 +50,16 @@
Gentoo
species
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/penguinSpeciesIslandSex.svg b/test/output/penguinSpeciesIslandSex.svg
index d9c38a70e7..92e39c9557 100644
--- a/test/output/penguinSpeciesIslandSex.svg
+++ b/test/output/penguinSpeciesIslandSex.svg
@@ -16,63 +16,48 @@
0
-
5
-
10
-
15
-
20
-
25
-
30
-
35
-
40
-
45
-
50
-
55
-
60
-
65
-
70
-
↑ Frequency
@@ -120,6 +105,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -135,6 +137,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -144,6 +163,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/polylinear.svg b/test/output/polylinear.svg
index e8332febc0..8784ed0540 100644
--- a/test/output/polylinear.svg
+++ b/test/output/polylinear.svg
@@ -15,98 +15,101 @@
-
- 05
+ 05
-
- 06
+ 06
-
- 07
+ 07
-
- 08
+ 08
-
- 09
+ 09
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
-
- 13
+ 13
-
- 14
+ 14
-
- 15
+ 15
-
- 16
+ 16
-
- 17
+ 17
-
- 18
+ 18
-
- 19
+ 19
-
- 20
+ 20
-
- 21
+ 21
-
- 22
+ 22
-
- 23
+ 23
-
- 24
+ 24
-
- 25
+ 25
-
- 26
+ 26
-
- 27
+ 27
date →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/rectBand.svg b/test/output/rectBand.svg
index 4337be4705..2dbbfd787d 100644
--- a/test/output/rectBand.svg
+++ b/test/output/rectBand.svg
@@ -15,16 +15,13 @@
-
- A
+ A
-
- B
+ B
-
- C
+ C
@@ -62,6 +59,11 @@
1.0
+
+
+
+
+
diff --git a/test/output/seattleTemperatureBand.svg b/test/output/seattleTemperatureBand.svg
index 20868228d2..7f3b824bee 100644
--- a/test/output/seattleTemperatureBand.svg
+++ b/test/output/seattleTemperatureBand.svg
@@ -15,36 +15,28 @@
-
- 20
+ 20
-
- 30
+ 30
-
- 40
+ 40
-
- 50
+ 50
-
- 60
+ 60
-
- 70
+ 70
-
- 80
+ 80
-
- 90
+ 90
↑ Temperature (°F)
@@ -61,6 +53,16 @@
2015
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/sfTemperatureBand.svg b/test/output/sfTemperatureBand.svg
index 0c3e21833c..2420fb49fc 100644
--- a/test/output/sfTemperatureBand.svg
+++ b/test/output/sfTemperatureBand.svg
@@ -15,40 +15,31 @@
-
- 40
+ 40
-
- 45
+ 45
-
- 50
+ 50
-
- 55
+ 55
-
- 60
+ 60
-
- 65
+ 65
-
- 70
+ 70
-
- 75
+ 75
-
- 80
+ 80
↑ Daily temperature range (°F)
@@ -80,6 +71,17 @@
October
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/sfTemperatureBandArea.svg b/test/output/sfTemperatureBandArea.svg
index 55f84e9e30..d6ef8be71f 100644
--- a/test/output/sfTemperatureBandArea.svg
+++ b/test/output/sfTemperatureBandArea.svg
@@ -15,64 +15,49 @@
-
- 42
+ 42
-
- 44
+ 44
-
- 46
+ 46
-
- 48
+ 48
-
- 50
+ 50
-
- 52
+ 52
-
- 54
+ 54
-
- 56
+ 56
-
- 58
+ 58
-
- 60
+ 60
-
- 62
+ 62
-
- 64
+ 64
-
- 66
+ 66
-
- 68
+ 68
-
- 70
+ 70
↑ Daily temperature range (°F)
@@ -104,6 +89,23 @@
October
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/simpsonsRatings.svg b/test/output/simpsonsRatings.svg
index 0310c2974b..ac86aeffed 100644
--- a/test/output/simpsonsRatings.svg
+++ b/test/output/simpsonsRatings.svg
@@ -15,220 +15,224 @@
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
- 6
+ 6
-
- 7
+ 7
-
- 8
+ 8
-
- 9
+ 9
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
-
- 13
+ 13
-
- 14
+ 14
-
- 15
+ 15
-
- 16
+ 16
-
- 17
+ 17
-
- 18
+ 18
-
- 19
+ 19
-
- 20
+ 20
-
- 21
+ 21
-
- 22
+ 22
-
- 23
+ 23
-
- 24
+ 24
-
- 25
+ 25
-
- 26
+ 26
-
- 27
+ 27
-
- 28
+ 28
Season
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
- 6
+ 6
-
- 7
+ 7
-
- 8
+ 8
-
- 9
+ 9
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
-
- 13
+ 13
-
- 14
+ 14
-
- 15
+ 15
-
- 16
+ 16
-
- 17
+ 17
-
- 18
+ 18
-
- 19
+ 19
-
- 20
+ 20
-
- 21
+ 21
-
- 22
+ 22
-
- 23
+ 23
-
- 24
+ 24
-
- 25
+ 25
Episode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/simpsonsViews.html b/test/output/simpsonsViews.html
index 6bac9d16f3..a8d497ce90 100644
--- a/test/output/simpsonsViews.html
+++ b/test/output/simpsonsViews.html
@@ -55,116 +55,120 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
-
- 18
+ 18
-
- 20
+ 20
-
- 22
+ 22
-
- 24
+ 24
-
- 26
+ 26
-
- 28
+ 28
-
- 30
+ 30
-
- 32
+ 32
↑ Viewers (U.S., millions)
-
- 4.5
+ 4.5
-
- 5.0
+ 5.0
-
- 5.5
+ 5.5
-
- 6.0
+ 6.0
-
- 6.5
+ 6.5
-
- 7.0
+ 7.0
-
- 7.5
+ 7.5
-
- 8.0
+ 8.0
-
- 8.5
+ 8.5
-
- 9.0
+ 9.0
IMDB rating →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/sparseCell.svg b/test/output/sparseCell.svg
index 4abf1b7022..5aae63a01e 100644
--- a/test/output/sparseCell.svg
+++ b/test/output/sparseCell.svg
@@ -15,208 +15,212 @@
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
- 6
+ 6
-
- 7
+ 7
-
- 8
+ 8
-
- 9
+ 9
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
-
- 13
+ 13
-
- 14
+ 14
-
- 15
+ 15
-
- 16
+ 16
-
- 17
+ 17
-
- 18
+ 18
-
- 19
+ 19
-
- 20
+ 20
-
- 21
+ 21
-
- 22
+ 22
-
- 23
+ 23
-
- 24
+ 24
-
- 25
+ 25
-
- 26
+ 26
-
- 27
+ 27
-
- 28
+ 28
Season
-
- 1
+ 1
-
- 2
+ 2
-
- 3
+ 3
-
- 4
+ 4
-
- 5
+ 5
-
- 6
+ 6
-
- 7
+ 7
-
- 8
+ 8
-
- 9
+ 9
-
- 10
+ 10
-
- 11
+ 11
-
- 12
+ 12
-
- 13
+ 13
-
- 14
+ 14
-
- 15
+ 15
-
- 16
+ 16
-
- 17
+ 17
-
- 18
+ 18
-
- 19
+ 19
-
- 20
+ 20
-
- 21
+ 21
-
- 22
+ 22
Episode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/stargazers.svg b/test/output/stargazers.svg
index ef4fc16eb0..f59b80a9c9 100644
--- a/test/output/stargazers.svg
+++ b/test/output/stargazers.svg
@@ -15,48 +15,37 @@
-
- 0
+ 0
-
- 100
+ 100
-
- 200
+ 200
-
- 300
+ 300
-
- 400
+ 400
-
- 500
+ 500
-
- 600
+ 600
-
- 700
+ 700
-
- 800
+ 800
-
- 900
+ 900
-
- 1,000
+ 1,000
↑ Stargazers
@@ -82,6 +71,19 @@
June
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/stargazersBinned.svg b/test/output/stargazersBinned.svg
index 95a82ba045..e2d4809cf3 100644
--- a/test/output/stargazersBinned.svg
+++ b/test/output/stargazersBinned.svg
@@ -15,56 +15,43 @@
-
- 0
+ 0
-
- 50
+ 50
-
- 100
+ 100
-
- 150
+ 150
-
- 200
+ 200
-
- 250
+ 250
-
- 300
+ 300
-
- 350
+ 350
-
- 400
+ 400
-
- 450
+ 450
-
- 500
+ 500
-
- 550
+ 550
-
- 600
+ 600
↑ Stargazers added per week
@@ -93,6 +80,21 @@
June
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2020-11-01 to 2020-11-08
diff --git a/test/output/stargazersHourly.svg b/test/output/stargazersHourly.svg
index a660b09907..f771a832de 100644
--- a/test/output/stargazersHourly.svg
+++ b/test/output/stargazersHourly.svg
@@ -15,60 +15,46 @@
-
- 0
+ 0
-
- 20
+ 20
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
-
- 180
+ 180
-
- 200
+ 200
-
- 220
+ 220
-
- 240
+ 240
-
- 260
+ 260
↑ Frequency
@@ -106,6 +92,22 @@
New stargazers per hour →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/stargazersHourlyGroup.svg b/test/output/stargazersHourlyGroup.svg
index e62fd4c350..9f88c40a39 100644
--- a/test/output/stargazersHourlyGroup.svg
+++ b/test/output/stargazersHourlyGroup.svg
@@ -15,60 +15,46 @@
-
- 0
+ 0
-
- 20
+ 20
-
- 40
+ 40
-
- 60
+ 60
-
- 80
+ 80
-
- 100
+ 100
-
- 120
+ 120
-
- 140
+ 140
-
- 160
+ 160
-
- 180
+ 180
-
- 200
+ 200
-
- 220
+ 220
-
- 240
+ 240
-
- 260
+ 260
↑ Frequency
@@ -106,6 +92,22 @@
New stargazers per hour →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
S (38)
diff --git a/test/output/stocksIndex.svg b/test/output/stocksIndex.svg
index 1a43629264..835c734e65 100644
--- a/test/output/stocksIndex.svg
+++ b/test/output/stocksIndex.svg
@@ -15,44 +15,34 @@
-
- −40
+ −40
-
- −30
+ −30
-
- −20
+ −20
-
- −10
+ −10
-
- +0
+ +0
-
- +100
+ +100
-
- +200
+ +200
-
- +300
+ +300
-
- +400
+ +400
-
- +500
+ +500
↑ Change in price (%)
@@ -72,6 +62,18 @@
2018
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/superGrid.svg b/test/output/superGrid.svg
new file mode 100644
index 0000000000..49615e6949
--- /dev/null
+++ b/test/output/superGrid.svg
@@ -0,0 +1,277 @@
+
\ No newline at end of file
diff --git a/test/output/travelersCovidDrop.svg b/test/output/travelersCovidDrop.svg
index 3d0ea50ddf..b92f2a662c 100644
--- a/test/output/travelersCovidDrop.svg
+++ b/test/output/travelersCovidDrop.svg
@@ -15,44 +15,34 @@
-
- −90%
+ −90%
-
- −80%
+ −80%
-
- −70%
+ −70%
-
- −60%
+ −60%
-
- −50%
+ −50%
-
- −40%
+ −40%
-
- −30%
+ −30%
-
- −20%
+ −20%
-
- −10%
+ −10%
-
- 0%
+ 0%
↓ Drop in passenger throughput (2020 vs. 2019)
@@ -87,6 +77,18 @@
December
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/travelersYearOverYear.svg b/test/output/travelersYearOverYear.svg
index bf5c44f916..ea75be6334 100644
--- a/test/output/travelersYearOverYear.svg
+++ b/test/output/travelersYearOverYear.svg
@@ -15,68 +15,52 @@
-
- 0.0
+ 0.0
-
- 0.2
+ 0.2
-
- 0.4
+ 0.4
-
- 0.6
+ 0.6
-
- 0.8
+ 0.8
-
- 1.0
+ 1.0
-
- 1.2
+ 1.2
-
- 1.4
+ 1.4
-
- 1.6
+ 1.6
-
- 1.8
+ 1.8
-
- 2.0
+ 2.0
-
- 2.2
+ 2.2
-
- 2.4
+ 2.4
-
- 2.6
+ 2.6
-
- 2.8
+ 2.8
-
- 3.0
+ 3.0
↑ Travelers per day (millions)
@@ -111,6 +95,24 @@
December
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/uniformRandomDifference.svg b/test/output/uniformRandomDifference.svg
index 4a9183ccdb..7e4198e30c 100644
--- a/test/output/uniformRandomDifference.svg
+++ b/test/output/uniformRandomDifference.svg
@@ -15,48 +15,37 @@
-
- 0.0
+ 0.0
-
- 0.5
+ 0.5
-
- 1.0
+ 1.0
-
- 1.5
+ 1.5
-
- 2.0
+ 2.0
-
- 2.5
+ 2.5
-
- 3.0
+ 3.0
-
- 3.5
+ 3.5
-
- 4.0
+ 4.0
-
- 4.5
+ 4.5
-
- 5.0
+ 5.0
↑ Frequency (%)
@@ -94,6 +83,19 @@
1.0
Difference of two uniform random variables
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/usCongressAge.svg b/test/output/usCongressAge.svg
index 93b6fb25e0..29cad5adf0 100644
--- a/test/output/usCongressAge.svg
+++ b/test/output/usCongressAge.svg
@@ -15,32 +15,25 @@
-
- 0
+ 0
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 20
+ 20
-
- 25
+ 25
-
- 30
+ 30
↑ Frequency
@@ -69,6 +62,15 @@
100
Age →
+
+
+
+
+
+
+
+
+
Alexandria Ocasio-Cortez
diff --git a/test/output/usCongressAgeColorExplicit.svg b/test/output/usCongressAgeColorExplicit.svg
index 05af75bab5..9dd216250c 100644
--- a/test/output/usCongressAgeColorExplicit.svg
+++ b/test/output/usCongressAgeColorExplicit.svg
@@ -15,32 +15,25 @@
-
- 0
+ 0
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 20
+ 20
-
- 25
+ 25
-
- 30
+ 30
↑ Frequency
@@ -69,6 +62,15 @@
100
Age →
+
+
+
+
+
+
+
+
+
Alexandria Ocasio-Cortez
diff --git a/test/output/usCongressAgeGender.svg b/test/output/usCongressAgeGender.svg
index 38f16a2e51..3dd3e85e5b 100644
--- a/test/output/usCongressAgeGender.svg
+++ b/test/output/usCongressAgeGender.svg
@@ -15,36 +15,28 @@
-
- 10
+ 10
-
- 5
+ 5
-
- 0
+ 0
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 20
+ 20
-
- 25
+ 25
← Women · Men →
@@ -73,6 +65,16 @@
100
Age →
+
+
+
+
+
+
+
+
+
+
Alexandria Ocasio-Cortez
diff --git a/test/output/usCongressAgeSymbolExplicit.svg b/test/output/usCongressAgeSymbolExplicit.svg
index 152e03a528..2bc08cc929 100644
--- a/test/output/usCongressAgeSymbolExplicit.svg
+++ b/test/output/usCongressAgeSymbolExplicit.svg
@@ -15,32 +15,25 @@
-
- 0
+ 0
-
- 5
+ 5
-
- 10
+ 10
-
- 15
+ 15
-
- 20
+ 20
-
- 25
+ 25
-
- 30
+ 30
↑ Frequency
@@ -69,6 +62,15 @@
100
Age →
+
+
+
+
+
+
+
+
+
Alexandria Ocasio-Cortez
diff --git a/test/output/usPopulationStateAge.svg b/test/output/usPopulationStateAge.svg
index 14615c67e9..978f5ea2d8 100644
--- a/test/output/usPopulationStateAge.svg
+++ b/test/output/usPopulationStateAge.svg
@@ -15,88 +15,92 @@
-
- <10
+ <10
-
- 10-19
+ 10-19
-
- 20-29
+ 20-29
-
- 30-39
+ 30-39
-
- 40-49
+ 40-49
-
- 50-59
+ 50-59
-
- 60-69
+ 60-69
-
- 70-79
+ 70-79
-
- ≥80
+ ≥80
Age
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
-
- 18
+ 18
-
- 20
+ 20
Percent (%) →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/usPopulationStateAgeDots.svg b/test/output/usPopulationStateAgeDots.svg
index d08a543926..41c377d65f 100644
--- a/test/output/usPopulationStateAgeDots.svg
+++ b/test/output/usPopulationStateAgeDots.svg
@@ -15,50 +15,52 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
-
- 18
+ 18
-
- 20
+ 20
Percent (%) →
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/usPresidentFavorabilityDots.svg b/test/output/usPresidentFavorabilityDots.svg
index 73356d1bf3..ccad5a30ad 100644
--- a/test/output/usPresidentFavorabilityDots.svg
+++ b/test/output/usPresidentFavorabilityDots.svg
@@ -15,48 +15,37 @@
-
- −30
+ −30
-
- −20
+ −20
-
- −10
+ −10
-
- +0
+ +0
-
- +10
+ +10
-
- +20
+ +20
-
- +30
+ +30
-
- +40
+ +40
-
- +50
+ +50
-
- +60
+ +60
-
- +70
+ +70
Net favorability (%)
@@ -97,6 +86,19 @@
2020
Date of first inauguration
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/usPresidentialElection2020.svg b/test/output/usPresidentialElection2020.svg
index 2f4141f117..99374dd8d5 100644
--- a/test/output/usPresidentialElection2020.svg
+++ b/test/output/usPresidentialElection2020.svg
@@ -15,216 +15,220 @@
-
-
+
-
-
+
-
-
+
-
- 100
+ 100
-
- 200
+ 200
-
- 300
+ 300
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
- 1k
+ 1k
-
- 2k
+ 2k
-
- 3k
+ 3k
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
- 10k
+ 10k
-
- 20k
+ 20k
-
- 30k
+ 30k
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
- 100k
+ 100k
-
- 200k
+ 200k
-
- 300k
+ 300k
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
- 1M
+ 1M
-
- 2M
+ 2M
-
- 3M
+ 3M
-
-
+
↑ Total number of votes
-
- −80
+ −80
-
- −60
+ −60
-
- −40
+ −40
-
- −20
+ −20
-
- +0
+ +0
-
- +20
+ +20
-
- +40
+ +40
-
- +60
+ +60
-
- +80
+ +80
← Biden · Vote margin (%) · Trump →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/usRetailSales.svg b/test/output/usRetailSales.svg
index 5bfc509eed..1273886a77 100644
--- a/test/output/usRetailSales.svg
+++ b/test/output/usRetailSales.svg
@@ -15,52 +15,40 @@
-
- 0
+ 0
-
- 50
+ 50
-
- 100
+ 100
-
- 150
+ 150
-
- 200
+ 200
-
- 250
+ 250
-
- 300
+ 300
-
- 350
+ 350
-
- 400
+ 400
-
- 450
+ 450
-
- 500
+ 500
-
- 550
+ 550
U.S. retail monthly sales (in billions, seasonally-adjusted)
@@ -83,6 +71,20 @@
2020
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/usStatePopulationChange.svg b/test/output/usStatePopulationChange.svg
index 3c1f50deb2..2eed127d0b 100644
--- a/test/output/usStatePopulationChange.svg
+++ b/test/output/usStatePopulationChange.svg
@@ -15,252 +15,256 @@
-
- Texas
+ Texas
-
- Florida
+ Florida
-
- California
+ California
-
- North Carolina
+ North Carolina
-
- Georgia
+ Georgia
-
- Washington
+ Washington
-
- Arizona
+ Arizona
-
- Colorado
+ Colorado
-
- Virginia
+ Virginia
-
- South Carolina
+ South Carolina
-
- Tennessee
+ Tennessee
-
- Utah
+ Utah
-
- Massachusetts
+ Massachusetts
-
- Oregon
+ Oregon
-
- Nevada
+ Nevada
-
- Minnesota
+ Minnesota
-
- Maryland
+ Maryland
-
- Indiana
+ Indiana
-
- Idaho
+ Idaho
-
- Oklahoma
+ Oklahoma
-
- Ohio
+ Ohio
-
- Missouri
+ Missouri
-
- Wisconsin
+ Wisconsin
-
- Kentucky
+ Kentucky
-
- Alabama
+ Alabama
-
- Louisiana
+ Louisiana
-
- Iowa
+ Iowa
-
- Nebraska
+ Nebraska
-
- District of Columbia
+ District of Columbia
-
- Michigan
+ Michigan
-
- Arkansas
+ Arkansas
-
- Pennsylvania
+ Pennsylvania
-
- New Jersey
+ New Jersey
-
- North Dakota
+ North Dakota
-
- Montana
+ Montana
-
- Delaware
+ Delaware
-
- New York
+ New York
-
- South Dakota
+ South Dakota
-
- Kansas
+ Kansas
-
- Hawaii
+ Hawaii
-
- New Hampshire
+ New Hampshire
-
- New Mexico
+ New Mexico
-
- Alaska
+ Alaska
-
- Maine
+ Maine
-
- Wyoming
+ Wyoming
-
- Mississippi
+ Mississippi
-
- Rhode Island
+ Rhode Island
-
- Vermont
+ Vermont
-
- Connecticut
+ Connecticut
-
- West Virginia
+ West Virginia
-
- Illinois
+ Illinois
-
- Puerto Rico
+ Puerto Rico
-
- −0.5
+ −0.5
-
- +0.0
+ +0.0
-
- +0.5
+ +0.5
-
- +1.0
+ +1.0
-
- +1.5
+ +1.5
-
- +2.0
+ +2.0
-
- +2.5
+ +2.5
-
- +3.0
+ +3.0
-
- +3.5
+ +3.5
← decrease · Change in population, 2010–2019 (millions) · increase →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/output/wordLengthMobyDick.svg b/test/output/wordLengthMobyDick.svg
index 1ba6c9ebb6..11da0c4b77 100644
--- a/test/output/wordLengthMobyDick.svg
+++ b/test/output/wordLengthMobyDick.svg
@@ -15,48 +15,37 @@
-
- 0
+ 0
-
- 2
+ 2
-
- 4
+ 4
-
- 6
+ 6
-
- 8
+ 8
-
- 10
+ 10
-
- 12
+ 12
-
- 14
+ 14
-
- 16
+ 16
-
- 18
+ 18
-
- 20
+ 20
↑ Frequency (%)
@@ -103,6 +92,19 @@
14
Word length →
+
+
+
+
+
+
+
+
+
+
+
+
+
a
diff --git a/test/output/yearlyRequestsDot.svg b/test/output/yearlyRequestsDot.svg
index b10b3d1816..f9c0a3518d 100644
--- a/test/output/yearlyRequestsDot.svg
+++ b/test/output/yearlyRequestsDot.svg
@@ -44,22 +44,24 @@
-
- 2002
+ 2002
-
- 2003
+ 2003
-
- 2004
+ 2004
-
- 2005
+ 2005
+
+
+
+
+
+
diff --git a/test/plots/anscombe-quartet-grid.js b/test/plots/anscombe-quartet-grid.js
new file mode 100644
index 0000000000..9f297d7cad
--- /dev/null
+++ b/test/plots/anscombe-quartet-grid.js
@@ -0,0 +1,21 @@
+import * as Plot from "@observablehq/plot";
+import * as d3 from "d3";
+
+export default async function() {
+ const anscombe = await d3.csv("data/anscombe.csv", d3.autoType);
+ return Plot.plot({
+ nice: true,
+ inset: 5,
+ width: 960,
+ height: 240,
+ facet: {
+ data: anscombe,
+ x: "series"
+ },
+ marks: [
+ Plot.gridX(20, {stroke: "red"}),
+ Plot.gridY(20, {stroke: "blue"}),
+ Plot.dot(anscombe, {x: "x", y: "y"})
+ ]
+ });
+}
diff --git a/test/plots/index.js b/test/plots/index.js
index b3f4d78380..0152b94ab4 100644
--- a/test/plots/index.js
+++ b/test/plots/index.js
@@ -7,6 +7,7 @@ export {default as aaplMonthly} from "./aapl-monthly.js";
export {default as aaplVolume} from "./aapl-volume.js";
export {default as aaplVolumeRect} from "./aapl-volume-rect.js";
export {default as anscombeQuartet} from "./anscombe-quartet.js";
+export {default as anscombeQuartetGrid} from "./anscombe-quartet-grid.js";
export {default as athletesBinsColors} from "./athletes-bins-colors.js";
export {default as athletesBirthdays} from "./athletes-birthdays.js";
export {default as athletesHeightWeight} from "./athletes-height-weight.js";
@@ -212,6 +213,7 @@ export {default as stargazersBinned} from "./stargazers-binned.js";
export {default as stargazersHourly} from "./stargazers-hourly.js";
export {default as stargazersHourlyGroup} from "./stargazers-hourly-group.js";
export {default as stocksIndex} from "./stocks-index.js";
+export {default as superGrid} from "./super-grid.js";
export {default as thisIsJustToSay} from "./this-is-just-to-say.js";
export {default as trafficHorizon} from "./traffic-horizon.js";
export {default as travelersYearOverYear} from "./travelers-year-over-year.js";
diff --git a/test/plots/super-grid.js b/test/plots/super-grid.js
new file mode 100644
index 0000000000..c0c134f1a8
--- /dev/null
+++ b/test/plots/super-grid.js
@@ -0,0 +1,21 @@
+import * as Plot from "@observablehq/plot";
+import * as d3 from "d3";
+
+export default async function() {
+ return Plot.plot({
+ width: 510,
+ height: 470,
+ marks: [
+ Plot.gridX(d3.range(0, 101), {
+ stroke: (d) => d % 5 === 0 ? "steelblue" : "red",
+ strokeWidth: (d) => d % 10 === 0 ? 1 : 0.5,
+ strokeOpacity: (d) => d % 10 === 0 ? 0.5 : 0.1
+ }),
+ Plot.gridY(d3.range(0, 101), {
+ stroke: (d, i) => i % 5 === 0 ? "steelblue" : "red",
+ strokeWidth: (d, i) => i % 10 === 0 ? 1 : 0.5,
+ strokeOpacity: (d, i) => i % 10 === 0 ? 0.5 : 0.2
+ })
+ ]
+ });
+}
diff --git a/test/plots/us-population-state-age-dots.js b/test/plots/us-population-state-age-dots.js
index a58bc3ffaa..187a20ec20 100644
--- a/test/plots/us-population-state-age-dots.js
+++ b/test/plots/us-population-state-age-dots.js
@@ -8,9 +8,9 @@ export default async function () {
const position = Plot.normalizeX("sum", {z: "state", x: "population", y: "state"});
return Plot.plot({
height: 660,
- grid: true,
x: {
axis: "top",
+ grid: true,
label: "Percent (%) →",
transform: (d) => d * 100
},