From c1a1cede43f79fcaa5cb21650e649c6ddda6552f Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Fri, 13 Jan 2023 13:45:57 -0800 Subject: [PATCH] treemap --- src/index.d.ts | 2 + src/index.js | 2 + src/marks/treemap.d.ts | 11 ++ src/marks/treemap.js | 10 ++ src/transforms/tree.js | 14 +- src/transforms/treemap.d.ts | 4 + src/transforms/treemap.js | 70 +++++++++ test/output/flareTreemap.svg | 290 ++++++++++++++++++++++++++++++++++ test/plots/flare-treemap.ts | 16 ++ test/plots/index.js | 292 +++++++++++++++++++++++++++++++++++ test/plots/index.ts | 1 + 11 files changed, 705 insertions(+), 7 deletions(-) create mode 100644 src/marks/treemap.d.ts create mode 100644 src/marks/treemap.js create mode 100644 src/transforms/treemap.d.ts create mode 100644 src/transforms/treemap.js create mode 100644 test/output/flareTreemap.svg create mode 100644 test/plots/flare-treemap.ts create mode 100644 test/plots/index.js diff --git a/src/index.d.ts b/src/index.d.ts index 19e9442a31..f43e01045c 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -35,6 +35,7 @@ export * from "./marks/text.js"; export * from "./marks/tick.js"; export * from "./marks/tip.js"; export * from "./marks/tree.js"; +export * from "./marks/treemap.js"; export * from "./marks/vector.js"; export * from "./options.js"; export * from "./plot.js"; @@ -53,4 +54,5 @@ export * from "./transforms/normalize.js"; export * from "./transforms/select.js"; export * from "./transforms/stack.js"; export * from "./transforms/tree.js"; +export * from "./transforms/treemap.js"; export * from "./transforms/window.js"; diff --git a/src/index.js b/src/index.js index fec7e243ec..4d92f303c4 100644 --- a/src/index.js +++ b/src/index.js @@ -27,6 +27,7 @@ export {Text, text, textX, textY} from "./marks/text.js"; export {TickX, TickY, tickX, tickY} from "./marks/tick.js"; export {Tip, tip} from "./marks/tip.js"; export {tree, cluster} from "./marks/tree.js"; +export {treemap} from "./marks/treemap.js"; export {Vector, vector, vectorX, vectorY, spike} from "./marks/vector.js"; export {valueof, column, identity, indexOf} from "./options.js"; export {filter, reverse, sort, shuffle, basic as transform, initializer} from "./transforms/basic.js"; @@ -41,6 +42,7 @@ export {window, windowX, windowY} from "./transforms/window.js"; export {select, selectFirst, selectLast, selectMaxX, selectMaxY, selectMinX, selectMinY} from "./transforms/select.js"; export {stackX, stackX1, stackX2, stackY, stackY1, stackY2} from "./transforms/stack.js"; export {treeNode, treeLink} from "./transforms/tree.js"; +export {treemapNode} from "./transforms/treemap.js"; export {pointer, pointerX, pointerY} from "./interactions/pointer.js"; export {formatIsoDate, formatWeekday, formatMonth} from "./format.js"; export {scale} from "./scales.js"; diff --git a/src/marks/treemap.d.ts b/src/marks/treemap.d.ts new file mode 100644 index 0000000000..b27630665b --- /dev/null +++ b/src/marks/treemap.d.ts @@ -0,0 +1,11 @@ +import {ChannelValue} from "../channel.js"; +import {Data} from "../mark.js"; +import {TreeTransformOptions} from "../transforms/tree.js"; +import {Rect, RectOptions} from "./rect.js"; + +// TODO tree channels, e.g., "node:name" | "node:path" | "node:internal"? +export interface TreemapOptions extends RectOptions, TreeTransformOptions { + value?: ChannelValue; +} + +export function treemap(data?: Data, options?: TreemapOptions): Rect; diff --git a/src/marks/treemap.js b/src/marks/treemap.js new file mode 100644 index 0000000000..d023f699a8 --- /dev/null +++ b/src/marks/treemap.js @@ -0,0 +1,10 @@ +import {treemapNode} from "../transforms/treemap.js"; +import {rect} from "./rect.js"; + +/** @jsdoc treemap */ +export function treemap( + data, + {inset = 0.5, insetTop = inset, insetRight = inset, insetBottom = inset, insetLeft = inset, ...options} = {} +) { + return rect(data, treemapNode({insetTop, insetRight, insetBottom, insetLeft, ...options})); +} diff --git a/src/transforms/tree.js b/src/transforms/tree.js index 44d42cf474..c8e39c87bf 100644 --- a/src/transforms/tree.js +++ b/src/transforms/tree.js @@ -150,7 +150,7 @@ const treeAnchorRight = { } }; -function maybeTreeSort(sort) { +export function maybeTreeSort(sort) { return sort == null || typeof sort === "function" ? sort : `${sort}`.trim().toLowerCase().startsWith("node:") @@ -166,7 +166,7 @@ function nodeData(field) { return (node) => node.data?.[field]; } -function normalizer(delimiter = "/") { +export function normalizer(delimiter = "/") { return `${delimiter}` === "/" ? (P) => P // paths are already slash-separated : (P) => P.map(replaceAll(delimiter, "/")); // TODO string.replaceAll when supported @@ -189,7 +189,7 @@ function isLinkValue(option) { return isObject(option) && typeof option.link === "function"; } -function maybeNodeValue(value) { +export function maybeNodeValue(value) { if (isNodeValue(value)) return value.node; value = `${value}`.trim().toLowerCase(); if (!value.startsWith("node:")) return; @@ -290,11 +290,11 @@ function slash(path, i) { // These indexes match the array returned by nodeOutputs. The first two elements // are always the name of the output and its column value definition so that // the outputs can be passed directly to Object.fromEntries. -const output_setValues = 2; -const output_evaluate = 3; -const output_values = 4; +export const output_setValues = 2; +export const output_evaluate = 3; +export const output_values = 4; -function treeOutputs(options, maybeTreeValue) { +export function treeOutputs(options, maybeTreeValue) { const outputs = []; for (const name in options) { const value = options[name]; diff --git a/src/transforms/treemap.d.ts b/src/transforms/treemap.d.ts new file mode 100644 index 0000000000..96b18d07b3 --- /dev/null +++ b/src/transforms/treemap.d.ts @@ -0,0 +1,4 @@ +import {Transformed} from "./basic.js"; +import {TreeTransformOptions} from "./tree.js"; + +export function treemapNode(options?: T & TreeTransformOptions): Transformed; diff --git a/src/transforms/treemap.js b/src/transforms/treemap.js new file mode 100644 index 0000000000..baeb3422cd --- /dev/null +++ b/src/transforms/treemap.js @@ -0,0 +1,70 @@ +import {stratify, treemap, treemapBinary} from "d3"; +import {column, identity, valueof} from "../options.js"; +import {basic} from "./basic.js"; +import {maybeNodeValue, maybeTreeSort, normalizer} from "./tree.js"; +import {output_evaluate, output_setValues, output_values, treeOutputs} from "./tree.js"; + +/** @jsdoc treeNode */ +export function treemapNode(options = {}) { + let { + path = identity, // the delimited path + delimiter, // how the path is separated + frameAnchor, + value, + treeTile = treemapBinary, + treeSort, + ...remainingOptions + } = options; + treeSort = maybeTreeSort(treeSort); + value = value == null ? null : maybeNodeValue(value) ?? asDataValue(value); + const normalize = normalizer(delimiter); + const outputs = treeOutputs(remainingOptions, maybeNodeValue); + const [X1, setX1] = column(); + const [Y1, setY1] = column(); + const [X2, setX2] = column(); + const [Y2, setY2] = column(); + return { + x1: X1, + y1: Y1, + x2: X2, + y2: Y2, + frameAnchor, + ...basic(remainingOptions, (data, facets) => { + const P = normalize(valueof(data, path)); + const X1 = setX1([]); + const Y1 = setY1([]); + const X2 = setX2([]); + const Y2 = setY2([]); + let treeIndex = -1; + const treeData = []; + const treeFacets = []; + const rootof = stratify().path((i) => P[i]); + const layout = treemap().tile(treeTile); + for (const o of outputs) o[output_values] = o[output_setValues]([]); + for (const facet of facets) { + const treeFacet = []; + const root = rootof(facet.filter((i) => P[i] != null)).each((node) => (node.data = data[node.data])); + if (value) root.sum(value); + else root.count(); + if (treeSort != null) root.sort(treeSort); + layout(root); + for (const node of root.leaves()) { + treeFacet.push(++treeIndex); + treeData[treeIndex] = node.data; + X1[treeIndex] = node.x0; + Y1[treeIndex] = node.y0; + X2[treeIndex] = node.x1; + Y2[treeIndex] = node.y1; + for (const o of outputs) o[output_values][treeIndex] = o[output_evaluate](node); + } + treeFacets.push(treeFacet); + } + return {data: treeData, facets: treeFacets}; + }), + ...Object.fromEntries(outputs) + }; +} + +function asDataValue(value) { + return typeof value === "function" ? value : (node) => node[value]; +} diff --git a/test/output/flareTreemap.svg b/test/output/flareTreemap.svg new file mode 100644 index 0000000000..806d411f51 --- /dev/null +++ b/test/output/flareTreemap.svg @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + 0.0 + 0.1 + 0.2 + 0.3 + 0.4 + 0.5 + 0.6 + 0.7 + 0.8 + 0.9 + 1.0 + + + + + + + + + + + + + + + + 0.0 + 0.1 + 0.2 + 0.3 + 0.4 + 0.5 + 0.6 + 0.7 + 0.8 + 0.9 + 1.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/plots/flare-treemap.ts b/test/plots/flare-treemap.ts new file mode 100644 index 0000000000..5a2e46c4b4 --- /dev/null +++ b/test/plots/flare-treemap.ts @@ -0,0 +1,16 @@ +import * as Plot from "@observablehq/plot"; +import * as d3 from "d3"; + +export async function flareTreemap() { + const flare = await d3.csv("data/flare.csv", d3.autoType); + return Plot.plot({ + marks: [ + Plot.treemap(flare, { + path: "name", + delimiter: ".", + value: "size", + fill: {node: (d) => d.ancestors().reverse()[1].id} as any // TODO + }) + ] + }); +} diff --git a/test/plots/index.js b/test/plots/index.js new file mode 100644 index 0000000000..50f67f4288 --- /dev/null +++ b/test/plots/index.js @@ -0,0 +1,292 @@ +export {default as aaplBollinger} from "./aapl-bollinger.js"; +export {default as aaplCandlestick} from "./aapl-candlestick.js"; +export {default as aaplChangeVolume} from "./aapl-change-volume.js"; +export {default as aaplClose} from "./aapl-close.js"; +export {default as aaplCloseUntyped} from "./aapl-close-untyped.js"; +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 armadillo} from "./armadillo.js"; +export {default as athletesBinsColors} from "./athletes-bins-colors.js"; +export {default as athletesBirthdays} from "./athletes-birthdays.js"; +export {default as athletesBoxingHeight} from "./athletes-boxing-height.js"; +export {default as athletesHeightWeight} from "./athletes-height-weight.js"; +export {default as athletesHeightWeightBin} from "./athletes-height-weight-bin.js"; +export {default as athletesHeightWeightBinStroke} from "./athletes-height-weight-bin-stroke.js"; +export {default as athletesHeightWeightSex} from "./athletes-height-weight-sex.js"; +export {default as athletesHeightWeightSport} from "./athletes-height-weight-sport.js"; +export {default as athletesNationality} from "./athletes-nationality.js"; +export {default as athletesSample} from "./athletes-sample.js"; +export {default as athletesSexWeight} from "./athletes-sex-weight.js"; +export {default as athletesSportSex} from "./athletes-sport-sex.js"; +export {default as athletesSportWeight} from "./athletes-sport-weight.js"; +export {default as athletesWeight} from "./athletes-weight.js"; +export {default as athletesWeightCumulative} from "./athletes-weight-cumulative.js"; +export {default as availability} from "./availability.js"; +export {default as ballotStatusRace} from "./ballot-status-race.js"; +export {default as bandClip, bandClip2} from "./band-clip.js"; +export {default as beagle} from "./beagle.js"; +export {default as beckerBarley} from "./becker-barley.js"; +export {default as binStrings} from "./bin-strings.js"; +export {default as binTimestamps} from "./bin-timestamps.js"; +export {default as boundingBoxes} from "./bounding-boxes.js"; +export {default as boxplot} from "./boxplot.js"; +export {default as caltrain} from "./caltrain.js"; +export {default as caltrainDirection} from "./caltrain-direction.js"; +export {default as carsDodge} from "./cars-dodge.js"; +export {default as carsHexbin} from "./cars-hexbin.js"; +export {default as carsJitter} from "./cars-jitter.js"; +export {default as carsMpg} from "./cars-mpg.js"; +export {default as carsParcoords} from "./cars-parcoords.js"; +export {default as clamp} from "./clamp.js"; +export {default as collapsedHistogram} from "./collapsed-histogram.js"; +export {default as countryCentroids} from "./country-centroids.js"; +export {default as covidIhmeProjectedDeaths} from "./covid-ihme-projected-deaths.js"; +export {default as crimeanWarArrow} from "./crimean-war-arrow.js"; +export {default as crimeanWarLine} from "./crimean-war-line.js"; +export {default as crimeanWarOverlapped} from "./crimean-war-overlapped.js"; +export {default as crimeanWarStacked} from "./crimean-war-stacked.js"; +export {default as d3Survey2015Comfort} from "./d3-survey-2015-comfort.js"; +export {default as d3Survey2015Why} from "./d3-survey-2015-why.js"; +export {default as darkerDodge} from "./darker-dodge.js"; +export {default as decathlon} from "./decathlon.js"; +export {default as diamondsBoxplot} from "./diamonds-boxplot.js"; +export {default as diamondsCaratPrice} from "./diamonds-carat-price.js"; +export {default as diamondsCaratPriceDots} from "./diamonds-carat-price-dots.js"; +export {default as diamondsCaratSampling} from "./diamonds-carat-sampling.js"; +export {default as documentationLinks} from "./documentation-links.js"; +export {default as dodgeRule} from "./dodge-rule.js"; +export {default as dodgeTextRadius} from "./dodge-text-radius.js"; +export {default as dodgeTick} from "./dodge-tick.js"; +export {default as dotSort} from "./dot-sort.js"; +export {default as downloads} from "./downloads.js"; +export {default as downloadsOrdinal} from "./downloads-ordinal.js"; +export {default as driving} from "./driving.js"; +export {default as empty} from "./empty.js"; +export {default as emptyLegend} from "./empty-legend.js"; +export {default as emptyX} from "./empty-x.js"; +export {default as energyProduction} from "./energy-production.js"; +export {default as faithfulDensity} from "./faithful-density.js"; +export {default as faithfulDensity1d} from "./faithful-density-1d.js"; +export {default as figcaption} from "./figcaption.js"; +export {default as figcaptionHtml} from "./figcaption-html.js"; +export {default as firstLadies} from "./first-ladies.js"; +export {default as flareCluster} from "./flare-cluster.js"; +export {default as flareIndent} from "./flare-indent.js"; +export {default as flareTree} from "./flare-tree.js"; +export {default as footballCoverage} from "./football-coverage.js"; +export {default as frameCorners} from "./frame-corners.js"; +export {default as fruitSales} from "./fruit-sales.js"; +export {default as fruitSalesDate} from "./fruit-sales-date.js"; +export {default as gistempAnomaly} from "./gistemp-anomaly.js"; +export {default as gistempAnomalyMoving} from "./gistemp-anomaly-moving.js"; +export {default as gistempAnomalyTransform} from "./gistemp-anomaly-transform.js"; +export {default as googleTrendsRidgeline} from "./google-trends-ridgeline.js"; +export {default as graticule} from "./graticule.js"; +export {default as greekGods} from "./greek-gods.js"; +export {default as gridChoropleth} from "./grid-choropleth.js"; +export {default as gridChoroplethDx} from "./grid-choropleth-dx.js"; +export {default as groupedRects} from "./grouped-rects.js"; +export {default as hadcrutWarmingStripes} from "./hadcrut-warming-stripes.js"; +export {default as hexbin} from "./hexbin.js"; +export {default as hexbinOranges} from "./hexbin-oranges.js"; +export {default as hexbinR} from "./hexbin-r.js"; +export {default as hexbinSymbol} from "./hexbin-symbol.js"; +export {default as hexbinText} from "./hexbin-text.js"; +export {default as hexbinZ} from "./hexbin-z.js"; +export {default as hexbinZNull} from "./hexbin-z-null.js"; +export {default as highCardinalityOrdinal} from "./high-cardinality-ordinal.js"; +export {default as hrefFill} from "./href-fill.js"; +export {default as identityScale} from "./identity-scale.js"; +export {default as integerInterval} from "./integer-interval.js"; +export {default as ibmTrading} from "./ibm-trading.js"; +export {default as industryUnemployment} from "./industry-unemployment.js"; +export {default as industryUnemploymentShare} from "./industry-unemployment-share.js"; +export {default as industryUnemploymentStream} from "./industry-unemployment-stream.js"; +export {default as industryUnemploymentTrack} from "./industry-unemployment-track.js"; +export {default as infinityLog} from "./infinity-log.js"; +export {default as intradayHistogram} from "./intraday-histogram.js"; +export {default as learningPoverty} from "./learning-poverty.js"; +export {default as letterFrequencyBar} from "./letter-frequency-bar.js"; +export {default as letterFrequencyCloud} from "./letter-frequency-cloud.js"; +export {default as letterFrequencyColumn} from "./letter-frequency-column.js"; +export {default as letterFrequencyDot} from "./letter-frequency-dot.js"; +export {default as letterFrequencyLollipop} from "./letter-frequency-lollipop.js"; +export {default as letterFrequencyWheel} from "./letter-frequency-wheel.js"; +export {default as linearRegressionCars} from "./linear-regression-cars.js"; +export {default as linearRegressionMtcars} from "./linear-regression-mtcars.js"; +export {default as linearRegressionPenguins} from "./linear-regression-penguins.js"; +export {default as likertSurvey} from "./likert-survey.js"; +export {default as logDegenerate} from "./log-degenerate.js"; +export {default as markovChain} from "./markov-chain.js"; +export {default as metroInequality} from "./metro-inequality.js"; +export {default as metroInequalityChange} from "./metro-inequality-change.js"; +export {default as metroUnemployment} from "./metro-unemployment.js"; +export {default as metroUnemploymentHighlight} from "./metro-unemployment-highlight.js"; +export {default as metroUnemploymentIndex} from "./metro-unemployment-index.js"; +export {default as metroUnemploymentMoving} from "./metro-unemployment-moving.js"; +export {default as metroUnemploymentNormalize} from "./metro-unemployment-normalize.js"; +export {default as metroUnemploymentRidgeline} from "./metro-unemployment-ridgeline.js"; +export {default as metroUnemploymentSlope} from "./metro-unemployment-slope.js"; +export {default as metroUnemploymentStroke} from "./metro-unemployment-stroke.js"; +export {default as mobyDick} from "./moby-dick.js"; +export {default as mobyDickFaceted} from "./moby-dick-faceted.js"; +export {default as mobyDickLetterFrequency} from "./moby-dick-letter-frequency.js"; +export {default as mobyDickLetterPairs} from "./moby-dick-letter-pairs.js"; +export {default as mobyDickLetterPosition} from "./moby-dick-letter-position.js"; +export {default as mobyDickLetterRelativeFrequency} from "./moby-dick-letter-relative-frequency.js"; +export {default as morleyBoxplot} from "./morley-boxplot.js"; +export {default as moviesProfitByGenre} from "./movies-profit-by-genre.js"; +export {default as moviesRatingByGenre} from "./movies-rating-by-genre.js"; +export {default as musicRevenue} from "./music-revenue.js"; +export {default as multiplicationTable} from "./multiplication-table.js"; +export {default as npmVersions} from "./npm-versions.js"; +export {default as ordinalBar} from "./ordinal-bar.js"; +export {default as penguinAnnotated} from "./penguin-annotated.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 penguinCulmenDelaunaySpecies} from "./penguin-culmen-delaunay-species.js"; +export {default as penguinCulmenMarkFacet} from "./penguin-culmen-mark-facet.js"; +export {default as penguinCulmenVoronoi} from "./penguin-culmen-voronoi.js"; +export {default as penguinVoronoi1D} from "./penguin-voronoi-1d.js"; +export {default as penguinDensity} from "./penguin-density.js"; +export {default as penguinDensityFill} from "./penguin-density-fill.js"; +export {default as penguinDensityZ} from "./penguin-density-z.js"; +export {default as penguinDodge} from "./penguin-dodge.js"; +export {default as penguinDodgeHexbin} from "./penguin-dodge-hexbin.js"; +export {default as penguinDodgeVoronoi} from "./penguin-dodge-voronoi.js"; +export {default as penguinFacetAnnotated} from "./penguins-facet-annotated.js"; +export {default as penguinFacetAnnotatedX} from "./penguins-facet-annotated-x.js"; +export {default as penguinFacetDodge} from "./penguin-facet-dodge.js"; +export {default as penguinFacetDodgeIdentity} from "./penguin-facet-dodge-identity.js"; +export {default as penguinFacetDodgeIsland} from "./penguin-facet-dodge-island.js"; +export {default as penguinFacetDodgeSymbol} from "./penguin-facet-dodge-symbol.js"; +export {default as penguinIslandUnknown} from "./penguin-island-unknown.js"; +export {default as penguinMass} from "./penguin-mass.js"; +export {default as penguinMassSex} from "./penguin-mass-sex.js"; +export {default as penguinMassSexSpecies} from "./penguin-mass-sex-species.js"; +export {default as penguinMassSpecies} from "./penguin-mass-species.js"; +export {default as penguinSex} from "./penguin-sex.js"; +export {default as penguinSexMassCulmenSpecies} from "./penguin-sex-mass-culmen-species.js"; +export {default as penguinSizeSymbols} from "./penguin-size-symbols.js"; +export {default as penguinSpeciesCheysson} from "./penguin-species-cheysson.js"; +export {default as penguinSpeciesGradient} from "./penguin-species-gradient.js"; +export {default as penguinSpeciesGroup} from "./penguin-species-group.js"; +export {default as penguinSpeciesIsland} from "./penguin-species-island.js"; +export {default as penguinSpeciesIslandRelative} from "./penguin-species-island-relative.js"; +export {default as penguinSpeciesIslandSex} from "./penguin-species-island-sex.js"; +export {default as polylinear} from "./polylinear.js"; +export {default as populationByLatitude} from "./population-by-latitude.js"; +export {default as populationByLongitude} from "./population-by-longitude.js"; +export {default as projectionBleedEdges} from "./projection-bleed-edges.js"; +export {default as projectionBleedEdges2} from "./projection-bleed-edges2.js"; +export {default as projectionClipAngle} from "./projection-clip-angle.js"; +export {default as projectionClipAngleFrame} from "./projection-clip-angle-frame.js"; +export {default as projectionClipBerghaus} from "./projection-clip-berghaus.js"; +export {default as projectionFitAntarctica} from "./projection-fit-antarctica.js"; +export {default as projectionFitBertin1953} from "./projection-fit-bertin1953.js"; +export {default as projectionFitConic} from "./projection-fit-conic.js"; +export {default as projectionFitIdentity} from "./projection-fit-identity.js"; +export {default as projectionFitUsAlbers} from "./projection-fit-us-albers.js"; +export {default as projectionHeightAlbers} from "./projection-height-albers.js"; +export {default as projectionHeightEqualEarth} from "./projection-height-equal-earth.js"; +export {default as projectionHeightGeometry} from "./projection-height-geometry.js"; +export {default as projectionHeightMercator} from "./projection-height-mercator.js"; +export {default as projectionHeightOrthographic} from "./projection-height-orthographic.js"; +export {default as randomBins} from "./random-bins.js"; +export {default as randomBinsXY} from "./random-bins-xy.js"; +export {default as randomQuantile} from "./random-quantile.js"; +export {default as randomWalk} from "./random-walk.js"; +export {default as rectBand} from "./rect-band.js"; +export {default as seattlePrecipitationDensity} from "./seattle-precipitation-density.js"; +export {default as seattlePrecipitationRule} from "./seattle-precipitation-rule.js"; +export {default as seattlePrecipitationSum} from "./seattle-precipitation-sum.js"; +export {default as seattleTemperatureBand} from "./seattle-temperature-band.js"; +export {default as seattleTemperatureCell} from "./seattle-temperature-cell.js"; +export {default as sfCovidDeaths} from "./sf-covid-deaths.js"; +export {default as sfTemperatureBand} from "./sf-temperature-band.js"; +export {default as sfTemperatureBandArea} from "./sf-temperature-band-area.js"; +export {default as shorthandArea} from "./shorthand-area.js"; +export {default as shorthandAreaY} from "./shorthand-areaY.js"; +export {default as shorthandBarY} from "./shorthand-barY.js"; +export {default as shorthandBinRectY} from "./shorthand-binRectY.js"; +export {default as shorthandBoxX} from "./shorthand-boxX.js"; +export {default as shorthandCell} from "./shorthand-cell.js"; +export {default as shorthandCellX} from "./shorthand-cellX.js"; +export {default as shorthandDot} from "./shorthand-dot.js"; +export {default as shorthandDotX} from "./shorthand-dotX.js"; +export {default as shorthandGroupBarY} from "./shorthand-groupBarY.js"; +export {default as shorthandLine} from "./shorthand-line.js"; +export {default as shorthandLineY} from "./shorthand-lineY.js"; +export {default as shorthandRectY} from "./shorthand-rectY.js"; +export {default as shorthandRuleX} from "./shorthand-ruleX.js"; +export {default as shorthandText} from "./shorthand-text.js"; +export {default as shorthandTextX} from "./shorthand-textX.js"; +export {default as shorthandTickX} from "./shorthand-tickX.js"; +export {default as shorthandVector} from "./shorthand-vector.js"; +export {default as shorthandVectorX} from "./shorthand-vectorX.js"; +export {default as simpsonsRatings} from "./simpsons-ratings.js"; +export {default as simpsonsRatingsDots} from "./simpsons-ratings-dots.js"; +export {default as simpsonsViews} from "./simpsons-views.js"; +export {default as singleValueBar} from "./single-value-bar.js"; +export {default as singleValueBin} from "./single-value-bin.js"; +export {default as softwareVersions} from "./software-versions.js"; +export {default as sparseCell} from "./sparse-cell.js"; +export {default as stackedBar} from "./stacked-bar.js"; +export {default as stackedRect} from "./stacked-rect.js"; +export {default as stargazers} from "./stargazers.js"; +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 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"; +export {default as travelersCovidDrop} from "./travelers-covid-drop.js"; +export {default as uniformRandomDifference} from "./uniform-random-difference.js"; +export {default as untypedDateBin} from "./untyped-date-bin.js"; +export {default as usCongressAge} from "./us-congress-age.js"; +export {default as usCongressAgeColorExplicit} from "./us-congress-age-color-explicit.js"; +export {default as usCongressAgeGender} from "./us-congress-age-gender.js"; +export {default as usCongressAgeSymbolExplicit} from "./us-congress-age-symbol-explicit.js"; +export {default as usCountyChoropleth} from "./us-county-choropleth.js"; +export {default as usCountySpikes} from "./us-county-spikes.js"; +export {default as usPopulationStateAge} from "./us-population-state-age.js"; +export {default as usPopulationStateAgeDots} from "./us-population-state-age-dots.js"; +export {default as usPresidentFavorabilityDots} from "./us-president-favorability-dots.js"; +export {default as usPresidentGallery} from "./us-president-gallery.js"; +export {default as usPresidentialElection2020} from "./us-presidential-election-2020.js"; +export {default as usPresidentialElectionMap2020} from "./us-presidential-election-map-2020.js"; +export {default as usPresidentialForecast2016} from "./us-presidential-forecast-2016.js"; +export {default as usRetailSales} from "./us-retail-sales.js"; +export {default as usStateCapitals} from "./us-state-capitals.js"; +export {default as usStateCapitalsVoronoi} from "./us-state-capitals-voronoi.js"; +export {default as usStatePopulationChange} from "./us-state-population-change.js"; +export {default as vectorField} from "./vector-field.js"; +export {default as vectorFrame} from "./vector-frame.js"; +export {default as walmarts} from "./walmarts.js"; +export {default as walmartsDecades} from "./walmarts-decades.js"; +export {default as walmartsDensity} from "./walmarts-density.js"; +export {default as walmartsDensityUnprojected} from "./walmarts-density-unprojected.js"; +export {default as wealthBritainBar} from "./wealth-britain-bar.js"; +export {default as wealthBritainProportionPlot} from "./wealth-britain-proportion-plot.js"; +export {default as wordCloud} from "./word-cloud.js"; +export {default as wordLengthMobyDick} from "./word-length-moby-dick.js"; +export {default as yearlyRequests} from "./yearly-requests.js"; +export {default as yearlyRequestsDot} from "./yearly-requests-dot.js"; +export {default as yearlyRequestsLine} from "./yearly-requests-line.js"; + +export * from "./flare-treemap.js"; +export * from "./function-contour.js"; +export * from "./heatmap.js"; +export * from "./legend-color.js"; +export * from "./legend-opacity.js"; +export * from "./legend-symbol.js"; +export * from "./raster-ca55.js"; +export * from "./raster-penguins.js"; +export * from "./raster-vapor.js"; +export * from "./raster-walmart.js"; +export * from "./volcano.js"; diff --git a/test/plots/index.ts b/test/plots/index.ts index c81803dd82..5b23b56819 100644 --- a/test/plots/index.ts +++ b/test/plots/index.ts @@ -88,6 +88,7 @@ export * from "./first-ladies.js"; export * from "./flare-cluster.js"; export * from "./flare-indent.js"; export * from "./flare-tree.js"; +export * from "./flare-treemap.js"; export * from "./football-coverage.js"; export * from "./frame.js"; export * from "./fruit-sales-date.js";