Source
76 chart lines · 2 files · 2.4 kBBenchmark harness excluded · shared/mount.ts
Gridded surface wind4,800 records · CSV · 164.0 kB
@charts-poc/demo-data/windSelection: Complete published snapshot
- longitude
- number
- latitude
- number
- u
- number
- v
- number
Remote Sensing Systems / giCentreobservablehq/plot@356f579b1d94 · revision 356f579b1d94 · test/data/wind.csv · Observable Plot repository MIT; upstream source credited · SHA-256 906a2dcf864aPinned snapshot
cases/107-polar-scatter/tanstack.ts57 lines · entry
cases/107-polar-scatter/tanstack.ts
import { defineChart } from '@tanstack/charts'
import { angleGrid, polar, radialDot, radialGrid } from '@tanstack/charts/polar'
import { scaleLinear } from 'd3-scale'
import { windDirection, windLatitudeBand, windSpeed } from './transform'
import { tanstackMount } from '../../shared/mount'
import type { ConformanceInput } from '../../types'
const angleDomain = [0, 360] as const
const radiusDomain = [0, 13] as const
const angleGridValues = [0, 45, 90, 135, 180, 225, 270, 315] as const
const radiusGridValues = [3, 6, 9, 12] as const
const dotColor = '#e11d48'
const gridColor = '#94a3b8'
const definition = (input: ConformanceInput) => {
const rows = windLatitudeBand(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: [
radialDot(rows, {
angle: windDirection,
radius: windSpeed,
r: 4.5,
fill: dotColor,
stroke: '#ffffff',
strokeWidth: 1,
}),
],
}),
],
margin: 0,
})
}
export const mount = tanstackMount(definition, 'Surface wind polar scatter', {
format: ({ datum }) =>
`${datum.latitude}°N, ${datum.longitude}°E · ${windSpeed(datum).toFixed(1)} m/s`,
})cases/107-polar-scatter/transform.ts19 lines · support
cases/107-polar-scatter/transform.ts
import { wind } from '@charts-poc/demo-data/wind'
import type { WindRow } from '@charts-poc/demo-data/wind'
const selectableLatitudeBands = [48.125, 55.125] as const
export function windLatitudeBand(revision = 0): readonly WindRow[] {
const latitude =
selectableLatitudeBands[revision % selectableLatitudeBands.length] ??
selectableLatitudeBands[0]
return wind.filter((row) => row.latitude === latitude)
}
export function windDirection(row: WindRow): number {
return (Math.atan2(row.v, row.u) * (180 / Math.PI) + 360) % 360
}
export function windSpeed(row: WindRow): number {
return Math.hypot(row.u, row.v)
}