Histogram
FreeThe shape of a distribution. Choosing coarser or finer bins retargets the same bars, and the median and p95 markers slide to their values.
pnpm dlx shadcn@latest add https://caliperui.site/r/histogram.json| Range | Count |
|---|---|
| 40–73 ms | 2 |
| 73–105 ms | 6 |
| 105–138 ms | 49 |
| 138–170 ms | 143 |
| 170–203 ms | 176 |
| 203–235 ms | 102 |
| 235–268 ms | 34 |
| 268–301 ms | 3 |
| 301–333 ms | 4 |
| 333–366 ms | 11 |
| 366–398 ms | 20 |
| 398–431 ms | 16 |
| 431–463 ms | 15 |
| 463–496 ms | 10 |
| 496–528 ms | 8 |
| 528–561 ms | 1 |
When to use #
Use it for
- Response times, order values, session lengths.
- Checking whether a mean hides two groups.
Skip it when
- A few categories; use the bar chart.
- Comparing several distributions; use the box plot.
Installation #
pnpm dlx shadcn@latest add https://caliperui.site/r/histogram.json
Adds its 7 files to components/ui/, each with its own stylesheet, and installs their packages. No account needed. The first part also adds Caliper UI’s tokens; import them once as in Installation.
Usage #
import { Histogram } from "@/components/ui/histogram" const latencies = Array.from({ length: 600 }, (_, i) => { const a = Math.sin(i * 12.9898) * 43758.5453; const u = a - Math.floor(a); const b = Math.sin(i * 78.233) * 12345.678; const v = b - Math.floor(b); const normal = Math.sqrt(-2 * Math.log(u || 0.5)) * Math.cos(2 * Math.PI * v); return Math.max(40, Math.round((i % 7 === 0 ? 420 : 180) + normal * (i % 7 === 0 ? 60 : 38))); }); export function HistogramDemo() { return <Histogram label="Checkout API latency, last hour" values={latencies} unit=" ms" formatValue={(v) => `${Math.round(v)}`} className="w-full" />; }
API reference #
binValues
component
No props of its own; it accepts the native props of its root element.
Histogram
component
Accessibility #
It exposes group and status semantics, with aria-label, aria-busy and aria-hidden kept in step with state. Changes that matter are announced through a live region.
No custom key handling; Tab and the native activation keys do the work.
Motion #
It declares no animation in its component source. Any transition comes from its stylesheet, which uses the duration tokens that collapse to instant under prefers-reduced-motion.