62 lines · 1 file · 1.7 kB
cases/53-log-scale-scatter/example.tsx62 lines · entry
cases/53-log-scale-scatter/example.tsx
import { Chart } from '@tanstack/charts/react/tooltip'
import { tooltip as exampleTooltip } from '@tanstack/charts/tooltip'
import { flare } from '@tanstack/charts-data/flare'
import { defineChart, dot } from '@tanstack/charts'
import { scaleLinear, scaleLog } from 'd3-scale'
import type { FlareRow } from '@tanstack/charts-data/flare'
type SizedFlareRow = FlareRow & { readonly size: number }
function logScaleRows(input: ChartOptions) {
return flare
.filter((row): row is SizedFlareRow => row.size !== null && row.size > 0)
.slice(input.revision * 8, input.revision * 8 + 200)
}
export const createExampleChart = (input: ChartOptions) => {
const rows = logScaleRows(input)
return defineChart(
{
marks: [
dot(rows, {
id: 'class-size-points',
x: 'size',
y: (row) => row.name.split('.').length - 1,
key: 'name',
r: 3.5,
fill: '#f97316',
stroke: '#9a3412',
strokeWidth: 0.75,
}),
],
margin: {
top: 16,
right: 20,
bottom: 40,
left: 50,
},
x: {
scale: scaleLog().domain([200, 30_000]),
grid: true,
axis: { label: 'Class size' },
},
y: { scale: scaleLinear, grid: true, axis: { label: 'Hierarchy depth' } },
},
{ keyboard: true, tooltip: exampleTooltip },
)
}
export interface ChartOptions {
revision: number
}
export const exampleAriaLabel = 'Flare class size on a logarithmic scale'
export const chart = createExampleChart({
revision: 0,
})
export default function Example() {
return <Chart ariaLabel={exampleAriaLabel} definition={chart} height={480} />
}