TanStack
Catalog

Flare analytics treemap

hierarchy

70 lines · 2 files · 1.9 kB

cases/74-recharts-treemap/example.tsx61 lines · entry
cases/74-recharts-treemap/example.tsx
import { Chart } from '@tanstack/charts/react/tooltip'
import { tooltip as exampleTooltip } from '@tanstack/charts/tooltip'

import { defineChart } from '@tanstack/charts'
import { treemap } from '@tanstack/charts/hierarchy/treemap'
import { flare } from '@charts-poc/demo-data/flare'
import { selectTreemapData } from './selection'

const colors = ['#2563eb', '#8b5cf6', '#10b981']

const rows = selectTreemapData(flare)

export const treemapDefinition = (input?: ExampleOptions) =>
  defineChart({
    marks: [
      treemap(rows, {
        id: 'treemap-cells',
        path: 'name',
        delimiter: '.',
        value: 'size',
        ratio: 4 / 3,
        round: true,
        color: (node) => node.ancestorIds.at(-1) ?? node.id,
        inset: 1,
        stroke: '#ffffff',
        strokeWidth: 1,
        label: input?.preview === true ? undefined : 'name',
        labelFill: '#ffffff',
        labelFontSize: 8,
        labelFontWeight: 600,
      }),
    ],
    color: { range: colors },
    guides: false,
    margin: 0,
  })
export interface ExampleOptions {
  width: number
  height: number
  revision: number
  preview?: boolean
}

export const exampleAriaLabel = 'Flare analytics treemap'

export const createExampleChart = (options: ExampleOptions) =>
  defineChart(treemapDefinition(options), {
    keyboard: true,
    tooltip: exampleTooltip,
  })

export const chart = createExampleChart({
  width: 640,
  height: 480,
  revision: 0,
  preview: false,
})

export default function Example() {
  return <Chart ariaLabel={exampleAriaLabel} definition={chart} height={480} />
}
cases/74-recharts-treemap/selection.ts9 lines · dependency
cases/74-recharts-treemap/selection.ts
import type { FlareRow } from '@charts-poc/demo-data/flare'

const subtree = 'flare.analytics'

export function selectTreemapData(rows: readonly FlareRow[]) {
  return rows.filter(
    (row) => row.name === subtree || row.name.startsWith(`${subtree}.`),
  )
}