From 70f23521a4deb48ab34726398e833b540d4b9580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Mon, 29 May 2023 14:35:07 +0200 Subject: [PATCH] facet reindexation to be handled separately (#1648) --- src/marks/delaunay.js | 27 +- test/output/penguinCulmenVoronoiExclude.svg | 1161 ------------------- test/plots/penguin-culmen-voronoi.ts | 25 - 3 files changed, 11 insertions(+), 1202 deletions(-) delete mode 100644 test/output/penguinCulmenVoronoiExclude.svg diff --git a/src/marks/delaunay.js b/src/marks/delaunay.js index b0392deee7..3e07113861 100644 --- a/src/marks/delaunay.js +++ b/src/marks/delaunay.js @@ -224,40 +224,35 @@ class Voronoi extends Mark { let {x: X, y: Y, z: Z} = channels; ({x: X, y: Y} = applyPosition(channels, scales, context)); Z = Z?.value; - const C = new Array(facets.length); + const C = new Array((X ?? Y).length).fill(null); const [cx, cy] = applyFrameAnchor(this, dimensions); const xi = X ? (i) => X[i] : constant(cx); const yi = Y ? (i) => Y[i] : constant(cy); - for (let [fi, facet] of facets.entries()) { - if (X) facet = facet.filter((i) => defined(X[i])); - if (Y) facet = facet.filter((i) => defined(Y[i])); - const Cf = (C[fi] = []); - for (const [, index] of maybeGroup(facet, Z)) { - const delaunay = Delaunay.from(index, xi, yi); + for (let I of facets) { + if (X) I = I.filter((i) => defined(xi(i))); + if (Y) I = I.filter((i) => defined(yi(i))); + for (const [, J] of maybeGroup(I, Z)) { + const delaunay = Delaunay.from(J, xi, yi); const voronoi = voronoiof(delaunay, dimensions); - for (let i = 0, n = index.length; i < n; ++i) { - Cf[index[i]] = voronoi.renderCell(i); + for (let i = 0, n = J.length; i < n; ++i) { + C[J[i]] = voronoi.renderCell(i); } } } - return {data, facets, channels: {cells: {value: C, filter: null}}}; + return {data, facets, channels: {cells: {value: C}}}; }), voronoiDefaults ); } render(index, scales, channels, dimensions, context) { const {x, y} = scales; - const { - x: X, - y: Y, - cells: {[index.fi ?? 0]: C} - } = channels; + const {x: X, y: Y, cells: C} = channels; return create("svg:g", context) .call(applyIndirectStyles, this, dimensions, context) .call(applyTransform, this, {x: X && x, y: Y && y}) .call((g) => { g.selectAll() - .data(index.filter((i) => C[i] != null)) + .data(index) .enter() .append("path") .call(applyDirectStyles, this) diff --git a/test/output/penguinCulmenVoronoiExclude.svg b/test/output/penguinCulmenVoronoiExclude.svg deleted file mode 100644 index b99195e84e..0000000000 --- a/test/output/penguinCulmenVoronoiExclude.svg +++ /dev/null @@ -1,1161 +0,0 @@ - - - - - Adelie - - - Chinstrap - - - Gentoo - - - - species - - - - - - - - - - - - - - - - - - - - - 34 - 36 - 38 - 40 - 42 - 44 - 46 - 48 - 50 - 52 - 54 - 56 - 58 - - - - ↑ culmen_length_mm - - - - - - - - - - - - - - - - - - 15 - 20 - - - 15 - 20 - - - 15 - 20 - - - - culmen_depth_mm → - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/test/plots/penguin-culmen-voronoi.ts b/test/plots/penguin-culmen-voronoi.ts index 4f3bd165a5..6c3d46e0b8 100644 --- a/test/plots/penguin-culmen-voronoi.ts +++ b/test/plots/penguin-culmen-voronoi.ts @@ -10,28 +10,3 @@ export async function penguinCulmenVoronoi() { ] }); } - -export async function penguinCulmenVoronoiExclude() { - const penguins = await d3.csv("data/penguins.csv", d3.autoType); - const xy = {fx: "species", x: "culmen_depth_mm", y: "culmen_length_mm"}; - return Plot.plot({ - inset: 10, - marks: [ - Plot.frame(), - Plot.dot(penguins, {...xy, facet: "exclude", fill: "currentColor", r: 1.5}), - Plot.dot(penguins, {...xy, facet: "include", fillOpacity: 0.25, fill: "currentColor", r: 1.5}), - Plot.voronoiMesh(penguins, {...xy, facet: "exclude"}), - Plot.voronoi( - penguins, - Plot.pointer({ - ...xy, - facet: "exclude", - stroke: "species", - fill: "species", - fillOpacity: 0.2, - maxRadius: Infinity - }) - ) - ] - }); -}