/** * SpeedDistribution — bar chart showing the distribution of speed samples * from the most recent metrics frame. */ import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, } from 'recharts' const BINS = [0, 20, 40, 60, 80, 100, 120] // km/h bucket edges function buildBins(samples) { const counts = Array(BINS.length - 1).fill(0) for (const s of samples) { for (let i = 0; i < BINS.length - 1; i++) { if (s >= BINS[i] && s < BINS[i + 1]) { counts[i]++; break } } } return counts.map((c, i) => ({ range: `${BINS[i]}–${BINS[i + 1]}`, count: c })) } export default function SpeedDistribution({ history }) { // Collect speed samples from the last 30 frames const samples = history.slice(-30).flatMap(m => m.speed_samples ?? []) const data = buildBins(samples) return (

Speed Distribution (km/h)

[v, 'vehicles']} />
) }