From 4cd518db84658b2a03493c27050fd5fcd188fdfa Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 08:37:18 -0700 Subject: [PATCH 01/21] delaunayLink --- src/index.js | 1 + src/marks/delaunay.js | 67 +++++++++++++++++++++++++++ test/plots/index.js | 1 + test/plots/penguin-culmen-delaunay.js | 11 +++++ 4 files changed, 80 insertions(+) create mode 100644 src/marks/delaunay.js create mode 100644 test/plots/penguin-culmen-delaunay.js diff --git a/src/index.js b/src/index.js index 6bb74d0e41..9e6a9ca4cc 100644 --- a/src/index.js +++ b/src/index.js @@ -4,6 +4,7 @@ export {Arrow, arrow} from "./marks/arrow.js"; export {BarX, BarY, barX, barY} from "./marks/bar.js"; export {boxX, boxY} from "./marks/box.js"; export {Cell, cell, cellX, cellY} from "./marks/cell.js"; +export {delaunayLink} from "./marks/delaunay.js"; export {Dot, dot, dotX, dotY, circle, hexagon} from "./marks/dot.js"; export {Frame, frame} from "./marks/frame.js"; export {Hexgrid, hexgrid} from "./marks/hexgrid.js"; diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js new file mode 100644 index 0000000000..04d5a962bb --- /dev/null +++ b/src/marks/delaunay.js @@ -0,0 +1,67 @@ +import {Delaunay} from "d3"; +import {identity, maybeTuple, valueof} from "../options.js"; +import {coerceNumbers} from "../scales.js"; +import {initializer} from "../transforms/basic.js"; +import {Link} from "./link.js"; + +function delaunayLinkTransform(options) { + return initializer(options, (data, facets, {x1: X, y1: Y, ...channels}, scales) => { + X = coerceNumbers(valueof(X.value, scales[X.scale] || identity)); + Y = coerceNumbers(valueof(Y.value, scales[Y.scale] || identity)); + + const X1 = []; + const X2 = []; + const Y1 = []; + const Y2 = []; + let newIndex = -1; + const newFacets = []; + const newChannels = {}; + + for (const key in channels) { + newChannels[key] = {...channels[key], value: []}; + } + + // TODO Group by z or stroke. + for (const I of facets) { + const newFacet = []; + const {halfedges, hull, triangles} = Delaunay.from(I, i => X[i], i => Y[i]); + for (let i = 0; i < halfedges.length; ++i) { // inner edges + const j = halfedges[i]; + if (j > i) link(triangles[i], triangles[j]); + } + for (let i = 0; i < hull.length; ++i) { // convex hull + link(hull[i], hull[(i + 1) % hull.length]); + } + function link(ti, tj) { + ti = I[ti]; + tj = I[tj]; + newFacet.push(++newIndex); + X1.push(X[ti]); + Y1.push(Y[ti]); + X2.push(X[tj]); + Y2.push(Y[tj]); + for (const key in channels) { + newChannels[key].value.push(channels[key].value[tj]); + } + } + newFacets.push(newFacet); + } + + return { + data: null, + facets: newFacets, + channels: { + ...newChannels, + x1: {value: X1}, + x2: {value: X2}, + y1: {value: Y1}, + y2: {value: Y2} + } + }; + }); +} + +export function delaunayLink(data, {x, y, ...options} = {}) { + if (options.frameAnchor === undefined) ([x, y] = maybeTuple(x, y)); + return new Link(data, delaunayLinkTransform({...options, x, y, x1: x, y1: y, x2: undefined, y2: undefined})); +} diff --git a/test/plots/index.js b/test/plots/index.js index bfcf4724a3..60f88e76b1 100644 --- a/test/plots/index.js +++ b/test/plots/index.js @@ -122,6 +122,7 @@ export {default as musicRevenue} from "./music-revenue.js"; export {default as ordinalBar} from "./ordinal-bar.js"; export {default as penguinCulmen} from "./penguin-culmen.js"; export {default as penguinCulmenArray} from "./penguin-culmen-array.js"; +export {default as penguinCulmenDelaunay} from "./penguin-culmen-delaunay.js"; export {default as penguinDodge} from "./penguin-dodge.js"; export {default as penguinDodgeHexbin} from "./penguin-dodge-hexbin.js"; export {default as penguinFacetDodge} from "./penguin-facet-dodge.js"; diff --git a/test/plots/penguin-culmen-delaunay.js b/test/plots/penguin-culmen-delaunay.js new file mode 100644 index 0000000000..beb612db25 --- /dev/null +++ b/test/plots/penguin-culmen-delaunay.js @@ -0,0 +1,11 @@ +import * as Plot from "@observablehq/plot"; +import * as d3 from "d3"; + +export default async function() { + const data = await d3.csv("data/penguins.csv", d3.autoType); + return Plot.plot({ + marks: [ + Plot.delaunayLink(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "culmen_length_mm"}) + ] + }); +} From 46677b3c2fab9a09178c1f3f149a3996780c8a3b Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 08:53:26 -0700 Subject: [PATCH 02/21] voronoi --- src/index.js | 1 + src/marks/delaunay.js | 20 +- src/marks/voronoi.js | 51 ++ test/output/penguinCulmenDelaunay.svg | 1088 +++++++++++++++++++++++++ test/output/penguinCulmenVoronoi.svg | 771 ++++++++++++++++++ test/plots/index.js | 1 + test/plots/penguin-culmen-voronoi.js | 12 + 7 files changed, 1934 insertions(+), 10 deletions(-) create mode 100644 src/marks/voronoi.js create mode 100644 test/output/penguinCulmenDelaunay.svg create mode 100644 test/output/penguinCulmenVoronoi.svg create mode 100644 test/plots/penguin-culmen-voronoi.js diff --git a/src/index.js b/src/index.js index 9e6a9ca4cc..62adf90b31 100644 --- a/src/index.js +++ b/src/index.js @@ -5,6 +5,7 @@ export {BarX, BarY, barX, barY} from "./marks/bar.js"; export {boxX, boxY} from "./marks/box.js"; export {Cell, cell, cellX, cellY} from "./marks/cell.js"; export {delaunayLink} from "./marks/delaunay.js"; +export {voronoi} from "./marks/voronoi.js"; export {Dot, dot, dotX, dotY, circle, hexagon} from "./marks/dot.js"; export {Frame, frame} from "./marks/frame.js"; export {Hexgrid, hexgrid} from "./marks/hexgrid.js"; diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index 04d5a962bb..b8476ac931 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -23,16 +23,7 @@ function delaunayLinkTransform(options) { // TODO Group by z or stroke. for (const I of facets) { - const newFacet = []; - const {halfedges, hull, triangles} = Delaunay.from(I, i => X[i], i => Y[i]); - for (let i = 0; i < halfedges.length; ++i) { // inner edges - const j = halfedges[i]; - if (j > i) link(triangles[i], triangles[j]); - } - for (let i = 0; i < hull.length; ++i) { // convex hull - link(hull[i], hull[(i + 1) % hull.length]); - } - function link(ti, tj) { + const link = (ti, tj) => { ti = I[ti]; tj = I[tj]; newFacet.push(++newIndex); @@ -43,6 +34,15 @@ function delaunayLinkTransform(options) { for (const key in channels) { newChannels[key].value.push(channels[key].value[tj]); } + }; + const newFacet = []; + const {halfedges, hull, triangles} = Delaunay.from(I, i => X[i], i => Y[i]); + for (let i = 0; i < halfedges.length; ++i) { // inner edges + const j = halfedges[i]; + if (j > i) link(triangles[i], triangles[j]); + } + for (let i = 0; i < hull.length; ++i) { // convex hull + link(hull[i], hull[(i + 1) % hull.length]); } newFacets.push(newFacet); } diff --git a/src/marks/voronoi.js b/src/marks/voronoi.js new file mode 100644 index 0000000000..069862c925 --- /dev/null +++ b/src/marks/voronoi.js @@ -0,0 +1,51 @@ +import {create, Delaunay} from "d3"; +import {maybeTuple} from "../options.js"; +import {Mark} from "../plot.js"; +import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; + +const defaults = { + ariaLabel: "dot", + fill: "none", + stroke: "currentColor" +}; + +export class Voronoi extends Mark { + constructor(data, options = {}) { + const {x, y} = options; + super( + data, + [ + {name: "x", value: x, scale: "x"}, + {name: "y", value: y, scale: "y"} + ], + options, + defaults + ); + } + render(index, {x, y}, channels, dimensions) { + const {width, height, marginTop, marginRight, marginBottom, marginLeft} = dimensions; + const {x: X, y: Y} = channels; + const {dx, dy} = this; + // TODO Group by z, fill, or stroke. + const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); + const voronoi = delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); + return create("svg:g") + .call(applyIndirectStyles, this, dimensions) + .call(applyTransform, x, y, offset + dx, offset + dy) + .call(g => g.selectAll() + .data(index) + .enter() + .append("path") + .call(applyDirectStyles, this) + .attr("d", (_, i) => voronoi.renderCell(i)) + .call(applyChannelStyles, this, channels)) + .node(); + } +} + +export function voronoi(data, {x, y, ...options} = {}) { + ([x, y] = maybeTuple(x, y)); + return new Voronoi(data, {...options, x, y}); +} + +// TODO voronoiX, voronoiY? diff --git a/test/output/penguinCulmenDelaunay.svg b/test/output/penguinCulmenDelaunay.svg new file mode 100644 index 0000000000..c062998582 --- /dev/null +++ b/test/output/penguinCulmenDelaunay.svg @@ -0,0 +1,1088 @@ + + + + + 34 + + + 36 + + + 38 + + + 40 + + + 42 + + + 44 + + + 46 + + + 48 + + + 50 + + + 52 + + + 54 + + + 56 + + + 58 + ↑ culmen_length_mm + + + + 14 + + + 15 + + + 16 + + + 17 + + + 18 + + + 19 + + + 20 + + + 21 + culmen_depth_mm → + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/penguinCulmenVoronoi.svg b/test/output/penguinCulmenVoronoi.svg new file mode 100644 index 0000000000..a6d408c53e --- /dev/null +++ b/test/output/penguinCulmenVoronoi.svg @@ -0,0 +1,771 @@ + + + + + 34 + + + 36 + + + 38 + + + 40 + + + 42 + + + 44 + + + 46 + + + 48 + + + 50 + + + 52 + + + 54 + + + 56 + + + 58 + ↑ culmen_length_mm + + + + 14 + + + 15 + + + 16 + + + 17 + + + 18 + + + 19 + + + 20 + + + 21 + culmen_depth_mm → + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/plots/index.js b/test/plots/index.js index 60f88e76b1..45bc7ce177 100644 --- a/test/plots/index.js +++ b/test/plots/index.js @@ -123,6 +123,7 @@ export {default as ordinalBar} from "./ordinal-bar.js"; export {default as penguinCulmen} from "./penguin-culmen.js"; export {default as penguinCulmenArray} from "./penguin-culmen-array.js"; export {default as penguinCulmenDelaunay} from "./penguin-culmen-delaunay.js"; +export {default as penguinCulmenVoronoi} from "./penguin-culmen-voronoi.js"; export {default as penguinDodge} from "./penguin-dodge.js"; export {default as penguinDodgeHexbin} from "./penguin-dodge-hexbin.js"; export {default as penguinFacetDodge} from "./penguin-facet-dodge.js"; diff --git a/test/plots/penguin-culmen-voronoi.js b/test/plots/penguin-culmen-voronoi.js new file mode 100644 index 0000000000..a5120ecf8e --- /dev/null +++ b/test/plots/penguin-culmen-voronoi.js @@ -0,0 +1,12 @@ +import * as Plot from "@observablehq/plot"; +import * as d3 from "d3"; + +export default async function() { + const data = await d3.csv("data/penguins.csv", d3.autoType); + return Plot.plot({ + marks: [ + Plot.dot(data, {x: "culmen_depth_mm", y: "culmen_length_mm", fill: "currentColor", r: 1.5}), + Plot.voronoi(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "species"}) + ] + }); +} From e7ef2c451298182a95fff426a8c13bb421a1786e Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 09:53:05 -0700 Subject: [PATCH 03/21] delaunayLink as mark; delaunayMesh --- src/index.js | 2 +- src/marks/delaunay.js | 171 +++++--- src/marks/marker.js | 4 +- src/marks/voronoi.js | 2 +- test/output/penguinCulmenDelaunay.svg | 40 +- test/output/penguinCulmenDelaunayMesh.svg | 430 +++++++++++++++++++++ test/output/penguinCulmenVoronoi.svg | 2 +- test/plots/index.js | 1 + test/plots/penguin-culmen-delaunay-mesh.js | 12 + 9 files changed, 584 insertions(+), 80 deletions(-) create mode 100644 test/output/penguinCulmenDelaunayMesh.svg create mode 100644 test/plots/penguin-culmen-delaunay-mesh.js diff --git a/src/index.js b/src/index.js index 62adf90b31..2fb4760464 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ export {Arrow, arrow} from "./marks/arrow.js"; export {BarX, BarY, barX, barY} from "./marks/bar.js"; export {boxX, boxY} from "./marks/box.js"; export {Cell, cell, cellX, cellY} from "./marks/cell.js"; -export {delaunayLink} from "./marks/delaunay.js"; +export {delaunayLink, delaunayMesh} from "./marks/delaunay.js"; export {voronoi} from "./marks/voronoi.js"; export {Dot, dot, dotX, dotY, circle, hexagon} from "./marks/dot.js"; export {Frame, frame} from "./marks/frame.js"; diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index b8476ac931..5cd3faf554 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -1,67 +1,130 @@ -import {Delaunay} from "d3"; -import {identity, maybeTuple, valueof} from "../options.js"; -import {coerceNumbers} from "../scales.js"; -import {initializer} from "../transforms/basic.js"; -import {Link} from "./link.js"; +import {create, path, Delaunay} from "d3"; +import {Curve} from "../curve.js"; +import {maybeTuple} from "../options.js"; +import {Mark} from "../plot.js"; +import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; +import {markers, applyMarkers} from "./marker.js"; -function delaunayLinkTransform(options) { - return initializer(options, (data, facets, {x1: X, y1: Y, ...channels}, scales) => { - X = coerceNumbers(valueof(X.value, scales[X.scale] || identity)); - Y = coerceNumbers(valueof(Y.value, scales[Y.scale] || identity)); +const linkDefaults = { + ariaLabel: "delaunay", + fill: "none", + stroke: "currentColor", + strokeMiterlimit: 1 +}; - const X1 = []; - const X2 = []; - const Y1 = []; - const Y2 = []; - let newIndex = -1; - const newFacets = []; +const meshDefaults = { + ariaLabel: "delaunay", + fill: "none", + stroke: "currentColor", + strokeOpacity: 0.1 +}; + +export class DelaunayLink extends Mark { + constructor(data, options = {}) { + const {x, y, curve, tension} = options; + super( + data, + [ + {name: "x", value: x, scale: "x"}, + {name: "y", value: y, scale: "y"} + ], + options, + linkDefaults + ); + this.curve = Curve(curve, tension); + markers(this, options); + } + render(index, {x, y}, channels, dimensions) { + const {x: X, y: Y} = channels; + const {dx, dy, curve} = this; + let i = -1; + const newIndex = []; const newChannels = {}; + for (const k in channels) newChannels[k] = []; - for (const key in channels) { - newChannels[key] = {...channels[key], value: []}; + function link(ti, tj) { + ti = index[ti]; + tj = index[tj]; + newIndex.push(++i); + X1[i] = X[ti]; + Y1[i] = Y[ti]; + X2[i] = X[tj]; + Y2[i] = Y[tj]; + for (const k in channels) newChannels[k].push(channels[k][tj]); } // TODO Group by z or stroke. - for (const I of facets) { - const link = (ti, tj) => { - ti = I[ti]; - tj = I[tj]; - newFacet.push(++newIndex); - X1.push(X[ti]); - Y1.push(Y[ti]); - X2.push(X[tj]); - Y2.push(Y[tj]); - for (const key in channels) { - newChannels[key].value.push(channels[key].value[tj]); - } - }; - const newFacet = []; - const {halfedges, hull, triangles} = Delaunay.from(I, i => X[i], i => Y[i]); - for (let i = 0; i < halfedges.length; ++i) { // inner edges - const j = halfedges[i]; - if (j > i) link(triangles[i], triangles[j]); - } - for (let i = 0; i < hull.length; ++i) { // convex hull - link(hull[i], hull[(i + 1) % hull.length]); - } - newFacets.push(newFacet); + const {halfedges, hull, triangles} = Delaunay.from(index, i => X[i], i => Y[i]); + const m = (halfedges.length >> 1) + hull.length; + const X1 = new Float64Array(m); + const X2 = new Float64Array(m); + const Y1 = new Float64Array(m); + const Y2 = new Float64Array(m); + for (let i = 0; i < halfedges.length; ++i) { // inner edges + const j = halfedges[i]; + if (j > i) link(triangles[i], triangles[j]); + } + for (let i = 0; i < hull.length; ++i) { // convex hull + link(hull[i], hull[(i + 1) % hull.length]); } - return { - data: null, - facets: newFacets, - channels: { - ...newChannels, - x1: {value: X1}, - x2: {value: X2}, - y1: {value: Y1}, - y2: {value: Y2} - } - }; - }); + return create("svg:g") + .call(applyIndirectStyles, this, dimensions) + .call(applyTransform, x, y, offset + dx, offset + dy) + .call(g => g.selectAll() + .data(newIndex) + .enter() + .append("path") + .call(applyDirectStyles, this) + .attr("d", (_, i) => { + const p = path(); + const c = curve(p); + c.lineStart(); + c.point(X1[i], Y1[i]); + c.point(X2[i], Y2[i]); + c.lineEnd(); + return p; + }) + .call(applyChannelStyles, this, newChannels) + .call(applyMarkers, this, newChannels)) + .node(); + } +} + +export class DelaunayMesh extends Mark { + constructor(data, options = {}) { + const {x, y} = options; + super( + data, + [ + {name: "x", value: x, scale: "x"}, + {name: "y", value: y, scale: "y"} + ], + options, + meshDefaults + ); + } + render(index, {x, y}, channels, dimensions) { + const {x: X, y: Y} = channels; + const {dx, dy} = this; + // TODO Group by z or stroke. + const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); + return create("svg:g") + .call(applyIndirectStyles, this, dimensions) + .call(g => g.append("path") + .call(applyDirectStyles, this) + .call(applyTransform, x, y, offset + dx, offset + dy) + .attr("d", delaunay.render())) + .node(); + } } export function delaunayLink(data, {x, y, ...options} = {}) { - if (options.frameAnchor === undefined) ([x, y] = maybeTuple(x, y)); - return new Link(data, delaunayLinkTransform({...options, x, y, x1: x, y1: y, x2: undefined, y2: undefined})); + ([x, y] = maybeTuple(x, y)); + return new DelaunayLink(data, {...options, x, y}); +} + +export function delaunayMesh(data, {x, y, ...options} = {}) { + ([x, y] = maybeTuple(x, y)); + return new DelaunayMesh(data, {...options, x, y}); } diff --git a/src/marks/marker.js b/src/marks/marker.js index cb18d14905..8d63d7fb90 100644 --- a/src/marks/marker.js +++ b/src/marks/marker.js @@ -77,11 +77,11 @@ function markerCircleStroke(color) { let nextMarkerId = 0; -export function applyMarkers(path, mark, {stroke: S}) { +export function applyMarkers(path, mark, {stroke: S} = {}) { return applyMarkersColor(path, mark, S && (i => S[i])); } -export function applyGroupedMarkers(path, mark, {stroke: S}) { +export function applyGroupedMarkers(path, mark, {stroke: S} = {}) { return applyMarkersColor(path, mark, S && (([i]) => S[i])); } diff --git a/src/marks/voronoi.js b/src/marks/voronoi.js index 069862c925..5dfb324647 100644 --- a/src/marks/voronoi.js +++ b/src/marks/voronoi.js @@ -4,7 +4,7 @@ import {Mark} from "../plot.js"; import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; const defaults = { - ariaLabel: "dot", + ariaLabel: "voronoi", fill: "none", stroke: "currentColor" }; diff --git a/test/output/penguinCulmenDelaunay.svg b/test/output/penguinCulmenDelaunay.svg index c062998582..a06903d3a8 100644 --- a/test/output/penguinCulmenDelaunay.svg +++ b/test/output/penguinCulmenDelaunay.svg @@ -80,7 +80,7 @@ 21 culmen_depth_mm → - + @@ -176,9 +176,8 @@ - - - + + @@ -212,7 +211,8 @@ - + + @@ -228,12 +228,18 @@ + + + + + + @@ -243,19 +249,13 @@ - - + - - - - - @@ -409,11 +409,11 @@ + - @@ -829,17 +829,17 @@ + + + + + + - - - - - - @@ -1082,7 +1082,5 @@ - - \ No newline at end of file diff --git a/test/output/penguinCulmenDelaunayMesh.svg b/test/output/penguinCulmenDelaunayMesh.svg new file mode 100644 index 0000000000..6aafcd4c69 --- /dev/null +++ b/test/output/penguinCulmenDelaunayMesh.svg @@ -0,0 +1,430 @@ + + + + + 34 + + + 36 + + + 38 + + + 40 + + + 42 + + + 44 + + + 46 + + + 48 + + + 50 + + + 52 + + + 54 + + + 56 + + + 58 + ↑ culmen_length_mm + + + + 14 + + + 15 + + + 16 + + + 17 + + + 18 + + + 19 + + + 20 + + + 21 + culmen_depth_mm → + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/penguinCulmenVoronoi.svg b/test/output/penguinCulmenVoronoi.svg index a6d408c53e..1a79170f48 100644 --- a/test/output/penguinCulmenVoronoi.svg +++ b/test/output/penguinCulmenVoronoi.svg @@ -424,7 +424,7 @@ - + diff --git a/test/plots/index.js b/test/plots/index.js index 45bc7ce177..8d9548980d 100644 --- a/test/plots/index.js +++ b/test/plots/index.js @@ -123,6 +123,7 @@ export {default as ordinalBar} from "./ordinal-bar.js"; export {default as penguinCulmen} from "./penguin-culmen.js"; export {default as penguinCulmenArray} from "./penguin-culmen-array.js"; export {default as penguinCulmenDelaunay} from "./penguin-culmen-delaunay.js"; +export {default as penguinCulmenDelaunayMesh} from "./penguin-culmen-delaunay-mesh.js"; export {default as penguinCulmenVoronoi} from "./penguin-culmen-voronoi.js"; export {default as penguinDodge} from "./penguin-dodge.js"; export {default as penguinDodgeHexbin} from "./penguin-dodge-hexbin.js"; diff --git a/test/plots/penguin-culmen-delaunay-mesh.js b/test/plots/penguin-culmen-delaunay-mesh.js new file mode 100644 index 0000000000..d86203533e --- /dev/null +++ b/test/plots/penguin-culmen-delaunay-mesh.js @@ -0,0 +1,12 @@ +import * as Plot from "@observablehq/plot"; +import * as d3 from "d3"; + +export default async function() { + const data = await d3.csv("data/penguins.csv", d3.autoType); + return Plot.plot({ + marks: [ + Plot.delaunayMesh(data, {x: "culmen_depth_mm", y: "culmen_length_mm"}), + Plot.dot(data, {x: "culmen_depth_mm", y: "culmen_length_mm"}) + ] + }); +} From f1b5038c1c2c18559e1ffca192e97bcd617b4cba Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 09:55:27 -0700 Subject: [PATCH 04/21] hull --- src/index.js | 4 +-- src/marks/delaunay.js | 41 +++++++++++++++++++++++++++ test/plots/penguin-culmen-delaunay.js | 3 +- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 2fb4760464..47518b4f65 100644 --- a/src/index.js +++ b/src/index.js @@ -4,8 +4,7 @@ export {Arrow, arrow} from "./marks/arrow.js"; export {BarX, BarY, barX, barY} from "./marks/bar.js"; export {boxX, boxY} from "./marks/box.js"; export {Cell, cell, cellX, cellY} from "./marks/cell.js"; -export {delaunayLink, delaunayMesh} from "./marks/delaunay.js"; -export {voronoi} from "./marks/voronoi.js"; +export {delaunayLink, delaunayMesh, hull} from "./marks/delaunay.js"; export {Dot, dot, dotX, dotY, circle, hexagon} from "./marks/dot.js"; export {Frame, frame} from "./marks/frame.js"; export {Hexgrid, hexgrid} from "./marks/hexgrid.js"; @@ -18,6 +17,7 @@ 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 {voronoi} from "./marks/voronoi.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"; diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index 5cd3faf554..1fa23358b1 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -19,6 +19,13 @@ const meshDefaults = { strokeOpacity: 0.1 }; +const hullDefaults = { + ariaLabel: "hull", + fill: "none", + stroke: "currentColor", + strokeWidth: 1.5 +}; + export class DelaunayLink extends Mark { constructor(data, options = {}) { const {x, y, curve, tension} = options; @@ -119,6 +126,35 @@ export class DelaunayMesh extends Mark { } } +export class Hull extends Mark { + constructor(data, options = {}) { + const {x, y} = options; + super( + data, + [ + {name: "x", value: x, scale: "x"}, + {name: "y", value: y, scale: "y"} + ], + options, + hullDefaults + ); + } + render(index, {x, y}, channels, dimensions) { + const {x: X, y: Y} = channels; + const {dx, dy} = this; + // TODO Group by z or stroke. + // TODO Use faster monotone chain algorithm? + const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); + return create("svg:g") + .call(applyIndirectStyles, this, dimensions) + .call(g => g.append("path") + .call(applyDirectStyles, this) + .call(applyTransform, x, y, offset + dx, offset + dy) + .attr("d", delaunay.renderHull())) + .node(); + } +} + export function delaunayLink(data, {x, y, ...options} = {}) { ([x, y] = maybeTuple(x, y)); return new DelaunayLink(data, {...options, x, y}); @@ -128,3 +164,8 @@ export function delaunayMesh(data, {x, y, ...options} = {}) { ([x, y] = maybeTuple(x, y)); return new DelaunayMesh(data, {...options, x, y}); } + +export function hull(data, {x, y, ...options} = {}) { + ([x, y] = maybeTuple(x, y)); + return new Hull(data, {...options, x, y}); +} diff --git a/test/plots/penguin-culmen-delaunay.js b/test/plots/penguin-culmen-delaunay.js index beb612db25..7c6f0f5e1b 100644 --- a/test/plots/penguin-culmen-delaunay.js +++ b/test/plots/penguin-culmen-delaunay.js @@ -5,7 +5,8 @@ export default async function() { const data = await d3.csv("data/penguins.csv", d3.autoType); return Plot.plot({ marks: [ - Plot.delaunayLink(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "culmen_length_mm"}) + Plot.delaunayLink(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "culmen_length_mm"}), + Plot.hull(data, {x: "culmen_depth_mm", y: "culmen_length_mm"}) ] }); } From 0eec0959b36fc8928dfdd22b87aaa52f783e39aa Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 09:58:23 -0700 Subject: [PATCH 05/21] DRY --- src/marks/delaunay.js | 39 ++++++++++----------------------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index 1fa23358b1..5fd7dffd39 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -99,7 +99,7 @@ export class DelaunayLink extends Mark { } export class DelaunayMesh extends Mark { - constructor(data, options = {}) { + constructor(data, options = {}, defaults = meshDefaults) { const {x, y} = options; super( data, @@ -108,50 +108,31 @@ export class DelaunayMesh extends Mark { {name: "y", value: y, scale: "y"} ], options, - meshDefaults + defaults ); } + _render(index, {x: X, y: Y}) { + return Delaunay.from(index, i => X[i], i => Y[i]).render(); + } render(index, {x, y}, channels, dimensions) { - const {x: X, y: Y} = channels; const {dx, dy} = this; // TODO Group by z or stroke. - const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); return create("svg:g") .call(applyIndirectStyles, this, dimensions) .call(g => g.append("path") .call(applyDirectStyles, this) .call(applyTransform, x, y, offset + dx, offset + dy) - .attr("d", delaunay.render())) + .attr("d", this._render(index, channels))) .node(); } } -export class Hull extends Mark { +export class Hull extends DelaunayMesh { constructor(data, options = {}) { - const {x, y} = options; - super( - data, - [ - {name: "x", value: x, scale: "x"}, - {name: "y", value: y, scale: "y"} - ], - options, - hullDefaults - ); + super(data, options, hullDefaults); } - render(index, {x, y}, channels, dimensions) { - const {x: X, y: Y} = channels; - const {dx, dy} = this; - // TODO Group by z or stroke. - // TODO Use faster monotone chain algorithm? - const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); - return create("svg:g") - .call(applyIndirectStyles, this, dimensions) - .call(g => g.append("path") - .call(applyDirectStyles, this) - .call(applyTransform, x, y, offset + dx, offset + dy) - .attr("d", delaunay.renderHull())) - .node(); + _render(index, {x: X, y: Y}) { + return Delaunay.from(index, i => X[i], i => Y[i]).renderHull(); } } From 80b1a29302f219dd680044d2e5d812b7c0a5886e Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 10:01:50 -0700 Subject: [PATCH 06/21] update test --- test/output/penguinCulmenDelaunay.svg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/output/penguinCulmenDelaunay.svg b/test/output/penguinCulmenDelaunay.svg index a06903d3a8..80258366cb 100644 --- a/test/output/penguinCulmenDelaunay.svg +++ b/test/output/penguinCulmenDelaunay.svg @@ -1083,4 +1083,7 @@ + + + \ No newline at end of file From e8ddf6387ee5ed165bce179017ee17e11ac3d9f1 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 13:46:08 -0700 Subject: [PATCH 07/21] pointerEvents --- src/style.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/style.js b/src/style.js index 919c6bf2a6..3cc382aad1 100644 --- a/src/style.js +++ b/src/style.js @@ -30,6 +30,7 @@ export function styles( opacity, mixBlendMode, paintOrder, + pointerEvents, shapeRendering }, { @@ -121,6 +122,7 @@ export function styles( mark.opacity = impliedNumber(copacity, 1); mark.mixBlendMode = impliedString(mixBlendMode, "normal"); mark.paintOrder = impliedString(paintOrder, "normal"); + mark.pointerEvents = impliedString(pointerEvents, "visiblePainted"); mark.shapeRendering = impliedString(shapeRendering, "auto"); return [ @@ -261,6 +263,7 @@ export function applyIndirectStyles(selection, mark, {width, height, marginLeft, applyAttr(selection, "stroke-dashoffset", mark.strokeDashoffset); applyAttr(selection, "shape-rendering", mark.shapeRendering); applyAttr(selection, "paint-order", mark.paintOrder); + applyAttr(selection, "pointer-events", mark.pointerEvents); if (mark.clip === "frame") { const id = `plot-clip-${++nextClipId}`; selection From 76f34edb802b43b2b94da8b1249fca4190397e0f Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 14:01:30 -0700 Subject: [PATCH 08/21] voronoi z --- src/marks/voronoi.js | 39 ++++++++++++++++------------ test/plots/penguin-culmen-voronoi.js | 6 ++--- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/marks/voronoi.js b/src/marks/voronoi.js index 5dfb324647..0f1939d598 100644 --- a/src/marks/voronoi.js +++ b/src/marks/voronoi.js @@ -1,4 +1,4 @@ -import {create, Delaunay} from "d3"; +import {create, group, select, Delaunay} from "d3"; import {maybeTuple} from "../options.js"; import {Mark} from "../plot.js"; import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; @@ -11,12 +11,13 @@ const defaults = { export class Voronoi extends Mark { constructor(data, options = {}) { - const {x, y} = options; + const {x, y, z} = options; super( data, [ {name: "x", value: x, scale: "x"}, - {name: "y", value: y, scale: "y"} + {name: "y", value: y, scale: "y"}, + {name: "z", value: z, optional: true} ], options, defaults @@ -24,28 +25,34 @@ export class Voronoi extends Mark { } render(index, {x, y}, channels, dimensions) { const {width, height, marginTop, marginRight, marginBottom, marginLeft} = dimensions; - const {x: X, y: Y} = channels; + const {x: X, y: Y, z: Z} = channels; const {dx, dy} = this; - // TODO Group by z, fill, or stroke. - const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); - const voronoi = delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); + + function cells(index) { + const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); + const voronoi = delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); + select(this) + .selectAll() + .data(index) + .enter() + .append("path") + .call(applyDirectStyles, this) + .attr("d", (_, i) => voronoi.renderCell(i)) + .call(applyChannelStyles, this, channels); + } + return create("svg:g") .call(applyIndirectStyles, this, dimensions) .call(applyTransform, x, y, offset + dx, offset + dy) - .call(g => g.selectAll() - .data(index) - .enter() - .append("path") - .call(applyDirectStyles, this) - .attr("d", (_, i) => voronoi.renderCell(i)) - .call(applyChannelStyles, this, channels)) + .call(Z + ? g => g.selectAll().data(group(index, i => Z[i]).values()).enter().append("g").each(cells) + : g => g.datum(index).each(cells)) .node(); } } +// TODO voronoiX, voronoiY? export function voronoi(data, {x, y, ...options} = {}) { ([x, y] = maybeTuple(x, y)); return new Voronoi(data, {...options, x, y}); } - -// TODO voronoiX, voronoiY? diff --git a/test/plots/penguin-culmen-voronoi.js b/test/plots/penguin-culmen-voronoi.js index a5120ecf8e..0bcf10cf7b 100644 --- a/test/plots/penguin-culmen-voronoi.js +++ b/test/plots/penguin-culmen-voronoi.js @@ -2,11 +2,11 @@ import * as Plot from "@observablehq/plot"; import * as d3 from "d3"; export default async function() { - const data = await d3.csv("data/penguins.csv", d3.autoType); + const penguins = await d3.csv("data/penguins.csv", d3.autoType); return Plot.plot({ marks: [ - Plot.dot(data, {x: "culmen_depth_mm", y: "culmen_length_mm", fill: "currentColor", r: 1.5}), - Plot.voronoi(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "species"}) + Plot.dot(penguins, {x: "culmen_depth_mm", y: "culmen_length_mm", fill: "currentColor", r: 1.5}), + Plot.voronoi(penguins, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "species"}) ] }); } From 9495d672621028428bfe2c9e771acf08c82fff2e Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 19:06:13 -0700 Subject: [PATCH 09/21] DRY --- src/marks/delaunay.js | 37 ++++++++++++----------- src/marks/voronoi.js | 7 ++--- test/output/penguinCulmenDelaunay.svg | 2 +- test/output/penguinCulmenDelaunayMesh.svg | 2 +- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index 5fd7dffd39..c0f36b67e3 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -6,15 +6,15 @@ import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransfo import {markers, applyMarkers} from "./marker.js"; const linkDefaults = { - ariaLabel: "delaunay", + ariaLabel: "delaunay link", fill: "none", stroke: "currentColor", strokeMiterlimit: 1 }; const meshDefaults = { - ariaLabel: "delaunay", - fill: "none", + ariaLabel: "delaunay mesh", + fill: null, stroke: "currentColor", strokeOpacity: 0.1 }; @@ -111,18 +111,19 @@ export class DelaunayMesh extends Mark { defaults ); } - _render(index, {x: X, y: Y}) { - return Delaunay.from(index, i => X[i], i => Y[i]).render(); + _render(delaunay) { + return delaunay.render(); } - render(index, {x, y}, channels, dimensions) { + render(index, {x, y}, {x: X, y: Y}, dimensions) { const {dx, dy} = this; // TODO Group by z or stroke. + const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); return create("svg:g") .call(applyIndirectStyles, this, dimensions) .call(g => g.append("path") .call(applyDirectStyles, this) .call(applyTransform, x, y, offset + dx, offset + dy) - .attr("d", this._render(index, channels))) + .attr("d", this._render(delaunay))) .node(); } } @@ -131,22 +132,24 @@ export class Hull extends DelaunayMesh { constructor(data, options = {}) { super(data, options, hullDefaults); } - _render(index, {x: X, y: Y}) { - return Delaunay.from(index, i => X[i], i => Y[i]).renderHull(); + _render(delaunay) { + return delaunay.renderHull(); } } -export function delaunayLink(data, {x, y, ...options} = {}) { +export function delaunayMark(DelaunayMark, data, {x, y, ...options} = {}) { ([x, y] = maybeTuple(x, y)); - return new DelaunayLink(data, {...options, x, y}); + return new DelaunayMark(data, {...options, x, y}); } -export function delaunayMesh(data, {x, y, ...options} = {}) { - ([x, y] = maybeTuple(x, y)); - return new DelaunayMesh(data, {...options, x, y}); +export function delaunayLink(data, options) { + return delaunayMark(DelaunayLink, data, options); } -export function hull(data, {x, y, ...options} = {}) { - ([x, y] = maybeTuple(x, y)); - return new Hull(data, {...options, x, y}); +export function delaunayMesh(data, options) { + return delaunayMark(DelaunayMesh, data, options); +} + +export function hull(data, options) { + return delaunayMark(Hull, data, options); } diff --git a/src/marks/voronoi.js b/src/marks/voronoi.js index 0f1939d598..7b9bb413be 100644 --- a/src/marks/voronoi.js +++ b/src/marks/voronoi.js @@ -1,7 +1,7 @@ import {create, group, select, Delaunay} from "d3"; -import {maybeTuple} from "../options.js"; import {Mark} from "../plot.js"; import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; +import {delaunayMark} from "./delaunay.js"; const defaults = { ariaLabel: "voronoi", @@ -52,7 +52,6 @@ export class Voronoi extends Mark { } // TODO voronoiX, voronoiY? -export function voronoi(data, {x, y, ...options} = {}) { - ([x, y] = maybeTuple(x, y)); - return new Voronoi(data, {...options, x, y}); +export function voronoi(data, options) { + return delaunayMark(Voronoi, data, options); } diff --git a/test/output/penguinCulmenDelaunay.svg b/test/output/penguinCulmenDelaunay.svg index 80258366cb..0b5463d6f8 100644 --- a/test/output/penguinCulmenDelaunay.svg +++ b/test/output/penguinCulmenDelaunay.svg @@ -80,7 +80,7 @@ 21 culmen_depth_mm → - + diff --git a/test/output/penguinCulmenDelaunayMesh.svg b/test/output/penguinCulmenDelaunayMesh.svg index 6aafcd4c69..9eab3ffe25 100644 --- a/test/output/penguinCulmenDelaunayMesh.svg +++ b/test/output/penguinCulmenDelaunayMesh.svg @@ -80,7 +80,7 @@ 21 culmen_depth_mm → - + From 3e4a82e21530836d679a805ec6d012f7ce9cc806 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 7 Jun 2022 19:17:52 -0700 Subject: [PATCH 10/21] voronoiMesh --- src/index.js | 2 +- src/marks/delaunay.js | 5 ++-- src/marks/voronoi.js | 30 ++++++++++++++++++++--- test/output/penguinCulmenDelaunayMesh.svg | 2 +- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/index.js b/src/index.js index 47518b4f65..775b700251 100644 --- a/src/index.js +++ b/src/index.js @@ -17,7 +17,7 @@ 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 {voronoi} from "./marks/voronoi.js"; +export {voronoi, voronoiMesh} from "./marks/voronoi.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"; diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index c0f36b67e3..f233c3f4df 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -16,7 +16,7 @@ const meshDefaults = { ariaLabel: "delaunay mesh", fill: null, stroke: "currentColor", - strokeOpacity: 0.1 + strokeOpacity: 0.2 }; const hullDefaults = { @@ -110,6 +110,7 @@ export class DelaunayMesh extends Mark { options, defaults ); + this.fill = "none"; } _render(delaunay) { return delaunay.render(); @@ -123,7 +124,7 @@ export class DelaunayMesh extends Mark { .call(g => g.append("path") .call(applyDirectStyles, this) .call(applyTransform, x, y, offset + dx, offset + dy) - .attr("d", this._render(delaunay))) + .attr("d", this._render(delaunay, dimensions))) .node(); } } diff --git a/src/marks/voronoi.js b/src/marks/voronoi.js index 7b9bb413be..62454c14f4 100644 --- a/src/marks/voronoi.js +++ b/src/marks/voronoi.js @@ -1,7 +1,7 @@ import {create, group, select, Delaunay} from "d3"; import {Mark} from "../plot.js"; import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; -import {delaunayMark} from "./delaunay.js"; +import {delaunayMark, DelaunayMesh} from "./delaunay.js"; const defaults = { ariaLabel: "voronoi", @@ -9,6 +9,13 @@ const defaults = { stroke: "currentColor" }; +const meshDefaults = { + ariaLabel: "voronoi mesh", + fill: null, + stroke: "currentColor", + strokeOpacity: 0.2 +}; + export class Voronoi extends Mark { constructor(data, options = {}) { const {x, y, z} = options; @@ -24,13 +31,12 @@ export class Voronoi extends Mark { ); } render(index, {x, y}, channels, dimensions) { - const {width, height, marginTop, marginRight, marginBottom, marginLeft} = dimensions; const {x: X, y: Y, z: Z} = channels; const {dx, dy} = this; function cells(index) { const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); - const voronoi = delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); + const voronoi = voronoiof(delaunay, dimensions); select(this) .selectAll() .data(index) @@ -51,7 +57,25 @@ export class Voronoi extends Mark { } } +function voronoiof(delaunay, dimensions) { + const {width, height, marginTop, marginRight, marginBottom, marginLeft} = dimensions; + return delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); +} + +export class VoronoiMesh extends DelaunayMesh { + constructor(data, options) { + super(data, options, meshDefaults); + } + _render(delaunay, dimensions) { + return voronoiof(delaunay, dimensions).render(); + } +} + // TODO voronoiX, voronoiY? export function voronoi(data, options) { return delaunayMark(Voronoi, data, options); } + +export function voronoiMesh(data, options) { + return delaunayMark(VoronoiMesh, data, options); +} diff --git a/test/output/penguinCulmenDelaunayMesh.svg b/test/output/penguinCulmenDelaunayMesh.svg index 9eab3ffe25..434e9f27a3 100644 --- a/test/output/penguinCulmenDelaunayMesh.svg +++ b/test/output/penguinCulmenDelaunayMesh.svg @@ -80,7 +80,7 @@ 21 culmen_depth_mm → - + From 7f90fc8f1ea81bb1b8f242fc0a92ee778084ffe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Wed, 8 Jun 2022 20:04:14 +0200 Subject: [PATCH 11/21] delaunay updates: (#925) * delaunay updates: - group by z or stroke for delaunayLink - group by z or stroke for delaunayMesh * a few fixes * no group by stroke for delaunayLink Co-authored-by: Mike Bostock --- src/marks/delaunay.js | 131 ++++++++++-------- test/output/penguinCulmenDelaunay.svg | 3 - test/output/penguinCulmenDelaunayMesh.svg | 4 +- test/output/penguinCulmenDelaunaySpecies.svg | 105 ++++++++++++++ test/plots/index.js | 1 + test/plots/penguin-culmen-delaunay-species.js | 12 ++ test/plots/penguin-culmen-delaunay.js | 3 +- 7 files changed, 195 insertions(+), 64 deletions(-) create mode 100644 test/output/penguinCulmenDelaunaySpecies.svg create mode 100644 test/plots/penguin-culmen-delaunay-species.js diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index f233c3f4df..3af87639db 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -1,6 +1,6 @@ -import {create, path, Delaunay} from "d3"; +import {create, group, path, select, Delaunay} from "d3"; import {Curve} from "../curve.js"; -import {maybeTuple} from "../options.js"; +import {maybeTuple, maybeZ} from "../options.js"; import {Mark} from "../plot.js"; import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; import {markers, applyMarkers} from "./marker.js"; @@ -28,12 +28,13 @@ const hullDefaults = { export class DelaunayLink extends Mark { constructor(data, options = {}) { - const {x, y, curve, tension} = options; + const {x, y, z, curve, tension} = options; super( data, [ {name: "x", value: x, scale: "x"}, - {name: "y", value: y, scale: "y"} + {name: "y", value: y, scale: "y"}, + {name: "z", value: z, optional: true} ], options, linkDefaults @@ -42,70 +43,77 @@ export class DelaunayLink extends Mark { markers(this, options); } render(index, {x, y}, channels, dimensions) { - const {x: X, y: Y} = channels; + const {x: X, y: Y, z: Z} = channels; const {dx, dy, curve} = this; - let i = -1; - const newIndex = []; - const newChannels = {}; - for (const k in channels) newChannels[k] = []; + const mark = this; - function link(ti, tj) { - ti = index[ti]; - tj = index[tj]; - newIndex.push(++i); - X1[i] = X[ti]; - Y1[i] = Y[ti]; - X2[i] = X[tj]; - Y2[i] = Y[tj]; - for (const k in channels) newChannels[k].push(channels[k][tj]); - } + function links(index) { + let i = -1; + const newIndex = []; + const newChannels = {}; + for (const k in channels) newChannels[k] = []; + const X1 = []; + const X2 = []; + const Y1 = []; + const Y2 = []; - // TODO Group by z or stroke. - const {halfedges, hull, triangles} = Delaunay.from(index, i => X[i], i => Y[i]); - const m = (halfedges.length >> 1) + hull.length; - const X1 = new Float64Array(m); - const X2 = new Float64Array(m); - const Y1 = new Float64Array(m); - const Y2 = new Float64Array(m); - for (let i = 0; i < halfedges.length; ++i) { // inner edges - const j = halfedges[i]; - if (j > i) link(triangles[i], triangles[j]); - } - for (let i = 0; i < hull.length; ++i) { // convex hull - link(hull[i], hull[(i + 1) % hull.length]); + function link(ti, tj) { + ti = index[ti]; + tj = index[tj]; + newIndex.push(++i); + X1[i] = X[ti]; + Y1[i] = Y[ti]; + X2[i] = X[tj]; + Y2[i] = Y[tj]; + for (const k in channels) newChannels[k].push(channels[k][tj]); + } + + const {halfedges, hull, triangles} = Delaunay.from(index, i => X[i], i => Y[i]); + for (let i = 0; i < halfedges.length; ++i) { // inner edges + const j = halfedges[i]; + if (j > i) link(triangles[i], triangles[j]); + } + for (let i = 0; i < hull.length; ++i) { // convex hull + link(hull[i], hull[(i + 1) % hull.length]); + } + + select(this) + .selectAll() + .data(newIndex) + .join("path") + .call(applyDirectStyles, mark) + .attr("d", i => { + const p = path(); + const c = curve(p); + c.lineStart(); + c.point(X1[i], Y1[i]); + c.point(X2[i], Y2[i]); + c.lineEnd(); + return p; + }) + .call(applyChannelStyles, mark, newChannels) + .call(applyMarkers, mark, newChannels); } return create("svg:g") .call(applyIndirectStyles, this, dimensions) .call(applyTransform, x, y, offset + dx, offset + dy) - .call(g => g.selectAll() - .data(newIndex) - .enter() - .append("path") - .call(applyDirectStyles, this) - .attr("d", (_, i) => { - const p = path(); - const c = curve(p); - c.lineStart(); - c.point(X1[i], Y1[i]); - c.point(X2[i], Y2[i]); - c.lineEnd(); - return p; - }) - .call(applyChannelStyles, this, newChannels) - .call(applyMarkers, this, newChannels)) + .call(Z + ? g => g.selectAll().data(group(index, i => Z[i]).values()).enter().append("g").each(links) + : g => g.datum(index).each(links)) .node(); } } export class DelaunayMesh extends Mark { constructor(data, options = {}, defaults = meshDefaults) { - const {x, y} = options; + const {x, y, z, stroke} = options; super( data, [ {name: "x", value: x, scale: "x"}, - {name: "y", value: y, scale: "y"} + {name: "y", value: y, scale: "y"}, + {name: "z", value: maybeZ({z, stroke}), optional: true} ], options, defaults @@ -115,16 +123,25 @@ export class DelaunayMesh extends Mark { _render(delaunay) { return delaunay.render(); } - render(index, {x, y}, {x: X, y: Y}, dimensions) { + render(index, {x, y}, {x: X, y: Y, z: Z, ...channels}, dimensions) { const {dx, dy} = this; - // TODO Group by z or stroke. - const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); + const mark = this; + function mesh(render) { + return function(index) { + const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); + select(this).append("path") + .datum(index[0]) + .call(applyDirectStyles, mark) + .attr("d", render(delaunay, dimensions)) + .call(applyChannelStyles, mark, channels); + }; + } return create("svg:g") .call(applyIndirectStyles, this, dimensions) - .call(g => g.append("path") - .call(applyDirectStyles, this) - .call(applyTransform, x, y, offset + dx, offset + dy) - .attr("d", this._render(delaunay, dimensions))) + .call(applyTransform, x, y, offset + dx, offset + dy) + .call(Z + ? g => g.selectAll().data(group(index, i => Z[i]).values()).enter().append("g").each(mesh(this._render)) + : g => g.datum(index).each(mesh(this._render))) .node(); } } diff --git a/test/output/penguinCulmenDelaunay.svg b/test/output/penguinCulmenDelaunay.svg index 0b5463d6f8..cd7b5bd723 100644 --- a/test/output/penguinCulmenDelaunay.svg +++ b/test/output/penguinCulmenDelaunay.svg @@ -1083,7 +1083,4 @@ - - - \ No newline at end of file diff --git a/test/output/penguinCulmenDelaunayMesh.svg b/test/output/penguinCulmenDelaunayMesh.svg index 434e9f27a3..5386cc79cd 100644 --- a/test/output/penguinCulmenDelaunayMesh.svg +++ b/test/output/penguinCulmenDelaunayMesh.svg @@ -80,8 +80,8 @@ 21 culmen_depth_mm → - - + + diff --git a/test/output/penguinCulmenDelaunaySpecies.svg b/test/output/penguinCulmenDelaunaySpecies.svg new file mode 100644 index 0000000000..95cc67db33 --- /dev/null +++ b/test/output/penguinCulmenDelaunaySpecies.svg @@ -0,0 +1,105 @@ + + + + + 34 + + + 36 + + + 38 + + + 40 + + + 42 + + + 44 + + + 46 + + + 48 + + + 50 + + + 52 + + + 54 + + + 56 + + + 58 + ↑ culmen_length_mm + + + + 14 + + + 15 + + + 16 + + + 17 + + + 18 + + + 19 + + + 20 + + + 21 + culmen_depth_mm → + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/plots/index.js b/test/plots/index.js index 8d9548980d..c0665b8749 100644 --- a/test/plots/index.js +++ b/test/plots/index.js @@ -124,6 +124,7 @@ export {default as penguinCulmen} from "./penguin-culmen.js"; export {default as penguinCulmenArray} from "./penguin-culmen-array.js"; export {default as penguinCulmenDelaunay} from "./penguin-culmen-delaunay.js"; export {default as penguinCulmenDelaunayMesh} from "./penguin-culmen-delaunay-mesh.js"; +export {default as penguinCulmenDelaunaySpecies} from "./penguin-culmen-delaunay-species.js"; export {default as penguinCulmenVoronoi} from "./penguin-culmen-voronoi.js"; export {default as penguinDodge} from "./penguin-dodge.js"; export {default as penguinDodgeHexbin} from "./penguin-dodge-hexbin.js"; diff --git a/test/plots/penguin-culmen-delaunay-species.js b/test/plots/penguin-culmen-delaunay-species.js new file mode 100644 index 0000000000..c5a08e19dc --- /dev/null +++ b/test/plots/penguin-culmen-delaunay-species.js @@ -0,0 +1,12 @@ +import * as Plot from "@observablehq/plot"; +import * as d3 from "d3"; + +export default async function() { + const data = await d3.csv("data/penguins.csv", d3.autoType); + return Plot.plot({ + marks: [ + Plot.delaunayMesh(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "species", strokeOpacity: 1}), + Plot.hull(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "species", strokeWidth: 3}) + ] + }); +} diff --git a/test/plots/penguin-culmen-delaunay.js b/test/plots/penguin-culmen-delaunay.js index 7c6f0f5e1b..beb612db25 100644 --- a/test/plots/penguin-culmen-delaunay.js +++ b/test/plots/penguin-culmen-delaunay.js @@ -5,8 +5,7 @@ export default async function() { const data = await d3.csv("data/penguins.csv", d3.autoType); return Plot.plot({ marks: [ - Plot.delaunayLink(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "culmen_length_mm"}), - Plot.hull(data, {x: "culmen_depth_mm", y: "culmen_length_mm"}) + Plot.delaunayLink(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "culmen_length_mm"}) ] }); } From 1562d2f8860ce1f7e45d31f36051f0fb1b9ca471 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 8 Jun 2022 15:31:53 -0700 Subject: [PATCH 12/21] Update README --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index cb65820f43..9238a7b204 100644 --- a/README.md +++ b/README.md @@ -982,6 +982,30 @@ Plot.cellY(simpsons.map(d => d.imdb_rating)) Equivalent to [Plot.cell](#plotcelldata-options), except that if the **y** option is not specified, it defaults to [0, 1, 2, …], and if the **fill** option is not specified and **stroke** is not a channel, the fill defaults to the identity function and assumes that *data* = [*y₀*, *y₁*, *y₂*, …]. +### Delaunay + +Plot provides a handful of marks for Delaunay and Voronoi diagrams (using [d3-delaunay](https://github.com/d3/d3-delaunay) and [Delaunator](https://github.com/mapbox/delaunator)). These marks require the **x** and **y** channels to be specified. + +#### Plot.delaunayLink(*data*, *options*) + +[Source](./src/marks/delaunay.js) · Draws links for each edge of the Delaunay triangulation of the points given by the **x** and **y** channels. + +#### Plot.delaunayMesh(*data*, *options*) + +[Source](./src/marks/delaunay.js) · Draws a mesh of the Delaunay triangulation of the points given by the **x** and **y** channels. + +#### Plot.hull(*data*, *options*) + +[Source](./src/marks/delaunay.js) · Draws a convex hull around the points given by the **x** and **y** channels. + +#### Plot.voronoi(*data*, *options*) + +[Source](./src/marks/voronoi.js) · Draws polygons for each cell of the Voronoi tesselation of the points given by the **x** and **y** channels. + +#### Plot.voronoiMesh(*data*, *options*) + +[Source](./src/marks/voronoi.js) · Draws a mesh for the cell boundaries of the Voronoi tesselation of the points given by the **x** and **y** channels. + ### Dot [a scatterplot](https://observablehq.com/@observablehq/plot-dot) From 2789a1540a5cda8091b117d3ea887b53cf937e3e Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 8 Jun 2022 16:21:49 -0700 Subject: [PATCH 13/21] merge voronoi into delaunay --- README.md | 12 +-- src/index.js | 3 +- src/marks/delaunay.js | 95 ++++++++++++++++++-- src/marks/voronoi.js | 81 ----------------- test/output/penguinCulmenDelaunaySpecies.svg | 2 +- test/output/penguinCulmenVoronoi.svg | 2 +- 6 files changed, 96 insertions(+), 99 deletions(-) delete mode 100644 src/marks/voronoi.js diff --git a/README.md b/README.md index 9238a7b204..f50e70e159 100644 --- a/README.md +++ b/README.md @@ -984,27 +984,27 @@ Equivalent to [Plot.cell](#plotcelldata-options), except that if the **y** optio ### Delaunay -Plot provides a handful of marks for Delaunay and Voronoi diagrams (using [d3-delaunay](https://github.com/d3/d3-delaunay) and [Delaunator](https://github.com/mapbox/delaunator)). These marks require the **x** and **y** channels to be specified. +[Source](./src/marks/delaunay.js) · Plot provides a handful of marks for Delaunay and Voronoi diagrams (using [d3-delaunay](https://github.com/d3/d3-delaunay) and [Delaunator](https://github.com/mapbox/delaunator)). These marks require the **x** and **y** channels to be specified. #### Plot.delaunayLink(*data*, *options*) -[Source](./src/marks/delaunay.js) · Draws links for each edge of the Delaunay triangulation of the points given by the **x** and **y** channels. +Draws links for each edge of the Delaunay triangulation of the points given by the **x** and **y** channels. #### Plot.delaunayMesh(*data*, *options*) -[Source](./src/marks/delaunay.js) · Draws a mesh of the Delaunay triangulation of the points given by the **x** and **y** channels. +Draws a mesh of the Delaunay triangulation of the points given by the **x** and **y** channels. #### Plot.hull(*data*, *options*) -[Source](./src/marks/delaunay.js) · Draws a convex hull around the points given by the **x** and **y** channels. +Draws a convex hull around the points given by the **x** and **y** channels. #### Plot.voronoi(*data*, *options*) -[Source](./src/marks/voronoi.js) · Draws polygons for each cell of the Voronoi tesselation of the points given by the **x** and **y** channels. +Draws polygons for each cell of the Voronoi tesselation of the points given by the **x** and **y** channels. #### Plot.voronoiMesh(*data*, *options*) -[Source](./src/marks/voronoi.js) · Draws a mesh for the cell boundaries of the Voronoi tesselation of the points given by the **x** and **y** channels. +Draws a mesh for the cell boundaries of the Voronoi tesselation of the points given by the **x** and **y** channels. ### Dot diff --git a/src/index.js b/src/index.js index 775b700251..21315476bb 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ export {Arrow, arrow} from "./marks/arrow.js"; export {BarX, BarY, barX, barY} from "./marks/bar.js"; export {boxX, boxY} from "./marks/box.js"; export {Cell, cell, cellX, cellY} from "./marks/cell.js"; -export {delaunayLink, delaunayMesh, hull} from "./marks/delaunay.js"; +export {delaunayLink, delaunayMesh, hull, voronoi, voronoiMesh} from "./marks/delaunay.js"; export {Dot, dot, dotX, dotY, circle, hexagon} from "./marks/dot.js"; export {Frame, frame} from "./marks/frame.js"; export {Hexgrid, hexgrid} from "./marks/hexgrid.js"; @@ -17,7 +17,6 @@ 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 {voronoi, voronoiMesh} from "./marks/voronoi.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"; diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index 3af87639db..d507c7ab49 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -5,14 +5,14 @@ import {Mark} from "../plot.js"; import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; import {markers, applyMarkers} from "./marker.js"; -const linkDefaults = { +const delaunayLinkDefaults = { ariaLabel: "delaunay link", fill: "none", stroke: "currentColor", strokeMiterlimit: 1 }; -const meshDefaults = { +const delaunayMeshDefaults = { ariaLabel: "delaunay mesh", fill: null, stroke: "currentColor", @@ -23,10 +23,25 @@ const hullDefaults = { ariaLabel: "hull", fill: "none", stroke: "currentColor", - strokeWidth: 1.5 + strokeWidth: 1.5, + strokeMiterlimit: 1 +}; + +const voronoiDefaults = { + ariaLabel: "voronoi", + fill: "none", + stroke: "currentColor", + strokeMiterlimit: 1 }; -export class DelaunayLink extends Mark { +const voronoiMeshDefaults = { + ariaLabel: "voronoi mesh", + fill: null, + stroke: "currentColor", + strokeOpacity: 0.2 +}; + +class DelaunayLink extends Mark { constructor(data, options = {}) { const {x, y, z, curve, tension} = options; super( @@ -37,7 +52,7 @@ export class DelaunayLink extends Mark { {name: "z", value: z, optional: true} ], options, - linkDefaults + delaunayLinkDefaults ); this.curve = Curve(curve, tension); markers(this, options); @@ -105,8 +120,8 @@ export class DelaunayLink extends Mark { } } -export class DelaunayMesh extends Mark { - constructor(data, options = {}, defaults = meshDefaults) { +class DelaunayMesh extends Mark { + constructor(data, options = {}, defaults = delaunayMeshDefaults) { const {x, y, z, stroke} = options; super( data, @@ -146,7 +161,7 @@ export class DelaunayMesh extends Mark { } } -export class Hull extends DelaunayMesh { +class Hull extends DelaunayMesh { constructor(data, options = {}) { super(data, options, hullDefaults); } @@ -155,6 +170,61 @@ export class Hull extends DelaunayMesh { } } +class Voronoi extends Mark { + constructor(data, options = {}) { + const {x, y, z} = options; + super( + data, + [ + {name: "x", value: x, scale: "x"}, + {name: "y", value: y, scale: "y"}, + {name: "z", value: z, optional: true} + ], + options, + voronoiDefaults + ); + } + render(index, {x, y}, channels, dimensions) { + const {x: X, y: Y, z: Z} = channels; + const {dx, dy} = this; + + function cells(index) { + const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); + const voronoi = voronoiof(delaunay, dimensions); + select(this) + .selectAll() + .data(index) + .enter() + .append("path") + .call(applyDirectStyles, this) + .attr("d", (_, i) => voronoi.renderCell(i)) + .call(applyChannelStyles, this, channels); + } + + return create("svg:g") + .call(applyIndirectStyles, this, dimensions) + .call(applyTransform, x, y, offset + dx, offset + dy) + .call(Z + ? g => g.selectAll().data(group(index, i => Z[i]).values()).enter().append("g").each(cells) + : g => g.datum(index).each(cells)) + .node(); + } +} + +function voronoiof(delaunay, dimensions) { + const {width, height, marginTop, marginRight, marginBottom, marginLeft} = dimensions; + return delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); +} + +class VoronoiMesh extends DelaunayMesh { + constructor(data, options) { + super(data, options, voronoiMeshDefaults); + } + _render(delaunay, dimensions) { + return voronoiof(delaunay, dimensions).render(); + } +} + export function delaunayMark(DelaunayMark, data, {x, y, ...options} = {}) { ([x, y] = maybeTuple(x, y)); return new DelaunayMark(data, {...options, x, y}); @@ -171,3 +241,12 @@ export function delaunayMesh(data, options) { export function hull(data, options) { return delaunayMark(Hull, data, options); } + +// TODO voronoiX, voronoiY? +export function voronoi(data, options) { + return delaunayMark(Voronoi, data, options); +} + +export function voronoiMesh(data, options) { + return delaunayMark(VoronoiMesh, data, options); +} diff --git a/src/marks/voronoi.js b/src/marks/voronoi.js deleted file mode 100644 index 62454c14f4..0000000000 --- a/src/marks/voronoi.js +++ /dev/null @@ -1,81 +0,0 @@ -import {create, group, select, Delaunay} from "d3"; -import {Mark} from "../plot.js"; -import {applyChannelStyles, applyDirectStyles, applyIndirectStyles, applyTransform, offset} from "../style.js"; -import {delaunayMark, DelaunayMesh} from "./delaunay.js"; - -const defaults = { - ariaLabel: "voronoi", - fill: "none", - stroke: "currentColor" -}; - -const meshDefaults = { - ariaLabel: "voronoi mesh", - fill: null, - stroke: "currentColor", - strokeOpacity: 0.2 -}; - -export class Voronoi extends Mark { - constructor(data, options = {}) { - const {x, y, z} = options; - super( - data, - [ - {name: "x", value: x, scale: "x"}, - {name: "y", value: y, scale: "y"}, - {name: "z", value: z, optional: true} - ], - options, - defaults - ); - } - render(index, {x, y}, channels, dimensions) { - const {x: X, y: Y, z: Z} = channels; - const {dx, dy} = this; - - function cells(index) { - const delaunay = Delaunay.from(index, i => X[i], i => Y[i]); - const voronoi = voronoiof(delaunay, dimensions); - select(this) - .selectAll() - .data(index) - .enter() - .append("path") - .call(applyDirectStyles, this) - .attr("d", (_, i) => voronoi.renderCell(i)) - .call(applyChannelStyles, this, channels); - } - - return create("svg:g") - .call(applyIndirectStyles, this, dimensions) - .call(applyTransform, x, y, offset + dx, offset + dy) - .call(Z - ? g => g.selectAll().data(group(index, i => Z[i]).values()).enter().append("g").each(cells) - : g => g.datum(index).each(cells)) - .node(); - } -} - -function voronoiof(delaunay, dimensions) { - const {width, height, marginTop, marginRight, marginBottom, marginLeft} = dimensions; - return delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); -} - -export class VoronoiMesh extends DelaunayMesh { - constructor(data, options) { - super(data, options, meshDefaults); - } - _render(delaunay, dimensions) { - return voronoiof(delaunay, dimensions).render(); - } -} - -// TODO voronoiX, voronoiY? -export function voronoi(data, options) { - return delaunayMark(Voronoi, data, options); -} - -export function voronoiMesh(data, options) { - return delaunayMark(VoronoiMesh, data, options); -} diff --git a/test/output/penguinCulmenDelaunaySpecies.svg b/test/output/penguinCulmenDelaunaySpecies.svg index 95cc67db33..5677e8ed9e 100644 --- a/test/output/penguinCulmenDelaunaySpecies.svg +++ b/test/output/penguinCulmenDelaunaySpecies.svg @@ -91,7 +91,7 @@ - + diff --git a/test/output/penguinCulmenVoronoi.svg b/test/output/penguinCulmenVoronoi.svg index 1a79170f48..7c9cd5a4a7 100644 --- a/test/output/penguinCulmenVoronoi.svg +++ b/test/output/penguinCulmenVoronoi.svg @@ -424,7 +424,7 @@ - + From 0007c0fb718daf601e01ef5bfd94521aef968527 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 8 Jun 2022 16:22:55 -0700 Subject: [PATCH 14/21] remove unused export --- src/marks/delaunay.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index d507c7ab49..b6f3ddb695 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -211,11 +211,6 @@ class Voronoi extends Mark { } } -function voronoiof(delaunay, dimensions) { - const {width, height, marginTop, marginRight, marginBottom, marginLeft} = dimensions; - return delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); -} - class VoronoiMesh extends DelaunayMesh { constructor(data, options) { super(data, options, voronoiMeshDefaults); @@ -225,7 +220,12 @@ class VoronoiMesh extends DelaunayMesh { } } -export function delaunayMark(DelaunayMark, data, {x, y, ...options} = {}) { +function voronoiof(delaunay, dimensions) { + const {width, height, marginTop, marginRight, marginBottom, marginLeft} = dimensions; + return delaunay.voronoi([marginLeft, marginTop, width - marginRight, height - marginBottom]); +} + +function delaunayMark(DelaunayMark, data, {x, y, ...options} = {}) { ([x, y] = maybeTuple(x, y)); return new DelaunayMark(data, {...options, x, y}); } @@ -242,7 +242,6 @@ export function hull(data, options) { return delaunayMark(Hull, data, options); } -// TODO voronoiX, voronoiY? export function voronoi(data, options) { return delaunayMark(Voronoi, data, options); } From 67bfac43f7f70078577a08afc811f36b84a41c4d Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 8 Jun 2022 16:30:33 -0700 Subject: [PATCH 15/21] fix hull fill --- README.md | 2 +- src/marks/delaunay.js | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index f50e70e159..5295eb1e80 100644 --- a/README.md +++ b/README.md @@ -984,7 +984,7 @@ Equivalent to [Plot.cell](#plotcelldata-options), except that if the **y** optio ### Delaunay -[Source](./src/marks/delaunay.js) · Plot provides a handful of marks for Delaunay and Voronoi diagrams (using [d3-delaunay](https://github.com/d3/d3-delaunay) and [Delaunator](https://github.com/mapbox/delaunator)). These marks require the **x** and **y** channels to be specified. +[Source](./src/marks/delaunay.js) · [Examples](https://observablehq.com/@observablehq/plot-delaunay) · Plot provides a handful of marks for Delaunay and Voronoi diagrams (using [d3-delaunay](https://github.com/d3/d3-delaunay) and [Delaunator](https://github.com/mapbox/delaunator)). These marks require the **x** and **y** channels to be specified. #### Plot.delaunayLink(*data*, *options*) diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index b6f3ddb695..28b8f55e48 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -120,8 +120,8 @@ class DelaunayLink extends Mark { } } -class DelaunayMesh extends Mark { - constructor(data, options = {}, defaults = delaunayMeshDefaults) { +class AbstractDelaunayMark extends Mark { + constructor(data, options = {}, defaults) { const {x, y, z, stroke} = options; super( data, @@ -133,10 +133,7 @@ class DelaunayMesh extends Mark { options, defaults ); - this.fill = "none"; - } - _render(delaunay) { - return delaunay.render(); + if (defaults.fill === null) this.fill = "none"; } render(index, {x, y}, {x: X, y: Y, z: Z, ...channels}, dimensions) { const {dx, dy} = this; @@ -161,7 +158,16 @@ class DelaunayMesh extends Mark { } } -class Hull extends DelaunayMesh { +class DelaunayMesh extends AbstractDelaunayMark { + constructor(data, options = {}) { + super(data, options, delaunayMeshDefaults); + } + _render(delaunay) { + return delaunay.render(); + } +} + +class Hull extends AbstractDelaunayMark { constructor(data, options = {}) { super(data, options, hullDefaults); } @@ -211,7 +217,7 @@ class Voronoi extends Mark { } } -class VoronoiMesh extends DelaunayMesh { +class VoronoiMesh extends AbstractDelaunayMark { constructor(data, options) { super(data, options, voronoiMeshDefaults); } From 9bfbf89599cf6fa34197f6a966bf263680a8a45a Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 8 Jun 2022 16:36:38 -0700 Subject: [PATCH 16/21] fix hull group by fill --- src/marks/delaunay.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index 28b8f55e48..0977a93ba4 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -123,17 +123,18 @@ class DelaunayLink extends Mark { class AbstractDelaunayMark extends Mark { constructor(data, options = {}, defaults) { const {x, y, z, stroke} = options; + const nofill = defaults.fill === null; super( data, [ {name: "x", value: x, scale: "x"}, {name: "y", value: y, scale: "y"}, - {name: "z", value: maybeZ({z, stroke}), optional: true} + {name: "z", value: maybeZ(nofill ? {z, stroke} : options), optional: true} ], options, defaults ); - if (defaults.fill === null) this.fill = "none"; + if (nofill) this.fill = "none"; } render(index, {x, y}, {x: X, y: Y, z: Z, ...channels}, dimensions) { const {dx, dy} = this; From a009711bcec961704281fbb9469827429170a746 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 8 Jun 2022 16:53:49 -0700 Subject: [PATCH 17/21] Update README --- README.md | 20 ++++++++++++++++---- img/voronoi.png | Bin 0 -> 178543 bytes 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 img/voronoi.png diff --git a/README.md b/README.md index 5295eb1e80..b3961c7958 100644 --- a/README.md +++ b/README.md @@ -984,27 +984,39 @@ Equivalent to [Plot.cell](#plotcelldata-options), except that if the **y** optio ### Delaunay +[a Voronoi diagram of penguin culmens, showing the length and depth of several species](https://observablehq.com/@observablehq/plot-delaunay) + [Source](./src/marks/delaunay.js) · [Examples](https://observablehq.com/@observablehq/plot-delaunay) · Plot provides a handful of marks for Delaunay and Voronoi diagrams (using [d3-delaunay](https://github.com/d3/d3-delaunay) and [Delaunator](https://github.com/mapbox/delaunator)). These marks require the **x** and **y** channels to be specified. #### Plot.delaunayLink(*data*, *options*) -Draws links for each edge of the Delaunay triangulation of the points given by the **x** and **y** channels. +Draws links for each edge of the Delaunay triangulation of the points given by the **x** and **y** channels. Supports the same options as the [link mark](#link), except that **x1**, **y1**, **x2**, and **y2** are derived automatically from **x** and **y**. When an aesthetic channel is specified (such as **stroke** or **strokeWidth**), the link inherits the corresponding channel value from one of its two endpoints arbitrarily. + +If a **z** channel is specified, the input points are grouped by *z*, and separate Delaunay triangulations are constructed for each group. #### Plot.delaunayMesh(*data*, *options*) -Draws a mesh of the Delaunay triangulation of the points given by the **x** and **y** channels. +Draws a mesh of the Delaunay triangulation of the points given by the **x** and **y** channels. The **stroke** option defaults to _currentColor_, and the **strokeOpacity** defaults to 0.2. The **fill** option is not supported. When an aesthetic channel is specified (such as **stroke** or **strokeWidth**), the mesh inherits the corresponding channel value from one of its constituent points arbitrarily. + +If a **z** channel is specified, the input points are grouped by *z*, and separate Delaunay triangulations are constructed for each group. If the **z** channel is not specified, it defaults to the **stroke** channel, if any. #### Plot.hull(*data*, *options*) -Draws a convex hull around the points given by the **x** and **y** channels. +Draws a convex hull around the points given by the **x** and **y** channels. The **stroke** option defaults to _currentColor_ and the **fill** option defaults to _none_. When an aesthetic channel is specified (such as **stroke** or **strokeWidth**), the hull inherits the corresponding channel value from one of its constituent points arbitrarily. + +If a **z** channel is specified, the input points are grouped by *z*, and separate convex hulls are constructed for each group. If the **z** channel is not specified, it defaults to either the **fill** channel, if any, or the **stroke** channel, if any. #### Plot.voronoi(*data*, *options*) Draws polygons for each cell of the Voronoi tesselation of the points given by the **x** and **y** channels. +If a **z** channel is specified, the input points are grouped by *z*, and separate Voronoi tesselations are constructed for each group. + #### Plot.voronoiMesh(*data*, *options*) -Draws a mesh for the cell boundaries of the Voronoi tesselation of the points given by the **x** and **y** channels. +Draws a mesh for the cell boundaries of the Voronoi tesselation of the points given by the **x** and **y** channels. The **stroke** option defaults to _currentColor_, and the **strokeOpacity** defaults to 0.2. The **fill** option is not supported. When an aesthetic channel is specified (such as **stroke** or **strokeWidth**), the mesh inherits the corresponding channel value from one of its constituent points arbitrarily. + +If a **z** channel is specified, the input points are grouped by *z*, and separate Voronoi tesselations are constructed for each group. If the **z** channel is not specified, it defaults to the **stroke** channel, if any. ### Dot diff --git a/img/voronoi.png b/img/voronoi.png new file mode 100644 index 0000000000000000000000000000000000000000..90a8431a3f5f3d9d42da02c24a0352eed23e6857 GIT binary patch literal 178543 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

LNcsDpGz60Xi!qho3#i%K< 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 z%0A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 PClc~9%F-p0hW`HpQ7FJi literal 0 HcmV?d00001 From 046a6ee26d4f7166e51b03c4874b0530952cb09b Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 8 Jun 2022 16:59:38 -0700 Subject: [PATCH 18/21] no group by stroke for voronoiMesh --- README.md | 2 +- src/marks/delaunay.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b3961c7958..a00cca3bef 100644 --- a/README.md +++ b/README.md @@ -1016,7 +1016,7 @@ If a **z** channel is specified, the input points are grouped by *z*, and separa Draws a mesh for the cell boundaries of the Voronoi tesselation of the points given by the **x** and **y** channels. The **stroke** option defaults to _currentColor_, and the **strokeOpacity** defaults to 0.2. The **fill** option is not supported. When an aesthetic channel is specified (such as **stroke** or **strokeWidth**), the mesh inherits the corresponding channel value from one of its constituent points arbitrarily. -If a **z** channel is specified, the input points are grouped by *z*, and separate Voronoi tesselations are constructed for each group. If the **z** channel is not specified, it defaults to the **stroke** channel, if any. +If a **z** channel is specified, the input points are grouped by *z*, and separate Voronoi tesselations are constructed for each group. ### Dot diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index 0977a93ba4..49841cc44d 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -121,20 +121,18 @@ class DelaunayLink extends Mark { } class AbstractDelaunayMark extends Mark { - constructor(data, options = {}, defaults) { - const {x, y, z, stroke} = options; - const nofill = defaults.fill === null; + constructor(data, options = {}, defaults, zof) { + const {x, y} = options; super( data, [ {name: "x", value: x, scale: "x"}, {name: "y", value: y, scale: "y"}, - {name: "z", value: maybeZ(nofill ? {z, stroke} : options), optional: true} + {name: "z", value: zof(options), optional: true} ], options, defaults ); - if (nofill) this.fill = "none"; } render(index, {x, y}, {x: X, y: Y, z: Z, ...channels}, dimensions) { const {dx, dy} = this; @@ -161,7 +159,8 @@ class AbstractDelaunayMark extends Mark { class DelaunayMesh extends AbstractDelaunayMark { constructor(data, options = {}) { - super(data, options, delaunayMeshDefaults); + super(data, options, delaunayMeshDefaults, ({z, stroke}) => maybeZ({z, stroke})); + this.fill = "none"; } _render(delaunay) { return delaunay.render(); @@ -170,7 +169,7 @@ class DelaunayMesh extends AbstractDelaunayMark { class Hull extends AbstractDelaunayMark { constructor(data, options = {}) { - super(data, options, hullDefaults); + super(data, options, hullDefaults, maybeZ); } _render(delaunay) { return delaunay.renderHull(); @@ -220,7 +219,8 @@ class Voronoi extends Mark { class VoronoiMesh extends AbstractDelaunayMark { constructor(data, options) { - super(data, options, voronoiMeshDefaults); + super(data, options, voronoiMeshDefaults, ({z}) => z); + this.fill = "none"; } _render(delaunay, dimensions) { return voronoiof(delaunay, dimensions).render(); From f48742bab9eb0e1196132bed6a318e9f29c56090 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Wed, 8 Jun 2022 17:05:45 -0700 Subject: [PATCH 19/21] no group by stroke for delaunayMesh --- README.md | 2 +- src/marks/delaunay.js | 6 +++--- test/plots/penguin-culmen-delaunay-species.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a00cca3bef..b7890e6ee1 100644 --- a/README.md +++ b/README.md @@ -998,7 +998,7 @@ If a **z** channel is specified, the input points are grouped by *z*, and separa Draws a mesh of the Delaunay triangulation of the points given by the **x** and **y** channels. The **stroke** option defaults to _currentColor_, and the **strokeOpacity** defaults to 0.2. The **fill** option is not supported. When an aesthetic channel is specified (such as **stroke** or **strokeWidth**), the mesh inherits the corresponding channel value from one of its constituent points arbitrarily. -If a **z** channel is specified, the input points are grouped by *z*, and separate Delaunay triangulations are constructed for each group. If the **z** channel is not specified, it defaults to the **stroke** channel, if any. +If a **z** channel is specified, the input points are grouped by *z*, and separate Delaunay triangulations are constructed for each group. #### Plot.hull(*data*, *options*) diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index 49841cc44d..16d4d85287 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -121,7 +121,7 @@ class DelaunayLink extends Mark { } class AbstractDelaunayMark extends Mark { - constructor(data, options = {}, defaults, zof) { + constructor(data, options = {}, defaults, zof = ({z}) => z) { const {x, y} = options; super( data, @@ -159,7 +159,7 @@ class AbstractDelaunayMark extends Mark { class DelaunayMesh extends AbstractDelaunayMark { constructor(data, options = {}) { - super(data, options, delaunayMeshDefaults, ({z, stroke}) => maybeZ({z, stroke})); + super(data, options, delaunayMeshDefaults); this.fill = "none"; } _render(delaunay) { @@ -219,7 +219,7 @@ class Voronoi extends Mark { class VoronoiMesh extends AbstractDelaunayMark { constructor(data, options) { - super(data, options, voronoiMeshDefaults, ({z}) => z); + super(data, options, voronoiMeshDefaults); this.fill = "none"; } _render(delaunay, dimensions) { diff --git a/test/plots/penguin-culmen-delaunay-species.js b/test/plots/penguin-culmen-delaunay-species.js index c5a08e19dc..a3ad29e4e3 100644 --- a/test/plots/penguin-culmen-delaunay-species.js +++ b/test/plots/penguin-culmen-delaunay-species.js @@ -5,7 +5,7 @@ export default async function() { const data = await d3.csv("data/penguins.csv", d3.autoType); return Plot.plot({ marks: [ - Plot.delaunayMesh(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "species", strokeOpacity: 1}), + Plot.delaunayMesh(data, {x: "culmen_depth_mm", y: "culmen_length_mm", z: "species", stroke: "species", strokeOpacity: 1}), Plot.hull(data, {x: "culmen_depth_mm", y: "culmen_length_mm", stroke: "species", strokeWidth: 3}) ] }); From 71e18d6ee6d1a691a5b73b0b15559bb5c0dfbca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Thu, 9 Jun 2022 12:03:37 +0200 Subject: [PATCH 20/21] document pointerEvents --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b7890e6ee1..15bd682ec9 100644 --- a/README.md +++ b/README.md @@ -691,6 +691,7 @@ All marks support the following style options: * **target** - link target (e.g., “_blank” for a new window); for use with the **href** channel * **ariaDescription** - a textual description of the mark’s contents * **ariaHidden** - if true, hide this content from the accessibility tree +* **pointerEvents** - the [pointer events](https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events) (*e.g.*, *none*) * **clip** - if true, the mark is clipped to the frame’s dimensions For all marks except [text](#plottextdata-options), the **dx** and **dy** options are rendered as a transform property, possibly including a 0.5px offset on low-density screens. From 42b88f904249dab590aa62d15abcaa756101e900 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 9 Jun 2022 08:37:05 -0700 Subject: [PATCH 21/21] auto instead of visiblePainted --- src/style.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/style.js b/src/style.js index 3cc382aad1..4fc0804dff 100644 --- a/src/style.js +++ b/src/style.js @@ -122,7 +122,7 @@ export function styles( mark.opacity = impliedNumber(copacity, 1); mark.mixBlendMode = impliedString(mixBlendMode, "normal"); mark.paintOrder = impliedString(paintOrder, "normal"); - mark.pointerEvents = impliedString(pointerEvents, "visiblePainted"); + mark.pointerEvents = impliedString(pointerEvents, "auto"); mark.shapeRendering = impliedString(shapeRendering, "auto"); return [

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%0D;$eYw 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