logo

G2

  • 图表介绍
  • 文档
  • 图表示例
  • 主题
  • 周边生态
  • 所有产品antv logo arrow
  • 5.4.8
  • 📈 图表介绍
  • 弧长连接图
  • 马赛克图
  • 打包图
  • 点描法地图
  • 堆叠面积图
  • 堆叠柱状图
  • 分布曲线图
  • 分组柱状图
  • 回归曲线图
  • 茎叶图
  • 矩形树图
  • 平行坐标系
  • 气泡图
  • 色块图
  • 韦恩图
  • 小提琴图
  • 旭日图
  • 玉珏图
  • 折线图
  • 直方图
  • 柱状图
  • 带气泡的地图
  • 雷达图
  • 面积图
  • 箱形图
  • 双向柱状图
  • 饼图
  • 环图
  • 热力图
  • 分级统计地图
  • 漏斗图
  • K线图
  • 散点图
  • 南丁格尔玫瑰图
  • 仪表盘
  • 等高线图
  • 螺旋图
  • 词云图
  • 桑基图
  • 子弹图
  • 甘特图
  • 卡吉图
  • 和弦图

直方图

上一篇
折线图
下一篇
柱状图

资源

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库
WeaveFox-前端智能研发

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会
weavefoxWeaveFox-智能研发技术社区

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
weavefoxWeaveFox-前端智能研发
© Copyright 2026 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

histogram

直方图的简介

直方图,形状类似柱状图却有着与柱状图完全不同的含义。直方图牵涉统计学的概念,首先要对数据进行分组,然后统计每个分组内数据元的数量。在平面直角坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。频数分布直方图需要经过频数乘以组距的计算过程才能得出每个分组的数量,同一个直方图的组距是一个固定不变的值,所以如果直接用纵轴表示数量,每个矩形的高代表对应的数据元数量,既能保持分布状态不变,又能直观的看出每个分组的数量。本文的例子全部使用纵轴表示数量的非标准直方图绘制。

相关概念:

  • 组数:在统计数据时,我们把数据按照不同的范围分成几个组,分成的组的个数称为组数
  • 组距:每一组两个端点的差
  • 频数:分组内的数据元的数量除以组距

直方图的作用:

  • 能够显示各组频数或数量分布的情况
  • 易于显示各组之间频数或数量的差别

通过直方图还可以观察和估计哪些数据比较集中,异常或者孤立的数据分布在何处。

英文名:Histogram

如何绘制直方图

在 G2 中绘制直方图需要使用以下核心要素:

1. 使用 rect 标记

直方图需要使用 rect 标记而非 interval 标记。这是因为:

  • rect 标记支持 x 和 x1 两个通道,可以精确表示数据区间的起始和结束位置
  • 每个矩形会跨越从 x 到 x1 的区间,符合直方图的数学定义
  • interval 标记只支持单一的 x 值,柱子会对齐在刻度点上,不适合表示连续区间

2. 使用 binX 转换

binX 转换是绘制直方图的关键,它的作用是:

  • 自动将连续数值数据划分为多个区间(分箱)
  • 统计每个区间内的数据数量或其他聚合值
  • 输出每个区间的起始位置(x)和结束位置(x1)

基本用法:

.transform({
type: 'binX',
y: 'count', // 统计每个区间的数量
thresholds: 20, // 可选:指定分箱数量
})

3. 完整示例

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
autoFit: true,
});
chart.options({
type: 'rect', // 使用 rect 标记
data: {
type: 'fetch',
value: 'data.json',
},
encode: {
x: 'value', // 连续数值字段
y: 'count', // 频数
},
transform: [
{ type: 'binX', y: 'count' } // binX 转换
],
});
chart.render();

直方图的构成

频数分布直方图

basic-histogram
图表类型频数分布直方图
适合的数据列表:一个连续数据字段、一个分类字段(可选)
功能展示数据在不同区间内的分布情况
数据与图形的映射分组数据字段(统计结果)映射到横轴的位置
频数字段(统计结果)映射到矩形的高度
分类数据可以设置颜色增强分类的区分度
适合的数据条数不低于 50 条数据

非标准的直方图

density-histogram
图表类型非标准的直方图
适合的数据列表:一个连续数据字段、一个分类字段(可选)
功能展示数据在不同区间内的分布情况
数据与图形的映射分组数据字段(统计结果)映射到横轴的位置
数量字段(统计结果)映射到矩形的高度
分类数据可以设置颜色增强分类的区分度
适合的数据条数不低于 50 条数据

直方图的应用场景

适合的场景

例子 1: 数据分布的统计分析

下图是一个钻石重量分布的直方图,展示了钻石重量在不同区间的分布情况。

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
theme: 'classic',
autoFit: true,
});
chart.options({
type: 'rect',
data: {
type: 'fetch',
value: 'https://gw.alipayobjects.com/os/antvdemo/assets/data/diamond.json',
},
encode: {
x: 'carat',
y: 'count',
},
transform: [
{ type: 'binX', y: 'count' },
],
scale: {
y: { nice: true },
},
axis: {
x: { title: '钻石重量(克拉)' },
y: { title: '频数' },
},
style: {
fill: '#1890FF',
fillOpacity: 0.9,
},
});
chart.render();

说明:

  • 使用 rect 标记配合 binX 转换绘制直方图
  • binX 转换自动将 carat 字段分箱,并统计每个区间的频数
  • 每个矩形跨越一个数值区间(如 0.2-0.3, 0.3-0.4),表示数据是连续分布的

例子 2: 使用不同的分箱方式

直方图的关键是如何划分数据区间(即"分箱"),不同的分箱方式会影响对数据分布的理解。下图使用了自定义的分箱数量。

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
theme: 'classic',
autoFit: true,
});
chart.options({
type: 'rect',
data: {
type: 'fetch',
value: 'https://gw.alipayobjects.com/os/antvdemo/assets/data/diamond.json',
},
encode: {
x: 'carat',
y: 'count',
},
transform: [
{ type: 'binX', y: 'count', thresholds: 30 }, // 指定分箱数量
],
scale: {
y: { nice: true },
},
axis: {
x: { title: '钻石重量(克拉)' },
y: { title: '频数' },
},
style: {
fill: '#1890FF',
fillOpacity: 0.9,
},
});
chart.render();

说明:

  • 使用 transform: { type: 'binX', thresholds: 30 } 指定分箱数量为 30
  • 分箱数量的选择会影响分布的细节展示,较多的箱数可以显示更细致的分布情况
  • 较少的箱数则可以突出主要分布趋势

不适合的场景

例子 1: 不适合展示分类数据的比较

直方图针对的是连续型数值数据的分布,不适合用于非数值型的分类数据比较。对于分类数据的计数统计,应该使用普通柱状图。

例子 2: 不适合展示时间序列的趋势

直方图侧重于展示数据的分布特征,而非随时间变化的趋势。如果需要展示数据随时间的变化趋势,应使用折线图或面积图等时序图表。

直方图的扩展

多分布直方图

多分布直方图可以在同一坐标系中展示多个数据集的分布情况,便于比较不同数据集的分布特征。

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
theme: 'classic',
autoFit: true,
});
chart.options({
type: 'rect',
data: {
type: 'fetch',
value: 'https://gw.alipayobjects.com/os/antvdemo/assets/data/diamond.json',
transform: [
{
type: 'map',
callback: (d) => ({
...d,
group: d.cut === 'Ideal' ? 'Ideal' : 'Others',
}),
},
],
},
encode: {
x: 'price',
y: 'count',
color: 'group',
},
transform: [
{ type: 'binX', y: 'count', thresholds: 30, groupBy: ['group'] },
],
scale: {
y: { nice: true },
color: { range: ['#1890FF', '#FF6B3B'] },
},
axis: {
x: { title: '价格(美元)' },
y: { title: '频数' },
},
style: {
fillOpacity: 0.7,
},
legend: true,
});
chart.render();

说明:

  • 通过 color: 'group' 和 groupBy: ['group'] 实现多分布的对比
  • 使用不同颜色和透明度,便于观察不同组别的数据分布差异

直方图与其他图表的对比

直方图和柱状图

  • 直方图用于展示连续型数值数据的分布,强调数据分布形态
  • 柱状图用于比较不同类别或时间点的数值大小,强调类别间数值对比
  • 直方图的条形间无间隔,柱状图的柱子间有间隔

直方图和箱型图

  • 直方图通过频数分布展示数据集中趋势和离散程度
  • 箱型图通过四分位数展示数据的集中和离散情况,更便于识别异常值
  • 直方图提供更详细的分布形态,箱型图则提供更简洁的统计概括

直方图和折线图、面积图

  • 直方图侧重于展示数据的分布状况和形态特征
  • 折线图和面积图侧重于展示数据随时间的变化趋势
  • 直方图适合单一时间点的数据分析,折线图和面积图适合多时间点的连续数据分析

相似图表

折线图
折线图
趋势类
时间类
柱状图
柱状图
比较类
面积图
面积图
趋势类
箱形图
箱形图
分布类
比较类

分类

比较类
分布类