TanStack
Catalog

Empirical cumulative distribution

distribution

76 lines · 1 file · 2.1 kB

cases/50-empirical-cdf/example.tsx76 lines · entry
cases/50-empirical-cdf/example.tsx
import { Chart } from '@tanstack/charts/react/tooltip'
import { tooltip as exampleTooltip } from '@tanstack/charts/tooltip'

import { cars } from '@tanstack/charts-data/cars'
import { d3Curve, defineChart, lineY, rank } from '@tanstack/charts'
import { scaleLinear } from 'd3-scale'
import { curveStepAfter } from 'd3-shape'
import type { CarsRow } from '@tanstack/charts-data/cars'

type CarWithEconomy = CarsRow & { 'economy (mpg)': number }

const completeCars = cars.filter(
  (row): row is CarWithEconomy => row['economy (mpg)'] !== null,
)

const percent = new Intl.NumberFormat('en-US', {
  style: 'percent',
  maximumFractionDigits: 0,
})

export const createExampleChart = (input: ChartOptions) => {
  const source = completeCars
    .slice(input.revision * 8)
    .sort((left, right) => left['economy (mpg)'] - right['economy (mpg)'])
  const ranked = rank(source, { value: 'economy (mpg)', order: 'ascending' })
  const fullRows = ranked.map((row) => ({
    ...row,
    probability: row.rank / source.length,
  }))
  const rows = fullRows

  return defineChart(
    {
      marks: [
        lineY(rows, {
          id: 'empirical-cdf',
          key: (row) => `${row.name}:${row.year}`,
          x: 'economy (mpg)',
          y: 'probability',
          curve: d3Curve(curveStepAfter),
          stroke: '#2563eb',
          strokeWidth: 2,
        }),
      ],
      scales: {
        x: {
          scale: scaleLinear,
          grid: true,
          axis: { label: 'Fuel economy (mpg)' },
        },
        y: {
          scale: scaleLinear().domain([0, 1]),
          grid: true,
          axis: {
            ticks: { format: (value) => percent.format(value) },
            label: 'Cumulative proportion',
          },
        },
      },
    },
    { keyboard: true, tooltip: exampleTooltip },
  )
}
export interface ChartOptions {
  revision: number
}

export const exampleAriaLabel = 'Empirical cumulative distribution'

export const chart = createExampleChart({
  revision: 0,
})

export default function Example() {
  return <Chart ariaLabel={exampleAriaLabel} definition={chart} height={480} />
}