Getting Started
Charts
- Charts
- Line Chart
- Bar Chart
- Area Chart
- Scatter Chart
- Pie Chart
- Donut Chart
- Dot Plot Chart
- Lollipop Chart
- Dumbbell Chart
- Slope Chart
- Range Chart
- Histogram Chart
- Box Plot Chart
- Violin Chart
- Polar Chart
- Parallel Coordinates
- SPLOM Chart
- Parcats Chart
- Candlestick Chart
- OHLC Chart
- Waterfall Chart
- Funnel Chart
- Heatmap Chart
- Contour Chart
- Density Chart
- Ternary Chart
- Radar Chart
- Treemap Chart
- Sunburst Chart
- Sankey Chart
- Gauge Chart
- Bullet Chart
- Icicle Chart
- Network Graph
- Dendrogram
- Choropleth Chart
"use client"
import { HistogramChart } from "@/components/ui/charts"
// Generate normal distribution data using Box-Muller transform
function generateNormalData(n: number, mean: number, stdDev: number): number[] {
const data: number[] = []
for (let i = 0; i < n; i += 2) {
const u1 = Math.random()
const u2 = Math.random()
const z0 = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2)
const z1 = Math.sqrt(-2 * Math.log(u1)) * Math.sin(2 * Math.PI * u2)
data.push(mean + z0 * stdDev)
if (i + 1 < n) data.push(mean + z1 * stdDev)
}
return data
}
// Generate sample normal distribution
const normalData = generateNormalData(1000, 50, 15)
export function HistogramChartDemo() {
return (
<div className="w-full max-w-3xl">
<HistogramChart
data={normalData}
bins={40}
showBorder
xAxisLabel="Value"
yAxisLabel="Frequency"
/>
</div>
)
}
About
The Histogram Chart displays the distribution of numerical data by grouping values into bins. Supports multiple datasets and various visual styles.
Installation
pnpm dlx shadcn@latest add https://ui.simplifyingai.com/r/histogram-chart.json
Variants
Default
Classic histogram with solid bars and optional border stroke.
Overlay
Multiple datasets displayed with transparency, overlapping to show distribution comparison.
"use client"
import { HistogramChart } from "@/components/ui/charts"
// Generate normal distribution data
function generateNormalData(n: number, mean: number, stdDev: number): number[] {
const data: number[] = []
for (let i = 0; i < n; i += 2) {
const u1 = Math.random()
const u2 = Math.random()
const z0 = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2)
const z1 = Math.sqrt(-2 * Math.log(u1)) * Math.sin(2 * Math.PI * u2)
data.push(mean + z0 * stdDev)
if (i + 1 < n) data.push(mean + z1 * stdDev)
}
return data
}
// Two overlapping distributions
const dataset1 = generateNormalData(800, 35, 12)
const dataset2 = generateNormalData(800, 65, 14)
export function HistogramChartOverlayDemo() {
return (
<div className="w-full max-w-3xl">
<HistogramChart
data={[
{ data: dataset1, label: "Dataset 1", color: "#3b82f6" },
{ data: dataset2, label: "Dataset 2", color: "#8b5cf6" },
]}
variant="overlay"
bins={35}
xAxisLabel="Value"
yAxisLabel="Frequency"
showBorder
/>
</div>
)
}
Gradient
Each bar colored based on position using a color scale (viridis, plasma, warm, cool, rainbow).
"use client"
import { HistogramChart } from "@/components/ui/charts"
// Generate normal distribution data
function generateNormalData(n: number, mean: number, stdDev: number): number[] {
const data: number[] = []
for (let i = 0; i < n; i += 2) {
const u1 = Math.random()
const u2 = Math.random()
const z0 = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2)
const z1 = Math.sqrt(-2 * Math.log(u1)) * Math.sin(2 * Math.PI * u2)
data.push(mean + z0 * stdDev)
if (i + 1 < n) data.push(mean + z1 * stdDev)
}
return data
}
const normalData = generateNormalData(1000, 50, 15)
export function HistogramChartGradientDemo() {
return (
<div className="w-full max-w-3xl">
<HistogramChart
data={normalData}
variant="gradient"
colorScale="viridis"
bins={40}
showBorder={false}
xAxisLabel="Value"
yAxisLabel="Frequency"
/>
</div>
)
}
Stepped
Area/stepped histogram style with semi-transparent fill, ideal for comparing multiple distributions.
"use client"
import { HistogramChart } from "@/components/ui/charts"
// Generate normal distribution data
function generateNormalData(n: number, mean: number, stdDev: number): number[] {
const data: number[] = []
for (let i = 0; i < n; i += 2) {
const u1 = Math.random()
const u2 = Math.random()
const z0 = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2)
const z1 = Math.sqrt(-2 * Math.log(u1)) * Math.sin(2 * Math.PI * u2)
data.push(mean + z0 * stdDev)
if (i + 1 < n) data.push(mean + z1 * stdDev)
}
return data
}
// Three overlapping distributions
const dataset1 = generateNormalData(600, 30, 10)
const dataset2 = generateNormalData(600, 50, 12)
const dataset3 = generateNormalData(600, 70, 11)
export function HistogramChartSteppedDemo() {
return (
<div className="w-full max-w-3xl">
<HistogramChart
data={[
{ data: dataset1, label: "Group A", color: "#3b82f6" },
{ data: dataset2, label: "Group B", color: "#8b5cf6" },
{ data: dataset3, label: "Group C", color: "#06b6d4" },
]}
variant="stepped"
bins={40}
fillOpacity={0.35}
xAxisLabel="Value"
yAxisLabel="Frequency"
/>
</div>
)
}
Usage
Single Dataset
import { HistogramChart } from "@/components/ui/charts"
const data = [12, 15, 18, 22, 25, 28, 30, 32, 35, 38, 40, 42, 45]
export function Example() {
return <HistogramChart data={data} bins={20} color="#4285f4" showBorder />
}Multiple Datasets
import { HistogramChart } from "@/components/ui/charts"
const datasets = [
{ data: dataset1, label: "Group A", color: "#00bcd4" },
{ data: dataset2, label: "Group B", color: "#9c27b0" },
]
export function OverlayExample() {
return <HistogramChart data={datasets} variant="overlay" bins={30} />
}Gradient Colors
import { HistogramChart } from "@/components/ui/charts"
export function GradientExample() {
return (
<HistogramChart
data={data}
variant="gradient"
colorScale="viridis"
bins={40}
/>
)
}API Reference
| Prop | Type | Default | Description |
|---|---|---|---|
| data | number[] or HistogramDataset[] | required | Single or multiple datasets |
| variant | "default" "overlay" "gradient" "stepped" | "default" | Display style |
| bins | number | 30 | Number of histogram bins |
| color | string | - | Bar color (single dataset) |
| colorScale | "viridis" "plasma" "warm" "cool" "rainbow" | "viridis" | Color scale for gradient |
| showBorder | boolean | true | Show bar border stroke |
| borderColor | string | - | Border color (defaults to fill) |
| cornerRadius | number | 0 | Bar corner radius |
| fillOpacity | number | varies | Fill opacity (auto by variant) |
| normalized | boolean | false | Show percentages |
| showDensity | boolean | false | Show density values |
| showLegend | boolean | true | Show legend for multi-dataset |
| barPadding | number | 1 | Padding between bars |
Data Types
HistogramDataset
interface HistogramDataset {
data: number[]
label?: string
color?: string
}Notes
- The histogram chart automatically calculates bin ranges based on the data distribution
- The default variant displays solid bars with optional border strokes
- The overlay variant uses transparency to allow comparison of multiple distributions
- The gradient variant applies color scales (viridis, plasma, warm, cool, rainbow) to bars based on position
- The stepped variant creates an area/line style histogram with semi-transparent fill
- Bin count can be customized to control the granularity of the distribution display
- The normalized option displays percentages instead of raw frequencies
- The showDensity option displays probability density values for statistical analysis
- Multiple datasets are automatically handled with legends when provided as an array
- Corner radius can be applied to bars for a softer, more modern appearance
- Bar padding controls the spacing between adjacent bars in the histogram
- Custom colors can be specified per dataset for multi-dataset comparisons
Ask Your Database Anything with ChatPlotDB
Connect your database, ask questions in plain English, and get answers as charts, tables, and dashboards. No SQL required.
Join the ChatPlotDB waitlist