TanStack
Catalog

Seattle daily high-temperature polar line

polar

TanStack

TanStack source

83 chart lines · 2 files · 2.4 kBBenchmark harness excluded · shared/mount.ts

Seattle weather observations2,922 records · CSV · 121.4 kB
@charts-poc/demo-data/weather

Selection: Complete published snapshot

location
string
date
Date
precipitation
number
temp_max
number
temp_min
number
wind
number
weather
string

NOAA / Vega@observablehq/sample-datasets@1.0.1 · revision 732c0148de74 · weather.csv · ISC distribution; upstream source credited · SHA-256 27219f1ca8dbPinned snapshot

cases/106-polar-line/tanstack.ts64 lines · entry
cases/106-polar-line/tanstack.ts
import { defineChart } from '@tanstack/charts'
import {
  angleGrid,
  polar,
  radialGrid,
  radialLine,
} from '@tanstack/charts/polar'
import { scaleLinear } from 'd3-scale'
import { dayOfYearAngle, seattleWeatherYear } from './transform'
import { tanstackMount } from '../../shared/mount'
import type { ConformanceInput } from '../../types'

const angleDomain = [0, 360] as const
const radiusDomain = [-10, 40] as const
const angleGridValues = [0, 45, 90, 135, 180, 225, 270, 315] as const
const radiusGridValues = [0, 10, 20, 30, 40] as const
const lineColor = '#0f766e'
const gridColor = '#94a3b8'

const definition = (input: ConformanceInput) => {
  const rows = seattleWeatherYear(input.revision)

  return defineChart({
    marks: [
      polar({
        radiusRatio: 0.72,
        angle: { scale: scaleLinear().domain(angleDomain) },
        radius: { scale: scaleLinear().domain(radiusDomain) },
        guides: [
          radialGrid({
            values: radiusGridValues,
            labels: false,
            stroke: gridColor,
            strokeOpacity: 0.35,
          }),
          angleGrid({
            values: angleGridValues,
            labels: false,
            stroke: gridColor,
            strokeOpacity: 0.35,
          }),
        ],
        marks: [
          radialLine(rows, {
            angle: dayOfYearAngle,
            radius: 'temp_max',
            stroke: lineColor,
            strokeWidth: 2.5,
          }),
        ],
      }),
    ],
    margin: 0,
  })
}

export const mount = tanstackMount(
  definition,
  'Seattle daily high-temperature polar line',
  {
    format: ({ datum }) =>
      `${datum.date.toISOString().slice(0, 10)} · ${datum.temp_max}°C high`,
  },
)
cases/106-polar-line/transform.ts19 lines · support
cases/106-polar-line/transform.ts
import { weather } from '@charts-poc/demo-data/weather'
import type { WeatherRow } from '@charts-poc/demo-data/weather'

const selectableYears = [2012, 2013] as const

export function seattleWeatherYear(revision = 0): readonly WeatherRow[] {
  const year =
    selectableYears[revision % selectableYears.length] ?? selectableYears[0]
  return weather.filter(
    (row) => row.location === 'Seattle' && row.date.getUTCFullYear() === year,
  )
}

export function dayOfYearAngle(row: WeatherRow): number {
  const year = row.date.getUTCFullYear()
  const yearStart = Date.UTC(year, 0, 1)
  const nextYear = Date.UTC(year + 1, 0, 1)
  return ((row.date.getTime() - yearStart) / (nextYear - yearStart)) * 360
}